/ Hex Artifact Content
Login

Artifact 814268d5bbd69f30069867142f1d460b8b7ab778:


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 37  : pager.c,v 1.27
0350: 37 20 32 30 30 36 2f 31 32 2f 31 38 20 31 38 3a  7 2006/12/18 18:
0360: 33 34 3a 35 31 20 64 72 68 20 45 78 70 20 24 0a  34:51 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 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  tf.#define TRACE
0460: 31 28 58 29 20 20 20 20 20 20 20 73 71 6c 69 74  1(X)       sqlit
0470: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 29  e3DebugPrintf(X)
0480: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32 28  .#define TRACE2(
0490: 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33  X,Y)     sqlite3
04a0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29  DebugPrintf(X,Y)
04b0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
04c0: 58 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33  X,Y,Z)   sqlite3
04d0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04e0: 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Z).#define TRACE
04f0: 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74  4(X,Y,Z,W) sqlit
0500: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
0510: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0520: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
0530: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0540: 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23  ntf(X,Y,Z,W,V).#
0550: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
0560: 43 45 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54  CE1(X).#define T
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  ne TRACE3(X,Y,Z)
0590: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
05a0: 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65  X,Y,Z,W).#define
05b0: 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c   TRACE5(X,Y,Z,W,
05c0: 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  V).#endif../*.**
05d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
05e0: 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73  wo macros are us
05f0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 54 52  ed within the TR
0600: 41 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62  ACEX() macros ab
0610: 6f 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20  ove.** to print 
0620: 6f 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70  out file-descrip
0630: 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47  tors. .**.** PAG
0640: 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70  ERID() takes a p
0650: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
0660: 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  r struct as it's
0670: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a   argument. The.*
0680: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  * associated fil
0690: 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e-descriptor is 
06a0: 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41  returned. FILEHA
06b0: 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61  NDLEID() takes a
06c0: 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75  n OsFile.** stru
06d0: 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d  ct as it's argum
06e0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
06f0: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0700: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0710: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0720: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0730: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0740: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0750: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0760: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0770: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0780: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
0790: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07a0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07b0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07c0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
07e0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07f0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0800: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0820: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0830: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0840: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0870: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0880: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0890: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08a0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08d0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
08e0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0910: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0920: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0930: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0940: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0950: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0960: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0970: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
0980: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
0990: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09a0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09c0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09d0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
09e0: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
09f0: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a20: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a30: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a40: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a70: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0a80: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0a90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0aa0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ab0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ac0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0ad0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0af0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b00: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b10: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b20: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b50: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b60: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b70: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0b80: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0ba0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bb0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0bc0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0bf0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c00: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c10: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c20: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c30: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c40: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c60: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c70: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0c80: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cb0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0cc0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cd0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0cf0: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d00: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d10: 72 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20  remove the.**   
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
0d40: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
0d50: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e        committed.
0d80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0d90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0da0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0db0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0dc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  a.** sqlite3page
0dd0: 72 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20  r_get() occurs, 
0de0: 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69  the state transi
0df0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53  tions to PAGER_S
0e00: 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20  HARED..** After 
0e10: 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62  all pages have b
0e20: 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69  een released usi
0e30: 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75  ng sqlite_page_u
0e40: 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73  nref(),.** the s
0e50: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e60: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55   back to PAGER_U
0e70: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0e80: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73  t time.** that s
0e90: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
0ea0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  e() is called, t
0eb0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0ec0: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52  ions to.** PAGER
0ed0: 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74  _RESERVED.  (Not
0ee0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61  e that sqlite_pa
0ef0: 67 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f  ge_write() can o
0f00: 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64  nly be.** called
0f10: 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   on an outstandi
0f20: 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65  ng page which me
0f30: 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
0f40: 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e  er must.** be in
0f50: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65   PAGER_SHARED be
0f60: 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69  fore it transiti
0f70: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53  ons to PAGER_RES
0f80: 45 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74  ERVED.).** The t
0f90: 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47  ransition to PAG
0fa0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63  ER_EXCLUSIVE occ
0fb0: 75 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20  urs when before 
0fc0: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
0fd0: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
0fe0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41  atabase file.  A
0ff0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70  fter an sqlite3p
1000: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a  ager_rollback().
1010: 2a 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67  ** or sqlite_pag
1020: 65 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65  er_commit(), the
1030: 20 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b   state goes back
1040: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1050: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1060: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
1080: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
1090: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
10a0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
10b0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
10c0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
10d0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
10e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
10f0: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1100: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1110: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1120: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1130: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1140: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1150: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1160: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1170: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
1180: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
1190: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
11a0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
11b0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
11c0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
11d0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
11e0: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
11f0: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1200: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1210: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1220: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1230: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1240: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1250: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1260: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1270: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
1280: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
1290: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
12a0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
12b0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
12c0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
12d0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
12e0: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
12f0: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1300: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1310: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1320: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1330: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1340: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1350: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1360: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1370: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
1380: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
1390: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
13a0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
13b0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
13c0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
13d0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
13e0: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
13f0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1400: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1420: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1430: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1440: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1450: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1460: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1470: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
1480: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
1490: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
14a0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
14b0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
14c0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
14d0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
14e0: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
14f0: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1500: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1510: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1520: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1530: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1540: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1550: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1560: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1570: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
1580: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
1590: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
15a0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
15b0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
15c0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
15d0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
15e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
15f0: 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20  ite() on a page 
1600: 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a  prior to making.
1610: 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ** any modificat
1620: 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67  ions to that pag
1630: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  e.  The first ti
1640: 6d 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  me sqlite3pager_
1650: 77 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61  write().** is ca
1660: 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  lled, the origin
1670: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
1680: 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1690: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
16a0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67  * journal and Pg
16b0: 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e  Hdr.inJournal an
16c0: 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  d PgHdr.needSync
16d0: 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72   are set.  Later
16e0: 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f  , once.** the jo
16f0: 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d  urnal page has m
1700: 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20  ade it onto the 
1710: 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67  disk surface, Pg
1720: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20  Hdr.needSync.** 
1730: 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65  is cleared.  The
1740: 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63   modified page c
1750: 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  annot be written
1760: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f   back into the o
1770: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1780: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  ase file until t
1790: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73  he journal pages
17a0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
17b0: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65   to disk and the
17c0: 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79  .** PgHdr.needSy
17d0: 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  nc has been clea
17e0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  red..**.** The P
17f0: 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20  gHdr.dirty flag 
1800: 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69  is set when sqli
1810: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
1820: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
1830: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
1840: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
1850: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
1860: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1870: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1880: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79  base file..*/.ty
1890: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
18a0: 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74  dr PgHdr;.struct
18b0: 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72   PgHdr {.  Pager
18c0: 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18e0: 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20   pager to which 
18f0: 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67  this page belong
1900: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
1910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1920: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1930: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
1940: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1950: 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70  r *pNextHash, *p
1960: 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61  PrevHash;  /* Ha
1970: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
1980: 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e  in for PgHdr.pgn
1990: 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  o */.  PgHdr *pN
19a0: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
19b0: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
19c0: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
19d0: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
19e0: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20  Hdr *pNextAll;  
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a00: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
1a10: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
1a20: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
1a30: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
1a40: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1a50: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1a60: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72  l */.  u8 inJour
1a70: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1a80: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1a90: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
1aa0: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
1ab0: 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20    u8 inStmt;    
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74   /* TRUE if in t
1ae0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
1af0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
1b00: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b20: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
1b30: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
1b40: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
1b50: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
1b70: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
1b80: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
1b90: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
1ba0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
1bb0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
1bc0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
1bd0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1be0: 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52  /.  short int nR
1bf0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1c00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c10: 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61  users of this pa
1c20: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
1c30: 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72  Dirty, *pPrevDir
1c40: 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20  ty;    /* Dirty 
1c50: 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  pages */.  u32 n
1c60: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1c80: 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66  fer space */.#if
1c90: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1ca0: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1cb0: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1cc0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cd0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1ce0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cf0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1d00: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1d10: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d20: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d30: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d40: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d50: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d60: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d80: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d90: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1da0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1db0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1dc0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1dd0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1de0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1df0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1e00: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1e10: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e20: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e30: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e40: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e50: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e60: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e70: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e80: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e90: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1ea0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1eb0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ec0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1ed0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ee0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ef0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1f00: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1f10: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f20: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f30: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f40: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f50: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f60: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f70: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f80: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f90: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1fa0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1fb0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fc0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fd0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fe0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1ff0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
2000: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
2010: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2020: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2030: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2040: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2050: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2060: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2070: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2080: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2090: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
20a0: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
20b0: 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66  DEC1(P,D,N,X) if
20c0: 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29  ( P->xCodec!=0 )
20d0: 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  { P->xCodec(P->p
20e0: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b  CodecArg,D,N,X);
20f0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45   }.# define CODE
2100: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
2110: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d  ar*)(P->xCodec!=
2120: 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  0?P->xCodec(P->p
2130: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a  CodecArg,D,N,X):
2140: 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  D)).#else.# defi
2150: 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c  ne CODEC1(P,D,N,
2160: 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23  X) /* NO-OP */.#
2170: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
2180: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
2190: 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  D).#endif../*.**
21a0: 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74   Convert a point
21b0: 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e  er to a PgHdr in
21c0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
21d0: 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20  its data.** and 
21e0: 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23  back again..*/.#
21f0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
2200: 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a  DATA(P)  ((void*
2210: 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66  )(&(P)[1])).#def
2220: 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  ine DATA_TO_PGHD
2230: 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a  R(D)  (&((PgHdr*
2240: 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69  )(D))[-1]).#defi
2250: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  ne PGHDR_TO_EXTR
2260: 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26  A(G,P) ((void*)&
2270: 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d  ((char*)(&(G)[1]
2280: 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65  ))[(P)->pageSize
2290: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
22a0: 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20  _TO_HIST(P,PGR) 
22b0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   \.            (
22c0: 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63  (PgHistory*)&((c
22d0: 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b  har*)(&(P)[1]))[
22e0: 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b  (PGR)->pageSize+
22f0: 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a  (PGR)->nExtra]).
2300: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
2310: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
2320: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2330: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2340: 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e  re..**.** Pager.
2350: 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73  errCode may be s
2360: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45  et to SQLITE_IOE
2370: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
2380: 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  PT, SQLITE_PROTO
2390: 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  COL.** or SQLITE
23a0: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
23b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
23c0: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
23d0: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
23e0: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
23f0: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
2400: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
2410: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
2420: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
2430: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
2440: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
2450: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
2460: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
2470: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
2480: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
2490: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
24a0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
24b0: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
24c0: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
24d0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  t the sqlite3pag
24e0: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c  er_get() and sql
24f0: 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
2500: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
2510: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2520: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2530: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
2540: 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f   {.  u8 journalO
2550: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2570: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
2580: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
2590: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
25a0: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
25b0: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
25c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
25d0: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
25e0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
25f0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
2600: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2610: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
2620: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
2630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2640: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2650: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2660: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
2670: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2680: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
26a0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
26b0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
26c0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
26d0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
26e0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
26f0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2700: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2710: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2720: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2730: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2740: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2750: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2790: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
27a0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27b0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
27c0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
27d0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
27e0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c  ness */.  u8 ful
27f0: 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20  l_fsync;        
2800: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46        /* Use F_F
2810: 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76  ULLFSYNC when av
2820: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20  ailable */.  u8 
2830: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
2850: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
2860: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2870: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
2880: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2890: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
28a0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
28b0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
28c0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
28d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
28e0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
28f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2900: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2910: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2920: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2930: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2940: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2950: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2970: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2980: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2990: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
29a0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
29b0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
29c0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
29d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
29e0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a00: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2a10: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2a20: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a40: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2a50: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2a60: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74  to jrnl */.  int
2a70: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a90: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2aa0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2ab0: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ad0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2ae0: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2af0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2b10: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2b20: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
2b30: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2b60: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2b70: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2b80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
2bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2bd0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2bf0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2c00: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2c10: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2c20: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c40: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2c50: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2c60: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2c70: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2c80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2c90: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
2ca0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
2cc0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2d20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2d30: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ges */.  int nMa
2d40: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2d50: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74       /* High wat
2d60: 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65  er mark of nPage
2d70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2da0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2db0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2df0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2e00: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2e10: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2e20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2e30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2e40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2e50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e60: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e90: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2ea0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
2eb0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ed0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ee0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ef0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2f30: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2f40: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2f50: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2f60: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2f70: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c  */.  OsFile *fd,
2f80: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
2f90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fa0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
2fb0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
2fc0: 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b  .  OsFile *stfd;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ff0: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
3000: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
3010: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
3020: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
3030: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
3040: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
3050: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
3060: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
3070: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
3080: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
30a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
30b0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
30c0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
30d0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
30e0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
3100: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
3110: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
3130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3140: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3150: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
3160: 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20   *pDirty;       
3170: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3180: 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
3190: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
31a0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
31b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
31c0: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
31d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
31e0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
31f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3200: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3210: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3220: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3230: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3250: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
3260: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
3270: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
3280: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
32a0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
32b0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
32c0: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
32d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
32e0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
32f0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3300: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3310: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3320: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3330: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3340: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3360: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
3370: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
3380: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
3390: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
33a0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
33b0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
33c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
33d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
33e0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
33f0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3400: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
3410: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
3420: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3430: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
3440: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
3450: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
3460: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
3470: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
3480: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
3490: 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  /.  void *(*xCod
34a0: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
34b0: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
34c0: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
34d0: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
34e0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3500: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
3510: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 69   xCodec() */.  i
3520: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
3530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3540: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
3550: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
3560: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3580: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
3590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
35a0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
35b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
35c0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
35d0: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
3600: 70 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74  pagers in this t
3610: 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  hread */.#endif.
3620: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  };../*.** If SQL
3630: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
3640: 6e 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ned then increme
3650: 6e 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  nt the variable 
3660: 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20  given in.** the 
3670: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64  argument.*/.#ifd
3680: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
3690: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
36a0: 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a  R(x)  x++.#else.
36b0: 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e  # define TEST_IN
36c0: 43 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(x).#endif../*
36d0: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
36e0: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
36f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3700: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
3710: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
3720: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
3730: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
3740: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
3750: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
3760: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3770: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
3780: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
3790: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
37a0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
37b0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
37c0: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
37d0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
37e0: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
37f0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3800: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
3810: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
3820: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
3830: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
3840: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
3850: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
3860: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3870: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
3880: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3890: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
38a0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
38b0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
38c0: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
38d0: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
38e0: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
38f0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3900: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
3910: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
3920: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
3930: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
3940: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3950: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
3960: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3970: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
3980: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
3990: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
39a0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
39b0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
39c0: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
39d0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
39e0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
39f0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3a00: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
3a10: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
3a20: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
3a30: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
3a40: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
3a50: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
3a60: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3a70: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3a80: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3a90: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3aa0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3ab0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3ac0: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3ad0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3ae0: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3af0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3b00: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
3b10: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
3b20: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3b30: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3b40: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3b50: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3b60: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3b70: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3b80: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3b90: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3ba0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3bb0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3bc0: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3bd0: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3be0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3bf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
3c00: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
3c10: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
3c20: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
3c30: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
3c40: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3c50: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3c60: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3c70: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3c80: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
3c90: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
3ca0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
3cb0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3cc0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3cd0: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3ce0: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
3cf0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
3d00: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
3d10: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
3d20: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
3d30: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
3d40: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
3d50: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
3d60: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
3d70: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
3d80: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
3d90: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
3da0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
3db0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
3dc0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
3dd0: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
3de0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
3df0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
3e00: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
3e10: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
3e20: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
3e30: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
3e40: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
3e50: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
3e60: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
3e70: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
3e80: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
3e90: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
3ea0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
3eb0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
3ec0: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
3ed0: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
3ee0: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
3ef0: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
3f00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
3f10: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
3f20: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
3f30: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
3f40: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
3f50: 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  /*.** The defaul
3f60: 74 20 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b  t size of a disk
3f70: 20 73 65 63 74 6f 72 0a 2a 2f 0a 23 69 66 6e 64   sector.*/.#ifnd
3f80: 65 66 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  ef PAGER_SECTOR_
3f90: 53 49 5a 45 0a 23 20 64 65 66 69 6e 65 20 50 41  SIZE.# define PA
3fa0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  GER_SECTOR_SIZE 
3fb0: 35 31 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  512.#endif../*.*
3fc0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41  * Page number PA
3fd0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e  GER_MJ_PGNO is n
3fe0: 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20  ever used in an 
3ff0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
4000: 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76  (it is.** reserv
4010: 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61  ed for working a
4020: 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f  round a windows/
4030: 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62  posix incompatib
4040: 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a  ility). It is.**
4050: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75   used in the jou
4060: 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20  rnal to signify 
4070: 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64  that the remaind
4080: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
4090: 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65  l file .** is de
40a0: 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67  voted to storing
40b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
40c0: 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61  l name - there a
40d0: 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73  re no more pages
40e0: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b   to.** roll back
40f0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66  . See comments f
4100: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  or function writ
4110: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
4120: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
4130: 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45  ./* #define PAGE
4140: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
4150: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4160: 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23  >pageSize)) */.#
4170: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4180: 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e  PGNO(x) ((PENDIN
4190: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
41a0: 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a  eSize))+1)../*.*
41b0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
41c0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
41d0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
41e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
41f0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
4200: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  647../*.** Enabl
4210: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4220: 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20  t tracking (for 
4230: 64 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a  debugging) here:
4240: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4250: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67  E_TEST.  int pag
4260: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
4270: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
4280: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
4290: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
42a0: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
42b0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
42c0: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
42d0: 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  nable ) return;.
42e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
42f0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
4300: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
4310: 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a  =%p nRef=%d\n",.
4320: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
4330: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4340: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
4350: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
4360: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
4370: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
4380: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
4390: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
43a0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
43b0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
43c0: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
43d0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
43e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
43f0: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4400: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4410: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4420: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4430: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4440: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
4450: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
4460: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
4470: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
4480: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
4490: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
44a0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
44b0: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
44c0: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
44d0: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
44e0: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
44f0: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4500: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4510: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4520: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4530: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4540: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
4550: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
4560: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
4570: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
4580: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
4590: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
45a0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
45b0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
45c0: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
45d0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
45e0: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
45f0: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4600: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4610: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4620: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4630: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4640: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
4650: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
4660: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
4670: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
4680: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
4690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
46a0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
46b0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
46c0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
46d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
46e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
46f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4700: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4710: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4720: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4730: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4740: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4750: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
4760: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
4770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4780: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
4790: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
47a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
47b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
47c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
47d0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
47e0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
47f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4800: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4810: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4820: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4830: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4840: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4850: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4860: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4870: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4880: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4890: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
48a0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
48b0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
48c0: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
48d0: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
48e0: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
48f0: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4900: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4910: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4920: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4930: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4940: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4950: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4960: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4970: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4980: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4990: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
49a0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
49b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
49c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
49d0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
49e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
49f0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4a00: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4a10: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4a20: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4a30: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4a40: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4a50: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4a60: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4a70: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4a80: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4a90: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4aa0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4ab0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4ac0: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4ad0: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4ae0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4af0: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4b00: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4b10: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4b20: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4b30: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4b40: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4b50: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4b60: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4b70: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4b80: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4b90: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4ba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4bb0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4bc0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4bd0: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4be0: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4bf0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4c00: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4c10: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4c20: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4c30: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4c40: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4c50: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4c60: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4c70: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4c80: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4c90: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4ca0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4cb0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4cc0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4cd0: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4ce0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4cf0: 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
4d00: 45 5f 50 52 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74  E_PROTOCOL,.** t
4d10: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
4d20: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c   persistent. All
4d30: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
4d40: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
4d50: 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65  ger.** will imme
4d60: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
4d70: 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f  he same error co
4d80: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
4d90: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
4da0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
4db0: 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
4dc0: 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
4dd0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
4de0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
4df0: 55 4c 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ULL || pPager->e
4e00: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
4e10: 4b 20 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20  K );.  if( .    
4e20: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
4e30: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4e40: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
4e50: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
4e60: 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63 32 3d  RUPT ||.    rc2=
4e70: 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  =SQLITE_PROTOCOL
4e80: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
4e90: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
4ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4eb0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4ec0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4ed0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4ee0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4ef0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4f00: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4f10: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4f20: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4f30: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4f50: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4f60: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4f70: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4f80: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4f90: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4fa0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4fb0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4fc0: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4fd0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4fe0: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4ff0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
5000: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
5010: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
5020: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
5030: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
5040: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
5050: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
5060: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
5070: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
5080: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
5090: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
50a0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
50b0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
50c0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
50d0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
50e0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
50f0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
5100: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
5110: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
5120: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
5130: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
5140: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
5150: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
5160: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
5170: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
5180: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
5190: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
51a0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
51b0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
51c0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
51d0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
51e0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
51f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
5200: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
5210: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
5220: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5230: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5240: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
5250: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
5260: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
5270: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5280: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5290: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
52a0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
52b0: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
52c0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
52d0: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
52e0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
52f0: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
5300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
5310: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5320: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
5330: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5340: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
5350: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5360: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5370: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5380: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
5390: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
53a0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
53b0: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
53c0: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
53d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
53e0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
53f0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
5400: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
5410: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
5420: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
5430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5440: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
5450: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
5460: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
5470: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
5480: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5490: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
54a0: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
54b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
54c0: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
54d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
54e0: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
54f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5510: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5520: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
5530: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5540: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5550: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5560: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5570: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5590: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
55a0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
55b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
55c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
55d0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
55e0: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
55f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5600: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
5610: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
5620: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
5630: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5640: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5650: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5660: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5670: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5680: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
5690: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
56a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
56b0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
56c0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
56d0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
56e0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
56f0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
5700: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
5710: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5720: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
5730: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5740: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5750: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5760: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5770: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5780: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
5790: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
57a0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
57b0: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
57c0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
57d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
57e0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
57f0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
5800: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
5810: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
5820: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
5830: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5840: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5850: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5860: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5870: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5880: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5890: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
58a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
58b0: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
58c0: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
58d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
58e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
58f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5900: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5910: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
5920: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
5930: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5940: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5950: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5960: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5970: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5980: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
5990: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
59a0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
59b0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
59c0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
59d0: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
59e0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
5a30: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5a50: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5a70: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
5a90: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
5aa0: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
5ab0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5ac0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5ad0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
5ae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5af0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
5b00: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
5b10: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
5b20: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
5b30: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5b40: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5b50: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5b60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5b70: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5b80: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
5b90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
5ba0: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
5bb0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5bc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5bd0: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
5be0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5bf0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
5c00: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
5c10: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
5c20: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
5c30: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5c40: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5c50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
5c60: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
5c70: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
5c80: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
5c90: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
5ca0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
5cb0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
5cc0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5cd0: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
5ce0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
5cf0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
5d00: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
5d10: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
5d20: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
5d30: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
5d40: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
5d50: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
5d60: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
5d70: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
5d80: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
5d90: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
5da0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
5db0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
5dc0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
5dd0: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
5de0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
5df0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
5e00: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
5e10: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
5e20: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5e30: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
5e40: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5e50: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5e60: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5e70: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5e80: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
5e90: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5ea0: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20 20  lMagic)+16];..  
5eb0: 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  int rc = seekJou
5ec0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
5ed0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5ee0: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
5ef0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
5f00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5f10: 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  f;.  if( pPager-
5f20: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
5f30: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
5f40: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
5f50: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20  r->journalHdr;. 
5f60: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
5f70: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
5f80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5f90: 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a  );..  /* FIX ME:
5fa0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73   .  **.  ** Poss
5fb0: 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72  ibly for a pager
5fc0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
5fd0: 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
5fe0: 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e  l magic should n
5ff0: 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ot.  ** be writt
6000: 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73  en until nRec is
6010: 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61   filled in as pa
6020: 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a  rt of next syncJ
6030: 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a  ournal(). .  **.
6040: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61    ** Actually ma
6050: 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  ybe the whole jo
6060: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f  urnal header sho
6070: 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75  uld be delayed u
6080: 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70  ntil that.  ** p
6090: 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75  oint. Think abou
60a0: 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d  t this..  */.  m
60b0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
60c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
60d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
60e0: 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e  ic));.  /* The n
60f0: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
6100: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
6110: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
6120: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6130: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6140: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
6150: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
6160: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
6170: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
6180: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
6190: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
61a0: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
61b0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
61c0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
61d0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
61e0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
61f0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6200: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
6210: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6220: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
6230: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6240: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6250: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6260: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
6270: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
6280: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
6290: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
62a0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
62b0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
62c0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
62d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
62e0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
62f0: 72 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 73  rSize);.  rc = s
6300: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6310: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
6320: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
6330: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6340: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6350: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6360: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
6370: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
6380: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
6390: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
63a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
63b0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
63c0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
63d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
63e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
63f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6400: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
6410: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
6420: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6430: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6440: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6450: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6460: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6470: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6480: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6490: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
64a0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
64b0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
64c0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
64d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
64e0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
64f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6500: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
6510: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
6520: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6530: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6540: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6550: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6560: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6570: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6580: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6590: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
65a0: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
65b0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
65c0: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
65d0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
65e0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
65f0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
6600: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
6610: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
6620: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
6630: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6640: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6650: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6660: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6670: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6680: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6690: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
66a0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
66b0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
66c0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
66d0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
66e0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
66f0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
6700: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
6710: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
6720: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6730: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6740: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6750: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6760: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6770: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6780: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6790: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
67a0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
67b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
67c0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
67d0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
67e0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
67f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
6800: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
6810: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
6820: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6830: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6840: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6850: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6860: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6870: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6880: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6890: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
68a0: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
68b0: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
68c0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
68d0: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
68e0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
68f0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
6900: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
6910: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6920: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
6930: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6940: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6950: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6960: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6970: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6980: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6990: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
69a0: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
69b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
69c0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
69d0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
69e0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
69f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a00: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6a10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6a20: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6a30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a40: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6a50: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6a60: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6a70: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6a80: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6a90: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6aa0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6ab0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6ac0: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6ad0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
6ae0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
6af0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
6b00: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
6b10: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
6b20: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6b30: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6b40: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6b50: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6b60: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6b70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6b80: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6b90: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6ba0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
6bb0: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
6bc0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6bd0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6be0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
6bf0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
6c00: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6c10: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6c20: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
6c30: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6c40: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6c50: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6c60: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6c70: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6c80: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6c90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6ca0: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6cb0: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6cc0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6cd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6ce0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6cf0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6d00: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6d10: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6d20: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6d30: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6d40: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6d50: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6d60: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6d70: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6d80: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6d90: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6da0: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6db0: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6dc0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6dd0: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6de0: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6df0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6e00: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6e10: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6e20: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
6e30: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
6e40: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
6e50: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
6e60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e70: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
6e80: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
6e90: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
6ea0: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
6eb0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
6ec0: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
6ed0: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
6ee0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
6ef0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
6f00: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
6f10: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
6f20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6f30: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6f40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
6f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
6f60: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
6f70: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
6f80: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
6f90: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
6fa0: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
6fb0: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
6fc0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
6fd0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6fe0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
6ff0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
7000: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
7010: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
7020: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
7030: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
7040: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
7050: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
7060: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
7070: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
7080: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
7090: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
70a0: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
70b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
70c0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
70d0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
70e0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
70f0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
7100: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
7110: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
7120: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
7130: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
7140: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
7150: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
7160: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7170: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7180: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
7190: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
71a0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
71b0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
71c0: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
71d0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
71e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
71f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7200: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
7210: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7220: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
7230: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7240: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7250: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7260: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
7270: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
7280: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
7290: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
72a0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
72b0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
72c0: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
72d0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
72e0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
72f0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
7300: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
7310: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
7320: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
7330: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7340: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7350: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7360: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
7370: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7380: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7390: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
73a0: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
73b0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
73c0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
73d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
73e0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
73f0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
7400: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
7410: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7420: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
7430: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
7440: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
7450: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
7460: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
7470: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7480: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7490: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
74a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
74b0: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
74c0: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
74d0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
74e0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
74f0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7500: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7510: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
7520: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
7530: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
7540: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
7550: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7560: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
7570: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7580: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7590: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
75a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
75b0: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
75c0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
75d0: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
75e0: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
75f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
7600: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
7610: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
7620: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
7630: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7640: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
7650: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
7660: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7670: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7680: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7690: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
76a0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
76b0: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
76c0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
76d0: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
76e0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
76f0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7700: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7710: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
7720: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
7730: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
7740: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
7750: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7760: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
7770: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7780: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7790: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
77a0: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
77b0: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
77c0: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
77d0: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
77e0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
77f0: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7800: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7810: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7820: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
7830: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7840: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7850: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7860: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7870: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7880: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  *p;.  if( pPager
7890: 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74  ->aHash==0 ) ret
78a0: 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61  urn 0;.  p = pPa
78b0: 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20  ger->aHash[pgno 
78c0: 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
78d0: 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  -1)];.  while( p
78e0: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
78f0: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7900: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
7910: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7920: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
7930: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
7940: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
7950: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
7960: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7970: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7980: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7990: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
79a0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
79b0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
79c0: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
79d0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
79e0: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
79f0: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7a00: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
7a10: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
7a20: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
7a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7a40: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
7a50: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7a60: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7a70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7a80: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
7a90: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7aa0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7ab0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7ac0: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7ad0: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7ae0: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7af0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7b00: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
7b10: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
7b20: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
7b30: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
7b40: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
7b50: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
7b60: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
7b70: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
7b80: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
7b90: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
7ba0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
7bb0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
7bc0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
7bd0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
7be0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
7bf0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  }.  sqlite3OsUnl
7c00: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
7c10: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  NO_LOCK);.  pPag
7c20: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
7c30: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
7c40: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
7c50: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
7c60: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
7c70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
7c80: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
7c90: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
7ca0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
7cb0: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
7cc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
7cd0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
7ce0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
7cf0: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
7d00: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
7d10: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a  utine releases.*
7d20: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
7d30: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
7d40: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
7d50: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
7d60: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
7d70: 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  e is deleted and
7d80: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
7d90: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
7da0: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
7db0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
7dc0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
7dd0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
7de0: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
7df0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
7e00: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
7e10: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
7e20: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
7e30: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
7e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
7e50: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
7e60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7e70: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
7e80: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
7e90: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
7ea0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
7eb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7ec0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7ed0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
7ee0: 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
7ef0: 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
7f00: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7f10: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
7f20: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
7f30: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
7f40: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
7f50: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
7f60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7f70: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
7f80: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
7f90: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50  er->jfd);.    pP
7fa0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7fb0: 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  n = 0;.    sqlit
7fc0: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
7fd0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
7fe0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
7ff0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8000: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
8010: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
8020: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
8030: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
8040: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
8050: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
8060: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8070: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
8080: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
8090: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64  edSync = 0;.#ifd
80a0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
80b0: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
80c0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
80d0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
80e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
80f0: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
8100: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
8110: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
8120: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
8130: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
8140: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8150: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
8160: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8170: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
8180: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
8190: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
81a0: 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   );.  }.  rc = s
81b0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
81c0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
81d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
81e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
81f0: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
8200: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
8210: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
8220: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
8230: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
8240: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
8250: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
8260: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 72  ger->pFirst;.  r
8270: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8280: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
8290: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
82a0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
82b0: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
82c0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
82d0: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
82e0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
82f0: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
8300: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
8310: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
8320: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
8330: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
8340: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
8350: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
8360: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
8370: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
8380: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
8390: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
83a0: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
83b0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
83c0: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
83d0: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
83e0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
83f0: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
8400: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
8410: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
8420: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
8430: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
8440: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
8450: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
8460: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
8470: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
8480: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
8490: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
84a0: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
84b0: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
84c0: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
84d0: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
84e0: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
84f0: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
8500: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
8510: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
8520: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
8530: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
8540: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
8550: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
8560: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
8570: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
8580: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
8590: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
85a0: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
85b0: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
85c0: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
85d0: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
85e0: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
85f0: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
8600: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
8610: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
8620: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
8630: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
8640: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
8650: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
8660: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
8670: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
8680: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
8690: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
86a0: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
86b0: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
86c0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
86d0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
86e0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
86f0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
8700: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
8710: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
8720: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
8730: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
8740: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
8750: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
8760: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
8770: 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
8780: 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a  ean(PgHdr*);../*
8790: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
87a0: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
87b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
87c0: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
87d0: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
87e0: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
87f0: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
8800: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
8810: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
8820: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
8830: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
8840: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
8850: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
8860: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
8870: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
8880: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
8890: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
88a0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
88b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
88c0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
88d0: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
88e0: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
88f0: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
8900: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
8910: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8930: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
8940: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
8950: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
8980: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
8990: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
89a0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
89b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
89c0: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
89d0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
89e0: 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51  */.  u8 aData[SQ
89f0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8a00: 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74  ZE];  /* Temp st
8a10: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
8a20: 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73   */..  /* useCks
8a30: 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  um should be tru
8a40: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a  e for the main j
8a50: 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65  ournal and false
8a60: 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d   for.  ** statem
8a70: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56  ent journals.  V
8a80: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
8a90: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
8aa0: 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  se.  */.  assert
8ab0: 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73  ( jfd == (useCks
8ac0: 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  um ? pPager->jfd
8ad0: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
8ae0: 20 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61   );...  rc = rea
8af0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
8b00: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
8b10: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8b20: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
8b30: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
8b40: 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  &aData, pPager->
8b50: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28  pageSize);.  if(
8b60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8b70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
8b80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8b90: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
8ba0: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
8bb0: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
8bc0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
8bd0: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
8be0: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
8bf0: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
8c00: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
8c10: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
8c20: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
8c30: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
8c40: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
8c50: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
8c60: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
8c70: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
8c80: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
8c90: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
8ca0: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
8cb0: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
8cc0: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
8cd0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
8ce0: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
8cf0: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
8d00: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
8d10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8d20: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
8d30: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
8d40: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
8d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8d60: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
8d70: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
8d80: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
8d90: 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  d, &cksum);.    
8da0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
8db0: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
8dc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
8dd0: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
8de0: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
8df0: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
8e00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8e10: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
8e20: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
8e30: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
8e40: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
8e50: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
8e60: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
8e70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
8e80: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
8e90: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
8ea0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
8eb0: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
8ec0: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
8ed0: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
8ee0: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
8ef0: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
8f00: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
8f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
8f20: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
8f30: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
8f40: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
8f50: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
8f60: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
8f70: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
8f80: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
8f90: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
8fa0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
8fb0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
8fc0: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
8fd0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
8fe0: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
8ff0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9000: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
9010: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
9020: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
9030: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
9040: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
9050: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
9060: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
9070: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
9080: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
9090: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
90a0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
90b0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
90c0: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
90d0: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
90e0: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
90f0: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
9100: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
9110: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
9120: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
9130: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
9140: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
9150: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
9160: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
9170: 74 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61  ts are in the ma
9180: 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
9190: 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
91a0: 77 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20  wise, if a full 
91b0: 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20  ROLLBACK occurs 
91c0: 61 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d  after the statem
91d0: 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
91e0: 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42  k the full ROLLB
91f0: 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73  ACK will not res
9200: 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f  tore the page to
9210: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
9220: 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f  ** content.  Two
9230: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
9240: 20 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77   be met before w
9250: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
9260: 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
9270: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
9280: 61 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b  ase must be lock
9290: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
92a0: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
92b0: 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e  al.  ** page con
92c0: 74 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d  tent is in the m
92d0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
92e0: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
92f0: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20  age is not in.  
9300: 2a 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  ** cache or else
9310: 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73   it is marked as
9320: 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
9330: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
9340: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
9350: 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
9360: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9370: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9380: 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54  || pPg!=0 );.  T
9390: 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20  RACE3("PLAYBACK 
93a0: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
93b0: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
93c0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
93d0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
93e0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
93f0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
9400: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
9410: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9420: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
9430: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
9440: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9450: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9460: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9470: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9480: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
9490: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
94a0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
94b0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  }.    if( pPg ){
94c0: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
94d0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
94e0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
94f0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
9500: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
9510: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
9520: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
9530: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
9540: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
9550: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
9560: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
9570: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
9580: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
9590: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
95a0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
95b0: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
95c0: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
95d0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
95e0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
95f0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
9600: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
9610: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  * sqlite3pager_r
9620: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
9630: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
9640: 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  a;.    /* assert
9650: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
9660: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
9670: 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d  ; */.    pData =
9680: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
9690: 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Pg);.    memcpy(
96a0: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
96b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
96c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
96d0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20  >xDestructor ){ 
96e0: 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53   /*** FIX ME:  S
96f0: 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52  hould this be xR
9700: 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20  einit? ***/.    
9710: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
9720: 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61  uctor(pData, pPa
9730: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9740: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
9750: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
9760: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
9770: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
9780: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
9790: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
97a0: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
97b0: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
97c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
97d0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
97e0: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
97f0: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
9800: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
9810: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
9820: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
9830: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
9840: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
9850: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
9860: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
9870: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
9880: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
9890: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
98a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
98b0: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
98c0: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
98d0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
98e0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
98f0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
9900: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
9910: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
9920: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
9930: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
9940: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
9950: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
9960: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
9970: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
9980: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
9990: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
99a0: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
99b0: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
99c0: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
99d0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
99e0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
99f0: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
9a00: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
9a10: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
9a20: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
9a30: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69  open = 0;.  OsFi
9a40: 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a  le *master = 0;.
9a50: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
9a60: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
9a70: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
9a80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
9a90: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
9aa0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
9ab0: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
9ac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
9ad0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
9ae0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9af0: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
9b00: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
9b10: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
9b20: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
9b30: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
9b40: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
9b50: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
9b60: 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ce..  */.  rc = 
9b70: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
9b80: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
9b90: 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  master);.  if( r
9ba0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9bb0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9bc0: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
9bd0: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
9be0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d  ite3OsFileSize(m
9bf0: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
9c00: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
9c10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9c20: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9c30: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
9c40: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
9c50: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
9c60: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
9c70: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
9c80: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
9c90: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
9ca0: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
9cb0: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
9cc0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
9cd0: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
9ce0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
9cf0: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
9d00: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
9d10: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
9d20: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
9d30: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9d40: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
9d50: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
9d60: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9d70: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9d80: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
9d90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9da0: 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a  OsRead(master, z
9db0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
9dc0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9dd0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9de0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
9df0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
9e00: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
9e10: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
9e20: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
9e30: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
9e40: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
9e50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9e60: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
9e70: 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  (zJournal) ){.  
9e80: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
9e90: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
9ea0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
9eb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
9ec0: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
9ed0: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
9ee0: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
9ef0: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
9f00: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
9f10: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
9f20: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
9f30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9f40: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
9f50: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46    */.        OsF
9f60: 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30  ile *journal = 0
9f70: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  ;.        int c;
9f80: 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
9f90: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
9fa0: 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26  Only(zJournal, &
9fb0: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
9fc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9fd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
9fe0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9ff0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
a000: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
a010: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a  dMasterJournal(j
a020: 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72  ournal, &zMaster
a030: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
a040: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f  lite3OsClose(&jo
a050: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
a060: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a070: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
a080: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a090: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
a0a0: 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
a0b0: 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d  rPtr!=0 && strcm
a0c0: 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
a0d0: 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
a0e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
a0f0: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
a100: 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
a110: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
a120: 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
a130: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
a140: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
a150: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
a160: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a170: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a180: 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
a190: 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a  al += (strlen(zJ
a1a0: 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
a1b0: 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74  }.  }.  .  sqlit
a1c0: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74  e3OsDelete(zMast
a1d0: 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f  er);..delmaster_
a1e0: 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
a1f0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
a200: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
a210: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
a220: 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f    .  if( master_
a230: 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  open ){.    sqli
a240: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
a250: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
a260: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
a270: 61 6b 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ake every page i
a280: 6e 20 74 68 65 20 63 61 63 68 65 20 61 67 72 65  n the cache agre
a290: 65 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f  e with what is o
a2a0: 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65  n disk.  In othe
a2b0: 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65  r words,.** rere
a2c0: 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72  ad the disk to r
a2d0: 65 73 65 74 20 74 68 65 20 73 74 61 74 65 20 6f  eset the state o
a2e0: 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  f the cache..**.
a2f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a300: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
a310: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68  a rollback in wh
a320: 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ich some of the 
a330: 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70  dirty cache.** p
a340: 61 67 65 73 20 68 61 64 20 6e 65 76 65 72 20 62  ages had never b
a350: 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20  een written out 
a360: 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65  to disk.  We nee
a370: 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
a380: 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74  he.** cache cont
a390: 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73 69  ent and the easi
a3a0: 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68  est way to do th
a3b0: 61 74 20 69 73 20 74 6f 20 72 65 72 65 61 64 20  at is to reread 
a3c0: 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a  the old content.
a3d0: 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ** back from the
a3e0: 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
a3f0: 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61   int pager_reloa
a400: 64 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  d_cache(Pager *p
a410: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
a420: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
a430: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f   SQLITE_OK;.  fo
a440: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
a450: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
a460: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
a470: 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c 49 54   char zBuf[SQLIT
a480: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d  E_MAX_PAGE_SIZE]
a490: 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  ;.    if( !pPg->
a4a0: 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65  dirty ) continue
a4b0: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70  ;.    if( (int)p
a4c0: 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
a4d0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
a4e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a4f0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
a500: 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70  r->fd, pPager->p
a510: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50  ageSize*(i64)(pP
a520: 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20  g->pgno-1));.   
a530: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a540: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a550: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
a560: 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  ad(pPager->fd, z
a570: 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
a580: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
a590: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 45        TRACE3("RE
a5a0: 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
a5b0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
a5c0: 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
a5d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
a5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f   break;.      CO
a5f0: 44 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75  DEC1(pPager, zBu
a600: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
a610: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a620: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
a630: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
a640: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
a650: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
a660: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
a670: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
a680: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
a690: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
a6a0: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
a6b0: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
a6c0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a6d0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
a6e0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
a6f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
a700: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
a710: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a720: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a730: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
a740: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
a750: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
a760: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
a770: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
a780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a790: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
a7a0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
a7b0: 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
a7c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
a7d0: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
a7e0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
a7f0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
a800: 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  dif.  }.  pPager
a810: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
a820: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a830: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
a840: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
a850: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
a860: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
a870: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
a880: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a890: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
a8a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
a8b0: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  nt nPage){.  ass
a8c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
a8d0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
a8e0: 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  IVE );.  return 
a8f0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a900: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
a910: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
a920: 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f  i64)nPage);.}../
a930: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
a940: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
a950: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
a960: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
a970: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
a980: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
a990: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
a9a0: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
a9b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
a9c0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
a9d0: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
a9e0: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
a9f0: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
aa00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
aa10: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
aa20: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
aa30: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
aa40: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
aa50: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
aa60: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
aa70: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
aa80: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
aa90: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
aaa0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
aab0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
aac0: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
aad0: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
aae0: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
aaf0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
ab00: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
ab10: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
ab20: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
ab30: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
ab40: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
ab50: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ab60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ab70: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
ab80: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
ab90: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
aba0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
abb0: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
abc0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
abd0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
abe0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
abf0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
ac00: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
ac10: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
ac20: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
ac30: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
ac40: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
ac50: 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73  **  (6)  N bytes
ac60: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
ac70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
ac80: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
ac90: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
aca0: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
acb0: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
acc0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
acd0: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
ace0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
acf0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
ad00: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
ad10: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
ad20: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
ad30: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
ad40: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
ad50: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
ad60: 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f  .**  (7)  Zero o
ad70: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
ad80: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
ad90: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
ada0: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
adb0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
adc0: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
add0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
ade0: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
adf0: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
ae00: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
ae10: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
ae20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
ae30: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
ae40: 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   6 items above..
ae50: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
ae60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
ae70: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
ae80: 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 7th item..**.
ae90: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
aea0: 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
aeb0: 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
aec0: 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
aed0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
aee0: 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
aef0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
af00: 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
af10: 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
af20: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
af30: 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
af40: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
af50: 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
af60: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
af70: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
af80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
af90: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
afa0: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
afb0: 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
afc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
afd0: 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
afe0: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
aff0: 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
b000: 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
b010: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
b020: 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
b030: 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
b040: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
b050: 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
b060: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
b070: 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
b080: 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
b090: 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
b0a0: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
b0b0: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
b0c0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
b0d0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
b0e0: 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
b0f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
b100: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
b110: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
b120: 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
b130: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
b140: 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
b150: 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
b160: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
b170: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
b180: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
b190: 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
b1a0: 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
b1b0: 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
b1c0: 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
b1d0: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
b1e0: 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
b1f0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
b200: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
b210: 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
b220: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
b230: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
b240: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b250: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
b260: 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
b270: 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
b280: 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
b290: 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
b2a0: 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
b2b0: 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
b2c0: 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
b2d0: 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
b2e0: 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
b2f0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
b300: 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
b310: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
b320: 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
b330: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
b340: 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
b350: 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
b360: 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
b370: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
b380: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
b390: 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
b3a0: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
b3b0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
b3c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b3d0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
b3e0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b3f0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
b400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b410: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b420: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
b430: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b450: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
b460: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
b470: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b490: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b4a0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
b4b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
b4c0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
b4d0: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
b4e0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
b510: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
b520: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
b530: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
b540: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
b550: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
b560: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
b570: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
b580: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
b590: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
b5a0: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
b5b0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
b5c0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
b5d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
b5e0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
b5f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b600: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
b610: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
b620: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b630: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
b640: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
b650: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
b660: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
b670: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b680: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
b690: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
b6a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b6b0: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
b6c0: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
b6d0: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
b6e0: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
b6f0: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
b700: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
b710: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
b720: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
b730: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
b740: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
b750: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
b760: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
b770: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
b780: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
b790: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
b7a0: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
b7b0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
b7c0: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
b7d0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
b7e0: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
b7f0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
b800: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b810: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b820: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b830: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
b840: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
b850: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
b860: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b870: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
b880: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
b890: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
b8a0: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
b8b0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
b8c0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
b8d0: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
b8e0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
b8f0: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
b900: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
b910: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
b920: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
b930: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
b940: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
b950: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
b960: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b970: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
b980: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
b990: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
b9a0: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
b9b0: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
b9c0: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
b9d0: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
b9e0: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
b9f0: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
ba00: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
ba10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
ba20: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
ba30: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
ba40: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
ba50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ba60: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
ba70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
ba80: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ba90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
baa0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
bab0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bac0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
bad0: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
bae0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
baf0: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
bb00: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
bb10: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
bb20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
bb30: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
bb40: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
bb50: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
bb60: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
bb70: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
bb80: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
bb90: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
bba0: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
bbb0: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
bbc0: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
bbd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bbe0: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
bbf0: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
bc00: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
bc10: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
bc20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
bc30: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
bc40: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
bc50: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
bc60: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
bc70: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
bc80: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
bc90: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
bca0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
bcb0: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
bcc0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
bcd0: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
bce0: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
bcf0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
bd00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
bd10: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
bd20: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
bd30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
bd40: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
bd50: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
bd60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bd70: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
bd80: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
bd90: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
bda0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
bdb0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
bdc0: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
bdd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bde0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
bdf0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
be00: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
be10: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
be20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
be30: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
be40: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
be50: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
be60: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
be70: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
be80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
be90: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
bea0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
beb0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
bec0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
bed0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
bee0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bef0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
bf00: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
bf10: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
bf20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
bf30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bf40: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
bf50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bf60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bf70: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
bf80: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
bf90: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ollback a hot jo
bfa0: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  urnal, then the 
bfb0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
bfc0: 20 20 20 2a 2a 20 69 73 20 70 72 6f 62 61 62 6c     ** is probabl
bfd0: 79 20 6e 6f 74 20 72 65 63 6f 76 65 72 61 62 6c  y not recoverabl
bfe0: 65 2e 20 20 52 65 74 75 72 6e 20 43 4f 52 52 55  e.  Return CORRU
bff0: 50 54 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  PT..          */
c000: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c010: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
c020: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
c030: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c050: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
c060: 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
c070: 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
c080: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
c090: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c0a0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
c0b0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
c0c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
c0d0: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
c0e0: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
c0f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
c100: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
c110: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
c120: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
c130: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
c140: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
c150: 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
c160: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
c170: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c180: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
c190: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
c1a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c1b0: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
c1c0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
c1d0: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
c1e0: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
c1f0: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
c200: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
c210: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
c220: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
c230: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
c240: 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f  rent PAGER_SECTO
c250: 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75  R_SIZE.  ** valu
c260: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
c270: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
c280: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
c290: 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  s..  */.  pPager
c2a0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
c2b0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
c2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
c2e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c2f0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
c300: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
c310: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
c320: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
c330: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
c340: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
c350: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
c360: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
c370: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
c380: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
c390: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
c3a0: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
c3b0: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
c3c0: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
c3d0: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
c3e0: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
c3f0: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
c400: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
c410: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
c420: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
c430: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
c440: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
c450: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
c460: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
c470: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
c480: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
c490: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
c4a0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
c4b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c4c0: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
c4d0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
c4e0: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c500: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
c510: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
c520: 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
c530: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
c540: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c550: 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
c560: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c580: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c590: 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
c5a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c5b0: 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
c5c0: 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
c5d0: 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
c5e0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
c5f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
c600: 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
c610: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c620: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c630: 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
c640: 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
c650: 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
c660: 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
c670: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
c680: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c690: 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69  written.  ** thi
c6a0: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
c6b0: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20  saction, or the 
c6c0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c6d0: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
c6e0: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
c6f0: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
c700: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
c710: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
c720: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
c730: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
c740: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
c750: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
c760: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
c770: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
c780: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
c790: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
c7a0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ze..  */.  if( p
c7b0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
c7c0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
c7d0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c7e0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
c7f0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
c800: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
c810: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
c820: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
c830: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
c840: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
c850: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
c860: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
c870: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c880: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
c890: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c8a0: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
c8b0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
c8c0: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
c8d0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
c8e0: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
c8f0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
c900: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
c910: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
c920: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
c930: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
c940: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
c950: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c960: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
c970: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
c980: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
c990: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
c9a0: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
c9b0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
c9c0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
c9d0: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
c9e0: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
c9f0: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
ca00: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
ca10: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
ca20: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
ca30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
ca40: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
ca50: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ca60: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
ca70: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
ca80: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
ca90: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
caa0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
cab0: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
cac0: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
cad0: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
cae0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
caf0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
cb00: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
cb10: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
cb20: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
cb30: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
cb40: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
cb50: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
cb60: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
cb70: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
cb80: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
cb90: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
cba0: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
cbb0: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
cbc0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
cbd0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
cbe0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
cbf0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
cc00: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
cc10: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
cc20: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
cc30: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
cc40: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
cc50: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
cc60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cc70: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
cc80: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
cc90: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
cca0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
ccb0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
ccc0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
ccd0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
cce0: 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74  tCksum;.  assert
ccf0: 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ( JOURNAL_HDR_SZ
cd00: 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72  (pPager)<(pPager
cd10: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b  ->pageSize+8) );
cd20: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
cd30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20  ->journalOff <= 
cd40: 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d  (hdrOff-(pPager-
cd50: 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b  >pageSize+8)) ){
cd60: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
cd70: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
cd80: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
cd90: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61  ->jfd, 1);.    a
cda0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
cdb0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
cdc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cdd0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
cde0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
cdf0: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
ce00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
ce10: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
ce20: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
ce30: 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
ce40: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
ce50: 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
ce60: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
ce70: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
ce80: 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
ce90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
ceb0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
cec0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
ced0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cee0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
cef0: 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
cf00: 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
cf10: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
cf20: 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
cf30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
cf40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
cf50: 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
cf60: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
cf70: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
cf80: 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
cf90: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
cfa0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
cfb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
cfc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
cfd0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
cfe0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
cff0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d000: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
d020: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d030: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64  ff = szJ;.  .end
d040: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a  _stmt_playback:.
d050: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d060: 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65  _OK) {.    pPage
d070: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d080: 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65  szJ;.    /* page
d090: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
d0a0: 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20  Pager); */.  }. 
d0b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d0c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
d0d0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
d0e0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
d0f0: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
d100: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
d110: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63  te3pager_set_cac
d120: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
d130: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
d140: 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
d150: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
d160: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
d170: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
d180: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
d190: 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
d1a0: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
d1b0: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
d1c0: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
d1d0: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
d1e0: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
d1f0: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
d200: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
d210: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
d220: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
d230: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
d240: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
d250: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
d260: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
d270: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
d280: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
d290: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
d2a0: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
d2b0: 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
d2c0: 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
d2d0: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
d2e0: 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
d2f0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
d300: 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
d310: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
d320: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d330: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
d340: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
d350: 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
d360: 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
d370: 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
d380: 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
d390: 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
d3a0: 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
d3b0: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
d3c0: 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
d3d0: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
d3e0: 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
d3f0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
d400: 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
d410: 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
d420: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
d430: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
d440: 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
d450: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
d460: 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
d470: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
d480: 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
d490: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
d4a0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
d4b0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
d4c0: 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
d4d0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
d4e0: 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
d4f0: 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
d500: 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
d510: 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
d520: 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
d530: 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
d550: 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
d560: 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
d570: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
d580: 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
d590: 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
d5a0: 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
d5b0: 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
d5c0: 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
d5d0: 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
d5e0: 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
d5f0: 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
d600: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d610: 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
d620: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
d630: 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
d640: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
d650: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
d660: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
d670: 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
d680: 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
d690: 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
d6a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
d6b0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
d6c0: 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
d6d0: 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  3pager_set_safet
d6e0: 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  y_level(Pager *p
d6f0: 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
d700: 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  , int full_fsync
d710: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
d720: 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
d730: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
d740: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
d750: 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
d760: 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
d770: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
d780: 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20  r->full_fsync = 
d790: 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66  full_fsync;.  if
d7a0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
d7b0: 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
d7c0: 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
d7d0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
d7e0: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
d7f0: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
d800: 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
d810: 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
d820: 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
d830: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
d840: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
d850: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
d860: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
d870: 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
d880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
d890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
d8a0: 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
d8b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
d8c0: 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
d8d0: 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ary file.  Write
d8e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d8f0: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65   file into zFile
d900: 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20  .** (zFile must 
d910: 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  be at least SQLI
d920: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
d930: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57   bytes long.)  W
d940: 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  rite.** the file
d950: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
d960: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
d970: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d980: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
d990: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
d9a0: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
d9b0: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
d9c0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
d9d0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
d9e0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
d9f0: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
da00: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
da10: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
da20: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
da30: 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74  le **pFd){.  int
da40: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
da50: 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
da60: 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
da70: 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
da80: 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
da90: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
daa0: 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
dab0: 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  dif.  do{.    cn
dac0: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
dad0: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
dae0: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
daf0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
db00: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46  lusive(zFile, pF
db10: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
db20: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
db30: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
db40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
db50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
db60: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
db70: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
db80: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
db90: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
dba0: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
dbb0: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
dbc0: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
dbd0: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
dbe0: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
dbf0: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
dc00: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
dc10: 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64  3pager_get() and
dc20: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
dc30: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
dc40: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
dc50: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
dc60: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
dc70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
dc80: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
dc90: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
dca0: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
dcb0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
dcc0: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
dcd0: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
dce0: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
dcf0: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
dd00: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
dd10: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
dd20: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
dd30: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
dd40: 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72  " then all infor
dd50: 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
dd60: 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69  n cache..** It i
dd70: 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
dd80: 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63  to disk.  This c
dd90: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
dda0: 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e  plement an.** in
ddb0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
ddc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ddd0: 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61  pager_open(.  Pa
dde0: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
ddf0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
de00: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
de10: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
de20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
de30: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
de40: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
de50: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
de60: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
de70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
de80: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
de90: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
dea0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
deb0: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
dec0: 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
ded0: 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
dee0: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
def0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a  er *pPager = 0;.
df00: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
df10: 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
df20: 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f   nameLen;  /* Co
df30: 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e  mpiler is wrong.
df40: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
df50: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f  initialized befo
df60: 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69  re use */.  OsFi
df70: 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63  le *fd;.  int rc
df80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
df90: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d  int i;.  int tem
dfa0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFile = 0;.  int
dfb0: 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e   memDb = 0;.  in
dfc0: 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  t readOnly = 0;.
dfd0: 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
dfe0: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
dff0: 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
e000: 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64  =0;.  int noRead
e010: 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
e020: 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
e030: 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54  K)!=0;.  char zT
e040: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
e050: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65  AME_SIZE];.#ifde
e060: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e070: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
e080: 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28  T.  /* A malloc(
e090: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e  ) cannot fail in
e0a0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
e0b0: 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d  ta() as one or m
e0c0: 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20  ore calls to .  
e0d0: 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74  ** malloc() must
e0e0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
e0f0: 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  en made by this 
e100: 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74  thread before it
e110: 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68   gets.  ** to th
e120: 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d  is point. This m
e130: 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44  eans the ThreadD
e140: 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65  ata must have be
e150: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72  en allocated alr
e160: 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61  eady.  ** so tha
e170: 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c  t ThreadData.nAl
e180: 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20  loc can be set. 
e190: 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65  It would be nice
e1a0: 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20   to assert.  ** 
e1b0: 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
e1c0: 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65  nAlloc is non-ze
e1d0: 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69  ro, but alas thi
e1e0: 73 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61  s breaks test ca
e1f0: 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  ses .  ** writte
e200: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
e210: 70 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a  pager directly..
e220: 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74    */.  ThreadDat
e230: 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65  a *pTsd = sqlite
e240: 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20  3ThreadData();. 
e250: 20 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b   assert( pTsd );
e260: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
e270: 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c   malloc() has al
e280: 72 65 61 64 79 20 66 61 69 6c 65 64 20 72 65 74  ready failed ret
e290: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e2a0: 2e 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20  . Before even.  
e2b0: 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74  ** testing for t
e2c0: 68 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65  his, set *ppPage
e2d0: 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65  r to NULL so the
e2e0: 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68   caller knows th
e2f0: 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72  e pager.  ** str
e300: 75 63 74 75 72 65 20 77 61 73 20 6e 65 76 65 72  ucture was never
e310: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a   allocated. .  *
e320: 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
e330: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ;.  if( sqlite3M
e340: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
e350: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e360: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e370: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
e380: 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f  izeof(fd));..  /
e390: 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
e3a0: 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46   file and set zF
e3b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70  ullPathname to p
e3c0: 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29  oint at malloc()
e3d0: 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  ed .  ** memory 
e3e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
e3f0: 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65  omplete filename
e400: 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67   (i.e. including
e410: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e   the directory).
e420: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
e430: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
e440: 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
e450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
e460: 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
e470: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
e480: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
e490: 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
e4a0: 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  ;.      zFullPat
e4b0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  hname = sqliteSt
e4c0: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65  rDup("");.    }e
e4d0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
e4e0: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
e4f0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
e500: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
e510: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
e520: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
e530: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e540: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
e550: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
e560: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
e570: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a  dOnly);.      }.
e580: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
e590: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
e5a0: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
e5b0: 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a  emp, &fd);.    z
e5c0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
e5d0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
e5e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
e5f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
e600: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
e610: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e620: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
e630: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
e640: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
e650: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
e660: 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  e. As part of th
e670: 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f  e same allocatio
e680: 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  n, allocate.  **
e690: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66   space for the f
e6a0: 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65  ull paths of the
e6b0: 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
e6c0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   and journal .  
e6d0: 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e  ** (Pager.zFilen
e6e0: 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65  ame, Pager.zDire
e6f0: 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e  ctory and Pager.
e700: 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a  zJournal)..  */.
e710: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
e720: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c  ame ){.    nameL
e730: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
e740: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e750: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
e760: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
e770: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
e780: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a 0a  *3 + 30 );.  }..
e790: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
e7a0: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
e7b0: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
e7c0: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
e7d0: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
e7e0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
e7f0: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
e800: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
e810: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
e820: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
e830: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
e840: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
e850: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
e860: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
e870: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
e880: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
e890: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
e8a0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
e8b0: 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
e8c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
e8d0: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
e8e0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
e8f0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Pathname);.    s
e900: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
e910: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
e920: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53  rc==SQLITE_OK)?S
e930: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b  QLITE_NOMEM:rc);
e940: 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22  .  }..  TRACE3("
e950: 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
e960: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c  ILEHANDLEID(fd),
e970: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e980: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
e990: 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
e9a0: 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
e9b0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
e9c0: 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
e9d0: 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ame[nameLen+1];.
e9e0: 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
e9f0: 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44  al = &pPager->zD
ea00: 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e  irectory[nameLen
ea10: 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50  +1];.  strcpy(pP
ea20: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
ea30: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
ea40: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
ea50: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
ea60: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20  ullPathname);.. 
ea70: 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20   for(i=nameLen; 
ea80: 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
ea90: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
eaa0: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
eab0: 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
eac0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
ead0: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50  = 0;.  strcpy(pP
eae0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
eaf0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
eb00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
eb10: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
eb20: 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  trcpy(&pPager->z
eb30: 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d  Journal[nameLen]
eb40: 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20  , "-journal");. 
eb50: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64   pPager->fd = fd
eb60: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a  ;.  /* pPager->j
eb70: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20  ournalOpen = 0; 
eb80: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  */.  pPager->use
eb90: 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
eba0: 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
ebb0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
ebc0: 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63  lock = noReadloc
ebd0: 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  k && readOnly;. 
ebe0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
ebf0: 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
ec00: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
ec10: 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
ec20: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
ec30: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
ec40: 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31  dbSize = memDb-1
ec50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
ec60: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
ec70: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
ec80: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
ec90: 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
eca0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
ecb0: 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
ecc0: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
ecd0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
ece0: 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d  ager->nMaxPage =
ecf0: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
ed00: 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
ed10: 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 55   assert( PAGER_U
ed20: 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a  NLOCK==0 );.  /*
ed30: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
ed40: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
ed50: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
ed60: 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
ed70: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
ed80: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
ed90: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
eda0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
edb0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
edc0: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
edd0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
ede0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
edf0: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
ee00: 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
ee10: 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
ee20: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50  ->fullSync = (pP
ee30: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31  ager->noSync?0:1
ee40: 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
ee50: 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
ee60: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
ee70: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
ee80: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
ee90: 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
eea0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
eeb0: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
eec0: 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65 72  Extra);.  pPager
eed0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
eee0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
eef0: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
ef00: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
ef10: 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
ef20: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
ef30: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
ef40: 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
ef50: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
ef60: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ef70: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
ef80: 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
ef90: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d  r->pNext = pTsd-
efa0: 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d  >pPager;.  pTsd-
efb0: 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
efc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
efd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
efe0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
eff0: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
f000: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
f010: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
f020: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
f030: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
f040: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
f050: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
f060: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
f070: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
f080: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
f090: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
f0a0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
f0b0: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
f0c0: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
f0d0: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
f0e0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
f0f0: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
f100: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
f110: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
f120: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
f130: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
f140: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
f150: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
f160: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
f170: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
f180: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
f190: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
f1a0: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
f1b0: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
f1c0: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
f1d0: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
f1e0: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
f1f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f200: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
f210: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
f220: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
f230: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
f240: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
f250: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
f260: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
f270: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
f280: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
f290: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
f2a0: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
f2b0: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
f2c0: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
f2d0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
f2e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
f2f0: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
f300: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
f310: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
f320: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
f330: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
f340: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
f350: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
f360: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
f370: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
f380: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
f390: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
f3a0: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
f3b0: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
f3c0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
f3d0: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
f3e0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
f3f0: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
f400: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f410: 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74   page size.  Ret
f420: 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65  urn the new size
f430: 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73  .  If the sugges
f440: 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69  t new page.** si
f450: 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69  ze is inappropri
f460: 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74  ate, then an alt
f470: 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69  ernative page si
f480: 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a  ze is selected.*
f490: 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a  * and returned..
f4a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
f4b0: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
f4c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
f4d0: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
f4e0: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
f4f0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
f500: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
f510: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66  AGE_SIZE );.  if
f520: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
f530: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f540: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
f550: 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ize;.  }.  retur
f560: 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n pPager->pageSi
f570: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ze;.}../*.** The
f580: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
f590: 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
f5a0: 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
f5b0: 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
f5c0: 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
f5d0: 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
f5e0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f5f0: 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
f600: 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
f610: 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
f620: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
f630: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
f640: 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
f650: 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
f660: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
f670: 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
f680: 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
f690: 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
f6a0: 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
f6b0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
f6c0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
f6d0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
f6e0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
f6f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
f700: 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61  d_cnt;.void clea
f710: 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  r_simulated_io_e
f720: 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65  rror(){.  sqlite
f730: 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d  3_io_error_hit =
f740: 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62   0;.}.void disab
f750: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
f760: 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
f770: 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
f780: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
f790: 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
f7a0: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
f7b0: 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
f7c0: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
f7d0: 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
f7e0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
f7f0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
f800: 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
f810: 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73  # define clear_s
f820: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f830: 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73  r().# define dis
f840: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
f850: 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
f860: 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
f870: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f880: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
f890: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
f8a0: 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
f8b0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
f8c0: 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
f8d0: 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
f8e0: 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
f8f0: 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
f900: 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
f910: 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
f920: 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
f930: 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
f940: 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
f950: 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
f960: 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
f970: 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
f980: 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
f990: 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
f9a0: 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
f9b0: 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
f9c0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
f9d0: 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
f9e0: 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
f9f0: 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
fa00: 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
fa10: 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
fa20: 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
fa30: 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
fa40: 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
fa50: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
fa60: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
fa70: 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65  3pager_read_file
fa80: 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
fa90: 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
faa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
fab0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
fac0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
fad0: 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
fae0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
faf0: 29 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  ){.    disable_s
fb00: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fb10: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
fb20: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
fb30: 66 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62  fd, 0);.    enab
fb40: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
fb50: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 72 63  errors();.    rc
fb60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
fb70: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
fb80: 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20  st, N);.    if( 
fb90: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
fba0: 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
fbb0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
fbc0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
fbd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fbe0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
fbf0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
fc00: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
fc10: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
fc20: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
fc30: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
fc40: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
fc50: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
fc60: 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
fc70: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
fc80: 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
fc90: 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
fca0: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
fcb0: 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
fcc0: 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
fcd0: 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
fce0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
fcf0: 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
fd00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
fd10: 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
fd20: 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
fd30: 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
fd40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fd50: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
fd60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
fd70: 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72    i64 n;.  int r
fd80: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
fd90: 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
fda0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
fdb0: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  0 ){.    n = pPa
fdc0: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
fdd0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20   else {.    if( 
fde0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
fdf0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
fe00: 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
fe10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
fe20: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
fe30: 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75   rc);.      retu
fe40: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
fe50: 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
fe60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
fe70: 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
fe80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
fe90: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
fea0: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
feb0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
fec0: 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
fed0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
fee0: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
fef0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
ff00: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
ff10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
ff20: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
ff30: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
ff40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ff50: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
ff60: 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
ff70: 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
ff80: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
ff90: 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
ffa0: 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
ffb0: 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
ffc0: 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
ffd0: 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
ffe0: 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
fff0: 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
10000 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
10010 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
10020 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
10030 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
10040 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
10050 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
10060 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
10070 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  /*.** Unlink pPg
10080 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
10090 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20  chain. Also set 
100a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
100b0 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
100c0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
100d0 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  e is not part of
100e0 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
100f0 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
10100 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  d because the.**
10110 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f   sqlite3pager_mo
10120 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
10130 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
10140 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
10150 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
10160 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
10170 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
10180 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
10190 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
101a0 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
101b0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
101c0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
101d0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
101e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
101f0 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
10200 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
10210 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
10220 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
10230 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
10240 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
10250 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
10260 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
10270 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
10280 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
10290 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
102a0 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
102b0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
102c0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
102d0 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
102e0 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
102f0 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
10300 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
10310 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
10320 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
10330 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
10340 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
10350 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
10360 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
10370 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
10380 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
10390 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
103a0 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
103b0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
103c0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
103d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
103e0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
103f0 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
10400 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
10410 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
10420 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
10430 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
10440 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
10450 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
10460 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
10470 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
10480 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
10490 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
104a0 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
104b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
104c0 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
104d0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
104e0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
104f0 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
10500 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
10510 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
10520 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
10530 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
10540 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
10550 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
10560 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
10570 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
10580 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
10590 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
105a0 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
105b0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
105c0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
105d0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
105e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
105f0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
10600 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
10610 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
10620 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
10630 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
10640 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
10650 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
10660 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
10670 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
10680 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
10690 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
106a0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
106b0 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
106c0 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
106d0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
106e0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
106f0 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
10700 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
10710 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
10720 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
10730 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23  ager, pPg);.}..#
10740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10750 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
10760 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10770 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
10780 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
10790 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74  database.  Delet
107a0 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77  e.** all pages w
107b0 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  hose pgno is lar
107c0 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
107d0 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
107e0 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20  nreferenced..** 
107f0 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
10800 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
10810 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
10820 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  zeroed..*/.stati
10830 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75  c void memoryTru
10840 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
10850 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
10860 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
10870 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
10880 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
10890 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
108a0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
108b0 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
108c0 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
108d0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
108e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
108f0 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
10900 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
10910 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
10920 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
10930 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
10940 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
10950 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
10960 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
10970 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
10980 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
10990 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
109a0 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
109b0 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
109c0 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
109d0 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
109e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
109f0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
10a00 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
10a10 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
10a20 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  p).#endif../*.**
10a30 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
10a40 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
10a50 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
10a60 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
10a70 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
10a80 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
10a90 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
10aa0 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
10ab0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
10ac0 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
10ad0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
10ae0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
10af0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
10b00 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
10b10 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
10b20 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
10b30 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
10b40 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
10b50 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
10b60 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
10b70 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
10b80 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10b90 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
10ba0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
10bb0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
10bc0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
10bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
10be0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
10bf0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
10c00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10c10 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
10c20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10c30 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
10c40 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
10c50 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
10c60 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
10c70 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
10c80 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
10c90 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
10ca0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
10cb0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10cc0 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
10cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10ce0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
10cf0 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
10d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10d10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10d20 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
10d30 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
10d40 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
10d50 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
10d60 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
10d70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
10d80 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
10d90 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
10da0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
10db0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
10dc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
10dd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
10de0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
10df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10e00 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
10e10 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
10e20 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10e40 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
10e50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
10e60 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
10e70 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
10e80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
10e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ea0 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a    }.  rc = syncJ
10eb0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
10ec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10ee0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
10ef0 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
10f00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
10f10 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75  abase before tru
10f20 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  ncating. */.  rc
10f30 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
10f40 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
10f50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
10f60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10f70 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10f80 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
10f90 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
10fa0 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
10fb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10fc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
10fd0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
10fe0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
10ff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
11000 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
11010 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
11020 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
11030 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
11040 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
11050 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
11060 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
11070 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
11080 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
11090 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
110a0 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
110b0 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
110c0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
110d0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
110e0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
110f0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
11100 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
11110 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
11120 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
11130 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
11140 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
11150 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
11160 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
11170 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
11180 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
11190 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
111a0 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
111b0 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
111c0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
111d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
111e0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
111f0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
11200 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
11210 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
11220 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
11230 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
11240 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
11250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11260 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72  ager_close(Pager
11270 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
11280 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
11290 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
112a0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
112b0 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
112c0 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
112d0 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
112e0 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
112f0 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
11300 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
11310 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
11320 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
11330 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
11340 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
11350 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
11360 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
11370 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
11380 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
11390 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
113a0 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
113b0 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
113c0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72   set..  */.  Thr
113d0 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
113e0 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
113f0 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
11400 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
11410 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d  t( pTsd && pTsd-
11420 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69  >nAlloc );.#endi
11430 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  f..  switch( pPa
11440 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
11450 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
11460 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
11470 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
11480 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
11490 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
114a0 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e   /* We ignore an
114b0 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74  y IO errors that
114c0 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
114d0 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  e rollback.     
114e0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
114f0 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72  o disable IO err
11500 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f  or simulation so
11510 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20   that testing.  
11520 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72      ** works mor
11530 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20  e easily..      
11540 2a 2f 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  */.      disable
11550 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11560 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 73 71  rors();.      sq
11570 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
11580 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11590 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
115a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
115b0 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44  .      if( !MEMD
115c0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  B ){.        sql
115d0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
115e0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
115f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11600 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11610 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
11620 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
11630 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
11640 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11650 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20  e PAGER_SHARED: 
11660 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  {.      if( !MEM
11670 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
11680 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
11690 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
116a0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
116b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
116c0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
116d0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
116e0 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
116f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
11700 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
11710 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
11720 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  xt){.#ifndef NDE
11730 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  BUG.    if( MEMD
11740 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  B ){.      PgHis
11750 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
11760 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
11770 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
11780 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
11790 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
117a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
117b0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
117c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
117d0 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
117e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
117f0 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
11800 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
11810 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
11820 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25   TRACE2("CLOSE %
11830 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
11840 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ager));.  assert
11850 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
11860 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
11870 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
11880 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
11890 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
118a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
118b0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
118c0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
118d0 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
118e0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
118f0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
11900 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
11910 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
11920 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
11930 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
11940 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
11950 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
11960 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
11970 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
11980 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
11990 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
119a0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
119b0 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
119c0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
119d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
119e0 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c    */..#ifdef SQL
119f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
11a00 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
11a10 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
11a20 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b  er from the link
11a30 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
11a40 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20  s starting at . 
11a50 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70   ** ThreadData.p
11a60 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d  Pager if memory-
11a70 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
11a80 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  abled..  */.  if
11a90 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e  ( pPager==pTsd->
11aa0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54  pPager ){.    pT
11ab0 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
11ac0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  ger->pNext;.  }e
11ad0 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  lse{.    Pager *
11ae0 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54  pTmp;.    for(pT
11af0 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  mp = pTsd->pPage
11b00 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d  r; pTmp->pNext!=
11b10 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d  pPager; pTmp=pTm
11b20 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
11b30 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50  pTmp->pNext = pP
11b40 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
11b50 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11b60 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
11b70 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  sh);.  sqliteFre
11b80 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
11b90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11ba0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11bb0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
11bc0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
11bd0 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
11be0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
11bf0 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
11c00 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11c10 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
11c20 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
11c30 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
11c40 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
11c50 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
11c60 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
11c70 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
11c80 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
11c90 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11ca0 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11cb0 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
11cc0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
11cd0 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
11ce0 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
11cf0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
11d00 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
11d10 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
11d20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
11d30 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
11d40 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
11d50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11d60 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
11d70 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
11d80 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
11d90 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
11da0 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
11db0 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
11dc0 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
11dd0 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
11de0 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
11df0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
11e00 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
11e10 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11e20 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11e30 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
11e40 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
11e50 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
11e60 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
11e70 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
11e80 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11e90 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
11ea0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
11eb0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11ec0 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
11ed0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11ee0 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
11ef0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
11f00 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11f10 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
11f20 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
11f30 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
11f40 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11f50 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11f60 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11f70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11f80 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
11f90 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
11fa0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
11fb0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11fc0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
11fd0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
11fe0 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11ff0 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
12000 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12010 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
12020 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
12030 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
12040 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
12050 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
12060 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
12070 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
12080 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
12090 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
120a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
120b0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
120c0 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
120d0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
120e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
120f0 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
12100 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
12110 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
12120 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
12130 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
12140 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
12150 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
12160 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
12170 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
12180 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
12190 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
121a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
121b0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
121c0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
121d0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
121e0 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
121f0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
12200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12210 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
12220 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
12230 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
12240 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
12250 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
12260 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
12270 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
12280 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
12290 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
122a0 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
122b0 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
122c0 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
122d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
122e0 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
122f0 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
12300 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
12310 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12320 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
12330 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
12340 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
12350 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
12360 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
12370 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
12380 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
12390 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
123a0 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
123b0 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
123c0 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
123d0 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
123e0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
123f0 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
12400 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12410 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
12420 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12430 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
12440 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
12450 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
12460 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
12470 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
12480 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
12490 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
124a0 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
124b0 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
124c0 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
124d0 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
124e0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
124f0 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
12500 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12510 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
12520 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
12530 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
12540 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
12550 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
12560 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
12570 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
12580 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
12590 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
125a0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
125b0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
125c0 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
125d0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
125e0 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
125f0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
12600 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
12610 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12620 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
12630 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12640 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
12650 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
12660 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
12670 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
12680 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
12690 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
126a0 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
126b0 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
126c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
126d0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
126e0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
126f0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
12700 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12710 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12720 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
12730 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
12740 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
12750 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
12760 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
12770 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
12780 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
12790 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
127a0 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
127b0 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
127c0 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
127d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
127e0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
127f0 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
12800 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
12810 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
12820 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
12830 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
12840 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12850 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
12860 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
12870 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12880 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
12890 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
128a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
128b0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
128c0 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
128d0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
128e0 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
128f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12900 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
12910 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
12920 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
12930 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
12940 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
12950 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
12960 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
12970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
12980 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
12990 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
129a0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
129b0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
129c0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
129d0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
129e0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
129f0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12a00 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
12a10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12a20 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
12a30 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
12a40 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
12a50 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
12a60 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
12a70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
12a80 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
12a90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
12aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
12ab0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
12ac0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12ae0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
12af0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
12b10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12b20 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
12b30 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
12b40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
12b50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
12b60 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
12b70 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
12b80 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
12b90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
12ba0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
12bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
12bc0 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
12bd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12be0 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
12bf0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12c10 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
12c20 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
12c30 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
12c40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12c50 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
12c60 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
12c70 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20  ull_fsync);.    
12c80 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12c90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
12ca0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
12cb0 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
12cc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
12cd0 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
12ce0 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
12cf0 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
12d00 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
12d10 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
12d20 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12d30 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
12d40 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
12d50 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
12d60 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
12d70 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
12d80 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
12d90 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
12da0 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
12db0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
12dc0 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
12dd0 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
12de0 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
12df0 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
12e00 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
12e10 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
12e20 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
12e30 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
12e40 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
12e50 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
12e60 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
12e70 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
12e80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
12e90 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
12ea0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
12eb0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12ec0 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
12ed0 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
12ee0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
12ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
12f00 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65  wo lists of page
12f10 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  s connected by p
12f20 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e  Dirty and in pgn
12f30 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e  o order..** Do n
12f40 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74  ot both fixing t
12f50 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
12f60 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
12f70 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70  c PgHdr *merge_p
12f80 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
12f90 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20  A, PgHdr *pB){. 
12fa0 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a   PgHdr result, *
12fb0 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d  pTail;.  pTail =
12fc0 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c   &result;.  whil
12fd0 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20  e( pA && pB ){. 
12fe0 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c     if( pA->pgno<
12ff0 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  pB->pgno ){.    
13000 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13010 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69  = pA;.      pTai
13020 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41  l = pA;.      pA
13030 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20   = pA->pDirty;. 
13040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13050 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13060 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pB;.      pTail 
13070 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d  = pB;.      pB =
13080 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pB->pDirty;.   
13090 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20   }.  }.  if( pA 
130a0 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
130b0 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c  irty = pA;.  }el
130c0 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20  se if( pB ){.   
130d0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
130e0 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   pB;.  }else{.  
130f0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13100 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
13110 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b  n result.pDirty;
13120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74  .}../*.** Sort t
13130 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
13140 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
13150 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61  der by pgno.  Pa
13160 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65  ges are.** conne
13170 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70  cted by pDirty p
13180 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50  ointers.  The pP
13190 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
131a0 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74  s are.** corrupt
131b0 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e  ed by this sort.
131c0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f  .*/.#define N_SO
131d0 52 54 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61  RT_BUCKET 25.sta
131e0 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f  tic PgHdr *sort_
131f0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13200 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61  pIn){.  PgHdr *a
13210 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c  [N_SORT_BUCKET],
13220 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
13230 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a  memset(a, 0, siz
13240 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65  eof(a));.  while
13250 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d  ( pIn ){.    p =
13260 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20   pIn;.    pIn = 
13270 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
13280 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53    for(i=0; i<N_S
132a0 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b  ORT_BUCKET-1; i+
132b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  +){.      if( a[
132c0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
132d0 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20   a[i] = p;.     
132e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
132f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13300 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
13310 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
13320 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20      a[i] = 0;.  
13330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13340 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55  if( i==N_SORT_BU
13350 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20  CKET-1 ){.      
13360 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67  a[i] = merge_pag
13370 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
13380 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
13390 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  a[0];.  for(i=1;
133a0 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
133b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
133c0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70  merge_pagelist(p
133d0 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  , a[i]);.  }.  r
133e0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
133f0 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
13400 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
13410 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
13420 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
13430 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
13440 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
13450 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
13460 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
13470 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
13480 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
13490 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
134a0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
134b0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
134c0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
134d0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
134e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
134f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
13500 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
13510 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
13520 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
13530 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
13540 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
13550 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
13560 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
13570 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
13580 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
13590 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
135a0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
135b0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
135c0 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
135d0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
135e0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
135f0 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
13600 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
13610 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
13620 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
13630 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13640 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
13650 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
13660 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
13670 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
13680 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
13690 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
136a0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
136b0 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
136c0 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
136d0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
136e0 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
136f0 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
13700 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
13710 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
13720 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
13730 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
13740 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
13750 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
13760 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
13770 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13780 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
13790 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
137a0 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
137b0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
137c0 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
137d0 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
137e0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
137f0 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
13800 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
13810 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
13820 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
13830 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
13840 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
13850 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
13860 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
13870 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
13880 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
13890 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
138a0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
138b0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
138c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
138d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
138e0 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
138f0 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
13900 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  List);.  while( 
13910 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
13920 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
13930 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  y );.    rc = sq
13940 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
13950 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
13960 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
13970 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
13980 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13990 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49  urn rc;.    /* I
139a0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
139b0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
139c0 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
139d0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
139e0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
139f0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
13a00 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
13a10 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
13a20 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
13a30 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
13a40 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
13a50 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
13a60 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
13a70 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
13a80 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
13a90 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
13aa0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
13ab0 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
13ac0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
13ad0 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
13ae0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50  CODEC2(pPager, P
13af0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
13b00 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
13b10 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43  , 6);.      TRAC
13b20 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E3("STORE %d pag
13b30 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
13b40 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
13b50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  >pgno);.      rc
13b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
13b70 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
13b80 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
13b90 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 45  eSize);.      TE
13ba0 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
13bb0 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23  nWrite);.    }.#
13bc0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13bd0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52    else{.      TR
13be0 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
13bf0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
13c00 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
13c10 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
13c20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
13c30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13c40 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
13c50 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
13c60 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13c70 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
13c80 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
13c90 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
13ca0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
13cb0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
13cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13cd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13ce0 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
13cf0 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
13d00 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
13d10 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
13d20 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
13d30 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
13d40 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
13d50 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
13d60 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
13d70 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
13d80 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
13d90 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
13da0 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
13db0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
13dc0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a  ger->pDirty;.}..
13dd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
13de0 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  E if there is a 
13df0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  hot journal on t
13e00 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
13e10 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** A hot journal
13e20 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65   is one that nee
13e30 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
13e40 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
13e50 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
13e60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13e70 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
13e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
13e90 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
13ea0 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
13eb0 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
13ec0 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
13ed0 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
13ee0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
13ef0 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20  Just delete the 
13f00 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
13f10 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
13f20 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
13f30 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
13f40 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
13f50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13f60 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
13f70 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
13f80 6f 75 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e  ournal) ) return
13f90 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
13fa0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
13fb0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
13fc0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
13fd0 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  f( sqlite3pager_
13fe0 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
13ff0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
14000 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
14010 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
14020 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14030 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
14040 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
14050 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
14060 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
14070 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63   that can be rec
14080 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ycled. .**.** Th
14090 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  is routine may r
140a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
140b0 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  RR, SQLITE_FULL 
140c0 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  or SQLITE_OK. It
140d0 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65   .** does not se
140e0 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  t the pPager->er
140f0 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
14100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
14110 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65  ger_recycle(Page
14120 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73  r *pPager, int s
14130 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70  yncOk, PgHdr **p
14140 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  pPg){.  PgHdr *p
14150 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b  Pg;.  *ppPg = 0;
14160 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
14170 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
14180 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
14190 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
141a0 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
141b0 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
141c0 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
141d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
141e0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
141f0 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  ynced;..  /* If 
14200 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
14210 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
14220 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
14230 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f  n fsync().  ** o
14240 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14250 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
14260 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
14270 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20   This is a.  ** 
14280 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
14290 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20  ion, so we work 
142a0 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74  hard to avoid it
142b0 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73  .  But sometimes
142c0 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62  .  ** it can't b
142d0 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20  e helped..  */. 
142e0 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70   if( pPg==0 && p
142f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26  Pager->pFirst &&
14300 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44   syncOk && !MEMD
14310 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  B){.    int rc =
14320 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
14330 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
14340 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
14350 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
14360 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
14370 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
14380 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
14390 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61  nc mode, write a
143a0 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61   new journal hea
143b0 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  der into the.   
143c0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
143d0 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
143e0 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
143f0 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
14400 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64  al.      ** head
14410 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
14420 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
14430 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
14440 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  t have.      ** 
14450 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
14460 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
14470 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68  base (in case th
14480 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20  e header is.    
14490 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65    ** trashed whe
144a0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
144b0 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20   is updated)..  
144c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
144d0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
144e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
144f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14500 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  > 0 );.      rc 
14510 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
14520 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
14530 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
14540 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14560 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
14570 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69  >pFirst;.  }.  i
14580 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
14590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
145a0 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  K;.  }..  assert
145b0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
145c0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
145d0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
145e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
145f0 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f  t is dirty..  */
14600 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
14610 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  y ){.    int rc;
14620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
14630 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
14640 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
14650 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  Pg);.    pPg->di
14660 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
14670 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
14680 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
14690 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
146a0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
146b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
146c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
146d0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
146e0 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
146f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
14700 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
14710 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
14720 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
14730 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
14740 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
14750 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
14760 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
14770 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
14780 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
14790 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
147a0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
147b0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
147c0 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
147d0 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
147e0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
147f0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
14800 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
14810 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
14820 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
14830 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
14840 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
14850 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
14860 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
14870 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
14880 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
14890 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
148a0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
148b0 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
148c0 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
148d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
148e0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
148f0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
14900 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
14910 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
14920 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
14930 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
14940 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
14950 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
14960 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
14970 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
14980 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
14990 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
149a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
149b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
149c0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
149d0 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
149e0 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
149f0 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
14a00 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
14a10 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
14a20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
14a30 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
14a40 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
14a50 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
14a60 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
14a70 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
14a80 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
14a90 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
14aa0 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
14ab0 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
14ac0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
14ad0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
14ae0 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
14af0 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
14b00 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
14b10 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
14b20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
14b30 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
14b40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
14b50 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
14b60 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
14b70 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b80 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14b90 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
14ba0 6c 69 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61  lite3pager_relea
14bb0 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  se_memory(int nR
14bc0 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
14bd0 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
14be0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
14bf0 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
14c00 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74   Pager *p;.  int
14c10 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
14c20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
14c30 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
14c40 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
14c50 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
14c60 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
14c70 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
14c80 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
14c90 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
14ca0 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
14cb0 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
14cc0 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
14cd0 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
14ce0 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
14cf0 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
14d00 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
14d10 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
14d20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
14d30 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
14d40 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
14d50 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
14d60 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
14d70 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
14d80 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
14d90 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
14da0 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
14db0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
14dc0 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
14dd0 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
14de0 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
14df0 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
14e00 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
14e10 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
14e20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
14e30 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
14e40 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
14e50 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
14e60 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
14e70 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
14e80 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14e90 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
14ea0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
14eb0 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
14ec0 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
14ed0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
14ee0 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  read. */.    for
14ef0 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65  (p=pTsdro->pPage
14f00 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20  r; p && (nReq<0 
14f10 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
14f20 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  q); p=p->pNext){
14f30 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
14f40 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  g;.      int rc;
14f50 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
14f60 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
14f70 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
14f80 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
14f90 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
14fa0 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
14fb0 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
14fc0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
14fd0 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
14fe0 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
14ff0 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
15000 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
15010 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
15020 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20  r_recycle(p, i, 
15030 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
15040 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
15050 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
15060 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
15070 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
15080 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
15090 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
150a0 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
150b0 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
150c0 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
150d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
150e0 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
150f0 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
15100 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
15110 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
15120 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
15130 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
15140 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
15150 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
15160 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
15170 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
15180 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
15190 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
151a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
151b0 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
151c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
151d0 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
151e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
151f0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  g );.        pag
15200 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
15210 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
15220 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
15230 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
15240 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70       p->pAll = p
15250 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
15260 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15270 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
15280 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  =p->pAll; pTmp->
15290 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
152a0 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
152b0 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
152c0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
152d0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
152e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
152f0 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
15300 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28  sqliteAllocSize(
15310 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pPg);.        sq
15320 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
15330 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
15340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15350 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  ){.        /* An
15360 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
15370 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
15380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15390 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  le or .        *
153a0 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
153b0 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
153c0 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
153d0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
153e0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65          ** calle
153f0 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
15400 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74  on. Instead, set
15410 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   the Pager.errCo
15420 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  de variable..   
15430 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f       ** The erro
15440 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
15450 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
15460 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65  or users, in the
15470 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a   case .        *
15480 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
15490 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
154a0 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
154b0 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
154c0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
154d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
154e0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
154f0 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53  E_IOERR || rc==S
15500 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20  QLITE_FULL );.  
15510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15520 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
15530 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
15540 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c    pager_error(p,
15550 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
15560 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15570 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
15580 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15590 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
155a0 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a  NAGEMENT */../*.
155b0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
155c0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
155d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
155e0 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
155f0 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
15600 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
15610 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
15620 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
15630 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
15640 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
15650 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f  .**.** A _get wo
15660 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
15670 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
15680 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
15690 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
156a0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
156b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
156c0 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
156d0 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
156e0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
156f0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
15700 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
15710 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
15720 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
15730 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
15740 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
15750 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
15760 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
15770 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
15780 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
15790 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
157a0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
157b0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
157c0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
157d0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
157e0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
157f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
15800 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
15810 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
15820 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
15830 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
15840 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  _lookup().  Both
15850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
15860 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
15870 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
15880 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
15890 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
158a0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
158b0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
158c0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
158d0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
158e0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
158f0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
15900 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
15910 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
15920 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
15930 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
15940 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
15950 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
15960 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
15970 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
15980 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
15990 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
159a0 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
159b0 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
159c0 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
159d0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
159e0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
159f0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
15a00 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50  lite3pager_get(P
15a10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
15a20 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a  no pgno, void **
15a30 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  ppPage){.  PgHdr
15a40 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
15a50 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
15a60 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
15a70 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
15a80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
15a90 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
15aa0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
15ab0 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
15ac0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
15ad0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
15ae0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
15af0 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
15b00 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
15b10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
15b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
15b30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
15b40 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
15b50 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
15b60 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
15b70 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
15b80 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
15b90 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
15ba0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
15bb0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
15bc0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
15bd0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
15be0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
15bf0 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
15c00 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
15c10 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
15c20 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
15c30 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
15c40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15c50 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
15c60 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
15c70 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  & !MEMDB ){.    
15c80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
15c90 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
15ca0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
15cb0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
15cc0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
15cd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15cf0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
15d00 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
15d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15d20 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
15d30 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
15d40 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
15d50 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
15d60 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
15d70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
15d80 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
15d90 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
15da0 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
15db0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68      */.    if( h
15dc0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
15dd0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 2f  ger) ){.       /
15de0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
15df0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
15e00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
15e10 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
15e20 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  s.       ** impo
15e30 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
15e40 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
15e50 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
15e60 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
15e70 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
15e80 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
15e90 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
15ea0 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
15eb0 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
15ec0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
15ed0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
15ee0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
15ef0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
15f00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
15f10 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
15f20 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
15f30 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
15f40 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20  g it .       ** 
15f50 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20  back..       ** 
15f60 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75  .       ** Becau
15f70 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
15f80 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
15f90 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
15fa0 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a  ed, the.       *
15fb0 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73  * second process
15fc0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69   will get to thi
15fd0 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
15fe0 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a  ode and fail to.
15ff0 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
16000 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53   it's own EXCLUS
16010 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
16020 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
16030 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16040 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
16050 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
16060 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
16070 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16090 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
160a0 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
160b0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
160c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
160d0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
160e0 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
160f0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
16100 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
16110 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
16120 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16130 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20  _EXCLUSIVE;..   
16140 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
16150 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
16160 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
16170 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
16180 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72  .       ** we ar
16190 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
161a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
161b0 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20  e. .       **.  
161c0 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72       ** The jour
161d0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
161e0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
161f0 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ked itself.  The
16200 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  .       ** journ
16210 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
16220 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
16230 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
16240 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
16250 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
16260 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
16270 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
16280 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
16290 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
162a0 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
162b0 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
162c0 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a  e time..       *
162d0 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
162e0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
162f0 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  nly(pPager->zJou
16300 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
16310 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  fd);.       if( 
16320 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16330 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
16340 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
16350 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
16360 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16370 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
16380 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
16390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
163a0 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  SY;.       }.   
163b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
163c0 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
163d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
163e0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
163f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
16400 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
16410 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
16420 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
16430 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16440 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20  nalHdr = 0;..   
16450 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
16460 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
16470 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
16480 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
16490 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  .       ** lock 
164a0 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
164b0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
164c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
164d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
164e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
164f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16500 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16510 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16520 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
16540 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
16550 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
16560 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
16570 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
16580 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
16590 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
165a0 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
165b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
165c0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
165d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
165e0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
165f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
16600 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
16610 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
16620 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16630 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
16640 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
16650 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
16660 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
16670 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
16680 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
16690 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
166a0 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29  st==0 || MEMDB )
166b0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  {.      /* Creat
166c0 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a  e a new page */.
166d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
166e0 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d  ->nPage>=pPager-
166f0 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >nHash ){.      
16700 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68    pager_resize_h
16710 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72  ash_table(pPager
16720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61  ,.           pPa
16730 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
16740 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
16750 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 20  Hash*2);.       
16760 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61   if( pPager->nHa
16770 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sh==0 ){.       
16780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16790 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
167a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
167b0 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pPg = sqliteMall
167c0 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
167d0 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
167e0 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
16810 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
16820 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
16850 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
16860 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
16870 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
16880 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
16890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
168a0 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
168b0 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
168c0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
168d0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
168e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
168f0 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
16900 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
16910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
16920 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
16930 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ger;.      pPg->
16940 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
16950 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70  r->pAll;.      p
16960 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
16970 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  g;.      pPager-
16980 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
16990 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
169a0 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  e>pPager->nMaxPa
169b0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ge ){.        as
169c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d  sert( pPager->nM
169d0 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d  axPage==(pPager-
169e0 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20  >nPage-1) );.   
169f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61       pPager->nMa
16a00 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  xPage++;.      }
16a10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16a20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
16a30 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20  ycle(pPager, 1, 
16a40 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  &pPg);.      if(
16a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16a60 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16a70 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
16a80 20 20 20 61 73 73 65 72 74 28 70 50 67 29 20 3b     assert(pPg) ;
16a90 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
16aa0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
16ab0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
16ac0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
16ad0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
16ae0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
16af0 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
16b00 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
16b10 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
16b20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16b30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16b40 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
16b50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
16b60 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
16b70 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
16b80 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
16b90 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
16ba0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
16bb0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
16bc0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
16bd0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
16be0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
16bf0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
16c00 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
16c10 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
16c20 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
16c30 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
16c40 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
16c50 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
16c60 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
16c70 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
16c80 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
16c90 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
16ca0 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
16cb0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
16cc0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
16cd0 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
16ce0 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
16cf0 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65  pPg);..    pPage
16d00 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69  r->nRef++;.    i
16d10 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
16d20 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
16d30 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
16d40 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
16d50 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
16d60 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
16d70 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
16d80 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
16d90 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
16da0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16db0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ));.      rc = p
16dc0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
16dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16de0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
16df0 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
16e00 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
16e10 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
16e20 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
16e30 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
16e40 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
16e50 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
16e60 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
16e70 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  f( sqlite3pager_
16e80 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
16e90 29 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d  )<(int)pgno || M
16ea0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65  EMDB ){.      me
16eb0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
16ec0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
16ed0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16ef0 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
16f00 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
16f10 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
16f20 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
16f30 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
16f40 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
16f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16f60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
16f70 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16f80 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
16f90 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
16fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
16fe0 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
16ff0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
17000 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
17010 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
17020 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47  ODEC1(pPager, PG
17030 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17040 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
17050 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17060 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
17070 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17080 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
17090 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30     pPg->pgno = 0
170a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
170b0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
170c0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
170d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
170e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   rc;.      }else
170f0 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
17100 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
17110 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
17120 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
17130 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
17140 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
17150 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
17160 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
17170 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
17180 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
17190 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
171a0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
171b0 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
171c0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
171d0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
171e0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
171f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
17200 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
17210 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
17220 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
17230 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
17240 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
17250 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
17260 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
17270 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
17280 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
17290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
172a0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
172b0 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
172c0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
172d0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
172e0 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67  ->nHit);.    pag
172f0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
17300 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44    *ppPage = PGHD
17310 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
17320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17330 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
17340 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
17350 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
17360 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
17370 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
17380 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
17390 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
173a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
173b0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
173c0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
173d0 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
173e0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
173f0 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20  te3pager_get(). 
17400 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
17410 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
17420 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
17430 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69  te3pager_get() i
17440 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
17450 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
17460 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
17470 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
17480 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
17490 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
174a0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
174b0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
174c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
174d0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
174e0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
174f0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
17500 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
17510 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
17520 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
17530 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
17540 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
17550 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
17560 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17570 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  gno!=0 );.  if( 
17580 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
17590 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
175a0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
175b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
175c0 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
175d0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
175e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
175f0 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
17600 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
17610 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
17620 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
17630 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
17640 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
17650 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
17660 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
17670 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
17680 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
17690 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
176a0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
176b0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
176c0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
176d0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
176e0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
176f0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
17700 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17710 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
17720 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
17730 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
17740 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
17750 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
17760 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
17770 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
17780 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
17790 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
177a0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
177b0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
177c0 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
177d0 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
177e0 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  g);..  CHECK_PAG
177f0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  E(pPg);..  /* Wh
17800 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
17810 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
17820 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
17830 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
17840 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
17850 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
17860 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
17870 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
17880 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
17890 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67  pPager;.    pPag
178a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
178b0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
178c0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
178d0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
178e0 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
178f0 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
17900 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
17910 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
17920 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
17930 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
17940 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
17950 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
17960 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
17970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
17980 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26  ->needSync==0 &&
17990 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
179a0 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ynced==0 ){.    
179b0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
179c0 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
179d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
179e0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
179f0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17a00 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
17a10 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
17a20 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
17a30 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
17a40 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
17a50 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
17a60 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
17a70 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
17a80 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
17a90 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
17aa0 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
17ab0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
17ac0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
17ad0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
17ae0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
17af0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
17b00 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
17b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
17b30 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
17b40 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
17b50 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
17b60 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
17b70 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
17b80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
17b90 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
17ba0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
17bb0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
17bc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17bd0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
17be0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
17bf0 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
17c00 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
17c10 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
17c20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
17c30 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
17c40 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
17c50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17c60 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
17c70 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
17c80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
17c90 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
17ca0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
17cb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17cc0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
17cd0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
17ce0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
17cf0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
17d00 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ournal==0 );.  s
17d10 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
17d20 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
17d30 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17d40 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
17d50 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
17d60 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
17d70 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
17d80 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
17d90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17da0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
17db0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
17dc0 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  l;.  }.  rc = sq
17dd0 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
17de0 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  sive(pPager->zJo
17df0 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
17e00 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  jfd,.           
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65        pPager->te
17e30 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  mpFile);.  pPage
17e40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
17e50 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
17e60 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
17e70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17e80 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
17e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17ea0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
17eb0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
17ec0 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  }.  sqlite3OsSet
17ed0 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
17ee0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
17ef0 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c  ll_fsync);.  sql
17f00 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
17f10 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
17f20 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
17f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70  );.  sqlite3OsOp
17f40 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
17f50 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
17f60 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
17f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17f80 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
17f90 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
17fa0 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
17fb0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
17fc0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
17fd0 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
17fe0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
17ff0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
18000 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
18010 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
18020 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
18030 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
18040 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
18050 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
18060 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
18070 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
18080 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
18090 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
180a0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
180b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
180c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
180d0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
180e0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
180f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18100 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
18110 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
18120 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
18130 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
18140 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18150 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
18160 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
18170 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18180 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
18190 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
181a0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
181b0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
181c0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
181d0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28  urnal = 0;.  if(
181e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
181f0 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  M ){.    /* If t
18200 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63  his was a malloc
18210 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e  () failure, then
18220 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   we will not be 
18230 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65  closing the page
18240 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53  r.    ** file. S
18250 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75  o delete any jou
18260 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79  rnal file we may
18270 20 68 61 76 65 20 6a 75 73 74 20 63 72 65 61 74   have just creat
18280 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ed. Otherwise,. 
18290 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d     ** the system
182a0 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73   will get confus
182b0 65 64 2c 20 77 65 20 68 61 76 65 20 61 20 72 65  ed, we have a re
182c0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  ad-lock on the f
182d0 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a  ile and a.    **
182e0 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72   mysterious jour
182f0 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72 65 64  nal has appeared
18300 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
18310 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  em..    */.    s
18320 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
18330 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
18340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
18350 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
18360 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
18370 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
18380 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
18390 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  NLOCK;.  }.  ret
183a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
183b0 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
183c0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
183d0 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
183e0 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
183f0 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
18400 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
18410 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
18420 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
18430 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  mit() is called.
18440 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
18450 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
18460 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
18470 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
18480 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  _close() is call
18490 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
184a0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
184b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
184c0 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
184d0 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
184e0 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
184f0 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
18500 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
18510 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
18520 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
18530 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
18540 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
18550 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
18560 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
18570 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
18580 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
18590 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
185a0 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
185b0 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
185c0 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
185d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
185e0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
185f0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
18600 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
18610 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
18620 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
18630 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18640 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
18650 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
18660 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
18670 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
18680 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
18690 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
186a0 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
186b0 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
186c0 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
186d0 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
186e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
186f0 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
18700 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
18710 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
18720 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
18730 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
18740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
18750 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
18760 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
18770 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18780 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
18790 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
187a0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
187b0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
187c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
187d0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
187e0 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
187f0 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
18800 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
18810 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
18820 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
18830 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
18840 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
18850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18860 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64  pager_begin(void
18870 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46   *pData, int exF
18880 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  lag){.  PgHdr *p
18890 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
188a0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
188b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
188c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
188d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
188e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
188f0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
18900 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18910 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18920 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
18930 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
18940 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
18950 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
18960 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
18970 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
18980 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
18990 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
189a0 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
189b0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
189c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
189d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
189f0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
18a00 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
18a10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18a30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
18a40 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
18a50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
18a60 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
18a70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
18a80 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
18a90 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
18aa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18ab0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
18ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18ad0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18ae0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18af0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
18b00 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  che = 0;.      T
18b10 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
18b20 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
18b30 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
18b40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
18b50 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
18b60 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
18b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
18b80 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
18b90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18ba0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
18bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18bc0 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69  * Make a page di
18bd0 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69  rty.  Set its di
18be0 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64  rty flag and add
18bf0 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79   it to the dirty
18c00 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  .** page list..*
18c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
18c20 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70  keDirty(PgHdr *p
18c30 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
18c40 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20  dirty==0 ){.    
18c50 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
18c60 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
18c70 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
18c80 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
18c90 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74   = pPager->pDirt
18ca0 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  y;.    if( pPage
18cb0 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  r->pDirty ){.   
18cc0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
18cd0 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
18ce0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
18cf0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  Pg->pPrevDirty =
18d00 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
18d10 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  pDirty = pPg;.  
18d20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
18d30 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43  a page clean.  C
18d40 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62  lear its dirty b
18d50 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  it and remove it
18d60 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72   from the.** dir
18d70 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ty page list..*/
18d80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
18d90 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50  eClean(PgHdr *pP
18da0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
18db0 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d  irty ){.    pPg-
18dc0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
18dd0 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20  if( pPg->pDirty 
18de0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  ){.      pPg->pD
18df0 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
18e00 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72   = pPg->pPrevDir
18e10 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ty;.    }.    if
18e20 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
18e30 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
18e40 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
18e50 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
18e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18e70 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
18e80 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
18e90 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
18ea0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  }.../*.** Mark a
18eb0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
18ec0 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
18ed0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
18ee0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
18ef0 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
18f00 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
18f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
18f20 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
18f30 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
18f40 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
18f50 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
18f60 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
18f70 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
18f80 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
18f90 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
18fa0 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
18fb0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
18fc0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
18fd0 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
18fe0 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
18ff0 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
19000 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19010 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
19020 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
19030 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
19040 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
19050 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
19060 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
19070 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
19080 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
19090 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
190a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
190b0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
190c0 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
190d0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
190e0 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
190f0 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
19100 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19110 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
19120 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
19130 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
19140 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
19150 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
19160 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
19170 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
19180 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
19190 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
191a0 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
191b0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
191c0 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
191d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
191e0 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
191f0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
19200 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
19210 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
19220 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
19230 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
19240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19250 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
19260 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
19270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
19280 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
19290 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
192a0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
192b0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
192c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
192d0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
192e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
192f0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
19300 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
19310 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
19320 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
19330 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
19340 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19350 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
19360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
19370 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
19380 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
19390 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
193a0 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  );.  if( pPg->in
193b0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d  Journal && (pPg-
193c0 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65  >inStmt || pPage
193d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
193e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
193f0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
19400 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
19410 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
19420 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
19430 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
19440 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
19450 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
19460 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
19470 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
19480 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
19490 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
194a0 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
194b0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
194c0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
194d0 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
194e0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
194f0 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
19500 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
19510 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19520 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
19530 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
19540 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
19550 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20  gin(pData, 0);. 
19560 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
19580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
19590 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
195a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
195b0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
195c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
195d0 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
195e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
195f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
19600 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
19610 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
19620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19630 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19640 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19660 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
19670 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
19680 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
19690 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
196a0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
196b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
196c0 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
196d0 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
196e0 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
196f0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
19700 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
19710 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
19720 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
19730 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
19740 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
19750 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
19760 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
19770 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
19780 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
19790 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
197a0 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
197b0 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
197c0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
197d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
197e0 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
197f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
19800 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
19810 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
19820 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
19830 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
19840 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 33            TRACE3
19850 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
19860 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
19870 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
19880 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
19890 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
198a0 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Orig==0 );.     
198b0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
198c0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
198d0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
198e0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
198f0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
19900 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
19910 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
19920 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
19930 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
19940 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
19950 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19970 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73      u32 cksum, s
19980 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  aved;.          
19990 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70  char *pData2, *p
199a0 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  End;.          /
199b0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
199c0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
199d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
199e0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
199f0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
19a00 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
19a10 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
19a20 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
19a30 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
19a40 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
19a50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19a60 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
19a70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
19a80 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
19a90 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
19aa0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
19ab0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
19ac0 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
19ad0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
19ae0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
19af0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  a2);.          p
19b00 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70  End = pData2 + p
19b10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19b20 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
19b30 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  2 -= 4;.        
19b40 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
19b50 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  )pEnd;.         
19b60 20 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c   put32bits(pEnd,
19b70 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
19b80 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
19b90 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
19ba0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
19bb0 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
19bc0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
19bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19be0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
19bf0 20 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a   pData2, szPg);.
19c00 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
19c10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
19c20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
19c30 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20  TRACE4("JOURNAL 
19c40 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
19c50 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
19c70 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19c80 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
19c90 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
19ca0 20 20 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d     *(u32*)pEnd =
19cb0 20 73 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41   saved;...  /* A
19cc0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
19cd0 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
19ce0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
19cf0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   The .          
19d00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
19d10 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
19d20 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
19d30 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20  above..         
19d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
19d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
19d70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19d80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
19d90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
19da0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19db0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
19dc0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
19dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
19de0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
19df0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
19e00 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
19e10 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
19e20 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
19e30 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  Sync;.          
19e40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
19e50 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
19e60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
19e70 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
19e80 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
19e90 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
19ea0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
19eb0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
19ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19ed0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
19ee0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
19ef0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
19f00 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
19f10 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
19f20 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52  Sync;.        TR
19f30 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
19f40 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
19f50 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
19f60 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
19f70 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
19f80 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
19f90 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
19fa0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
19fb0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
19fc0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
19fd0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
19fe0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
19ff0 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
1a000 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
1a010 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1a020 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
1a030 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
1a040 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
1a050 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1a060 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
1a070 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
1a080 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
1a090 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1a0a0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
1a0b0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
1a0c0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
1a0d0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
1a0e0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
1a0f0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
1a100 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
1a110 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1a120 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
1a130 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
1a140 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1a150 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1a160 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ze ){.      asse
1a170 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1a180 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1a190 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1a1a0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
1a1b0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1a1c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1a1d0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1a1e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1a1f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
1a200 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
1a210 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
1a220 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
1a230 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1a240 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a250 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1a260 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1a270 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1a280 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
1a290 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1a2a0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1a2b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
1a2c0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
1a2d0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1a2e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1a2f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1a300 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
1a310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
1a320 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
1a330 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1a340 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
1a350 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  -4;.        put3
1a360 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
1a370 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1a380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a390 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74  Write(pPager->st
1a3a0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
1a3b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b  er->pageSize+4);
1a3c0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
1a3d0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1a3e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1a3f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1a400 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1a410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1a450 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1a460 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1a470 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1a480 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1a490 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1a4a0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1a4b0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1a4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a4d0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1a4e0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
1a4f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1a500 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1a510 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1a520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1a530 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1a540 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1a550 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1a560 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1a570 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1a580 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1a590 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1a5a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1a5b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1a5c0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1a5d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a5e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1a5f0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
1a600 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1a610 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
1a620 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
1a630 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  o sqlite3pager_w
1a640 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1a650 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1a660 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1a670 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1a680 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1a690 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1a6a0 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1a6b0 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
1a6c0 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
1a6d0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
1a6e0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1a6f0 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
1a700 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
1a710 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1a720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
1a730 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
1a740 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1a750 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
1a760 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
1a770 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
1a780 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
1a790 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1a7a0 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  _overwrite(Pager
1a7b0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1a7c0 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
1a7d0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
1a7e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
1a7f0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1a800 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  _get(pPager, pgn
1a810 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  o, &pPage);.  if
1a820 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a830 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a840 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1a850 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1a860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a870 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
1a880 67 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  ge, pData, pPage
1a890 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1a8a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
1a8b0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1a8c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a8d0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1a8e0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1a8f0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1a900 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1a910 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1a920 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1a930 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1a940 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62  on page "pgno" b
1a950 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
1a960 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
1a970 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
1a980 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
1a990 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
1a9a0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
1a9b0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
1a9c0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
1a9d0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
1a9e0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
1a9f0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
1aa00 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
1aa10 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1aa20 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
1aa30 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
1aa40 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
1aa50 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
1aa60 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
1aa70 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
1aa80 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
1aa90 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
1aaa0 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
1aab0 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
1aac0 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
1aad0 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
1aae0 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
1aaf0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
1ab00 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
1ab10 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
1ab20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ab30 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
1ab40 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1ab50 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
1ab60 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1ab70 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  o sqlite3pager_d
1ab80 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1ab90 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
1aba0 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
1abb0 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
1abc0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1abd0 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
1abe0 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
1abf0 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
1ac00 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1ac10 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1ac20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
1ac30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1ac40 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
1ac50 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1ac60 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
1ac70 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
1ac80 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
1ac90 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
1aca0 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
1acb0 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
1acc0 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
1acd0 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
1ace0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1acf0 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
1ad00 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
1ad10 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
1ad20 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
1ad30 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
1ad40 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
1ad50 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
1ad60 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
1ad70 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
1ad80 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1ad90 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
1ada0 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
1adb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1adc0 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
1add0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ade0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1adf0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1ae00 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1ae10 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
1ae20 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1ae30 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
1ae40 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65  pPg!=0 );  /* We
1ae50 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e   never call _don
1ae60 74 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74  t_write unless t
1ae70 68 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65  he page is in me
1ae80 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61  m */.  pPg->alwa
1ae90 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
1aea0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1aeb0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
1aec0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66  tInUse ){.    if
1aed0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1aee0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
1aef0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
1af00 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
1af10 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
1af20 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
1af30 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1af40 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
1af50 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
1af60 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
1af70 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1af80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1af90 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
1afa0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
1afb0 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
1afc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1afd0 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
1afe0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1aff0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
1b000 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
1b010 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
1b020 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
1b030 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
1b040 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
1b050 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
1b060 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
1b070 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
1b080 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b090 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
1b0a0 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
1b0b0 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
1b0c0 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
1b0d0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
1b0e0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
1b0f0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
1b100 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1b110 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
1b120 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
1b130 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
1b140 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50  f %d\n", pgno, P
1b150 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1b160 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
1b170 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
1b180 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1b190 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1b1a0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1b1b0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1b1c0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
1b1d0 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1b1e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1b1f0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1b200 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1b210 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1b220 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1b230 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1b240 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1b250 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1b260 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1b270 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1b280 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1b290 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1b2a0 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1b2b0 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
1b2c0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1b2d0 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
1b2e0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
1b2f0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
1b300 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
1b310 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1b320 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61  Pg->pPager;..  a
1b330 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b340 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1b350 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  RVED );.  if( pP
1b360 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b370 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
1b380 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
1b390 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
1b3a0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1b3b0 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
1b3c0 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
1b3d0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1b3e0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
1b3f0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1b400 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
1b410 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1b420 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
1b430 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1b440 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
1b450 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1b460 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
1b470 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1b480 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1b490 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
1b4a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1b4b0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1b4c0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1b4d0 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
1b4e0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1b4f0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
1b500 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
1b510 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
1b520 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1b530 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b540 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
1b550 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
1b560 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
1b570 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1b580 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1b590 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
1b5a0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1b5b0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
1b5c0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1b5d0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
1b5e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1b5f0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Stmt!=0 );.    p
1b600 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1b610 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1b620 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1b630 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f  .    page_add_to
1b640 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1b650 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
1b660 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
1b670 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1b680 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
1b690 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
1b6a0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
1b6b0 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
1b6c0 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
1b6d0 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
1b6e0 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
1b6f0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b700 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
1b710 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
1b720 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
1b730 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
1b740 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
1b750 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1b760 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
1b770 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
1b780 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1b790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
1b7a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1b7b0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1b7c0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
1b7d0 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
1b7e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1b7f0 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22  ;.  }.  TRACE2("
1b800 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
1b810 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1b820 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1b830 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
1b840 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
1b850 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
1b860 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
1b870 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1b880 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
1b890 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
1b8a0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1b8b0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
1b8c0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1b8d0 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
1b8e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1b8f0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1b900 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1b910 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1b920 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1b930 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
1b940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1b950 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
1b960 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1b970 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
1b980 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
1b990 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
1b9a0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
1b9b0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1b9c0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1b9d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
1b9e0 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
1b9f0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1ba00 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1ba10 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
1ba20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
1ba30 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
1ba40 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
1ba50 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1ba60 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1ba70 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
1ba80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ba90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1baa0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1bab0 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  che==0 ){.    /*
1bac0 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
1bad0 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
1bae0 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
1baf0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61  lite3OsSync() ca
1bb00 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74  lls).    ** if t
1bb10 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
1bb20 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  o changes to the
1bb30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1bb40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1bb50 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d  Pager->needSync=
1bb60 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
1bb70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1bb80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1bb90 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1bba0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
1bbb0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bbc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bbd0 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
1bbe0 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1bbf0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
1bc00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bc10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1bc20 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1bc30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1bc40 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1bc50 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1bc60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
1bc70 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
1bc80 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
1bc90 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
1bca0 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
1bcb0 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
1bcc0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
1bcd0 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
1bce0 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
1bcf0 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
1bd00 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
1bd10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bd20 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1bd30 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1bd40 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
1bd50 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
1bd60 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
1bd70 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
1bd80 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
1bd90 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1bda0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
1bdb0 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
1bdc0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1bdd0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
1bde0 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
1bdf0 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
1be00 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
1be10 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
1be20 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
1be30 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
1be40 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
1be50 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
1be60 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
1be70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1be80 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1be90 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
1bea0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1beb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
1bec0 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
1bed0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1bee0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1bef0 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
1bf00 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
1bf10 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1bf20 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
1bf30 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1bf40 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
1bf50 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
1bf60 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1bf70 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
1bf80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1bf90 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1bfa0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1bfb0 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
1bfc0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1bfd0 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1bfe0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1bff0 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
1c000 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
1c010 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1c020 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
1c030 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1c040 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1c050 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1c060 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1c070 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1c080 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
1c090 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
1c0a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
1c0b0 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
1c0c0 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
1c0d0 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1c0e0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1c0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c100 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64   TRACE3("PAGE %d
1c110 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
1c120 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1c130 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
1c150 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
1c160 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
1c170 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
1c180 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1c190 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
1c1a0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
1c1b0 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
1c1c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c1d0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
1c1e0 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
1c1f0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1c200 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
1c210 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  (p), pPager->pag
1c220 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
1c230 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1c240 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1c250 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1c260 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c270 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1c280 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
1c290 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1c2a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1c2b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1c2c0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c2d0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1c2e0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1c2f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c300 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1c310 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
1c320 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c330 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1c340 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1c350 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
1c360 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c370 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
1c380 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
1c390 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
1c3a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c3b0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
1c3c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c3d0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
1c3e0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
1c3f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1c400 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1c410 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1c420 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1c430 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c440 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
1c450 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
1c460 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
1c470 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
1c480 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20  Pager);.    rc2 
1c490 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1c4a0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1c4b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c4c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1c4d0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
1c4e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
1c4f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1c500 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ger);.  }.  pPag
1c510 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1c520 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
1c530 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
1c540 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
1c550 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
1c560 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
1c570 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
1c580 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
1c590 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
1c5a0 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
1c5b0 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e   .  ** persisten
1c5c0 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  t..  */.  return
1c5d0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1c5e0 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
1c5f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1c600 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1c610 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
1c620 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
1c630 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
1c640 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
1c650 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
1c660 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1c670 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  3pager_isreadonl
1c680 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
1c690 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1c6a0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
1c6b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c6c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1c6d0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1c6e0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1c6f0 65 33 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  e3pager_refcount
1c700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c710 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1c720 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
1c730 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1c740 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c750 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1c760 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
1c770 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
1c780 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
1c790 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
1c7a0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
1c7b0 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
1c7c0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
1c7d0 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
1c7e0 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
1c7f0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
1c800 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
1c810 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
1c820 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
1c830 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
1c840 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
1c850 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
1c860 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
1c870 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
1c880 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
1c890 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
1c8a0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
1c8b0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
1c8c0 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
1c8d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1c8e0 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
1c8f0 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
1c900 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c910 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
1c920 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
1c930 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1c940 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
1c950 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
1c960 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
1c970 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
1c980 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
1c990 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
1c9a0 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
1c9b0 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
1c9c0 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
1c9d0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1c9e0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
1c9f0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
1ca00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1ca10 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
1ca20 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
1ca30 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1ca40 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
1ca50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ca60 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
1ca70 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
1ca80 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
1ca90 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1caa0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1cab0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1cac0 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
1cad0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1cae0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1caf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cb00 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
1cb10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cb20 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
1cb30 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1cb40 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1cb50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1cb60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cb70 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1cb80 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1cb90 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1cba0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1cbb0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
1cbc0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
1cbd0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
1cbe0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1cbf0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
1cc00 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
1cc10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1cc20 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
1cc30 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
1cc40 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1cc50 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
1cc60 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
1cc70 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1cc80 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1cc90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1cca0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
1ccb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ccc0 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
1ccd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
1cce0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
1ccf0 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
1cd00 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
1cd10 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
1cd20 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
1cd30 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
1cd40 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
1cd50 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
1cd60 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
1cd70 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
1cd80 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1cd90 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
1cda0 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b   &pPager->stfd);
1cdb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1cdc0 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
1cdd0 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
1cde0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
1cdf0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1ce00 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
1ce10 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1ce20 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
1ce30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
1ce40 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
1ce50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1ce60 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
1ce70 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
1ce80 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
1ce90 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1cea0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1ceb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
1cec0 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
1ced0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1cee0 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
1cef0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1cf00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1cf10 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1cf20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
1cf30 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22  xt;.    TRACE2("
1cf40 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
1cf50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1cf60 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
1cf70 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
1cf80 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
1cf90 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
1cfa0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
1cfb0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
1cfc0 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
1cfd0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
1cfe0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1cff0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1d000 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
1d010 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70   }.    for(pPg=p
1d020 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1d030 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
1d040 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67       pNext = pPg
1d050 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20  ->pNextStmt;.   
1d060 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1d070 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  inStmt );.      
1d080 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
1d090 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1d0a0 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1d0b0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1d0c0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1d0d0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1d0e0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1d0f0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1d100 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
1d110 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
1d120 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1d130 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1d140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d150 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1d160 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
1d170 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1d180 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1d190 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
1d1a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1d1b0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1d1c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d1d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1d1e0 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
1d1f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1d200 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b  er_stmt_rollback
1d210 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d220 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1d230 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1d240 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32  se ){.    TRACE2
1d250 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
1d260 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1d270 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1d280 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1d290 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1d2a0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1d2b0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1d2c0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  g=pPg->pNextStmt
1d2d0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1d2e0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1d2f0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1d300 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1d310 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1d320 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1d330 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
1d340 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
1d350 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
1d360 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1d370 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1d380 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1d390 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
1d3a0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1d3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d3c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1d3d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
1d3e0 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d  tSize;.      mem
1d3f0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
1d400 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1d410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d420 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d430 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
1d440 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1d450 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
1d460 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
1d470 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
1d480 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1d490 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
1d4a0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1d4b0 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1d4c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1d4d0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
1d4e0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
1d4f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1d500 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1d510 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
1d520 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d530 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1d540 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
1d550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1d560 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
1d570 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d580 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1d590 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72  sqlite3pager_dir
1d5a0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1d5b0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1d5c0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
1d5d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d5e0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1d5f0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
1d600 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
1d610 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
1d620 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65  ager_journalname
1d630 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d640 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1d650 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
1d660 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1d670 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
1d680 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
1d690 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
1d6a0 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
1d6b0 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
1d6c0 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
1d6d0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1d6e0 33 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61  3pager_nosync(Pa
1d6f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d700 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
1d710 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oSync;.}../*.** 
1d720 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
1d730 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
1d740 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1d750 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50  r_set_codec(.  P
1d760 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
1d770 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
1d780 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
1d790 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
1d7a0 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
1d7b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
1d7c0 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
1d7d0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
1d7e0 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  decArg;.}../*.**
1d7f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1d800 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
1d810 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
1d820 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
1d830 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
1d840 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
1d850 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
1d860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1d870 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d880 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
1d890 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ger){.  void *pP
1d8a0 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  age;.  PgHdr *pP
1d8b0 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
1d8c0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
1d8d0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  t rc;..  /* Open
1d8e0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
1d8f0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
1d900 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1d910 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1d920 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a  er, 1, &pPage);.
1d930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d940 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1d950 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1d960 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1d970 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1d980 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1d990 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  rc;..  /* Read t
1d9a0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1d9b0 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   at byte 24. */.
1d9c0 20 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f    pPgHdr = DATA_
1d9d0 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b  TO_PGHDR(pPage);
1d9e0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1d9f0 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  r = retrieve32bi
1da00 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  ts(pPgHdr, 24);.
1da10 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1da20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1da30 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1da40 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1da50 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
1da60 75 6e 74 65 72 2b 2b 3b 0a 20 20 70 75 74 33 32  unter++;.  put32
1da70 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48  bits(((char*)PGH
1da80 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
1da90 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  r))+24, change_c
1daa0 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 52  ounter);..  /* R
1dab0 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
1dac0 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
1dad0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1dae0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ef(pPage);.  ret
1daf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1db00 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1db10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1db20 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1db30 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1db40 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1db50 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1db60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1db70 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1db80 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1db90 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1dba0 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1dbb0 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1dbc0 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1dbd0 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1dbe0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1dbf0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1dc00 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1dc10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1dc20 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1dc30 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1dc40 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1dc50 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1dc60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dc70 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1dc80 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1dc90 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1dca0 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1dcb0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1dcc0 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1dcd0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1dce0 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1dcf0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1dd00 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1dd10 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1dd20 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1dd30 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1dd40 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1dd50 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1dd60 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1dd70 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20  te3pager_sync() 
1dd80 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
1dd90 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
1dda0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1ddb0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1ddc0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
1ddd0 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
1dde0 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
1ddf0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1de00 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
1de10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1de20 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1de30 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1de40 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
1de50 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1de60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52  SQLITE_OK;..  TR
1de70 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1de80 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1de90 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1dea0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1deb0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1dec0 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1ded0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1dee0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1def0 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1df00 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1df10 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1df20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1df30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1df40 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1df50 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1df60 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1df70 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1df80 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1df90 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1dfa0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1dfb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1dfc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1dfd0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61  ..    /* If a ma
1dfe0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1dff0 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
1e000 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1e010 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  to the.    ** jo
1e020 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
1e030 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75   no sync is requ
1e040 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65  ired. This happe
1e050 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ns when it is.  
1e060 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68    ** written, th
1e070 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66  en the process f
1e080 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20  ails to upgrade 
1e090 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1e0a0 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  to an.    ** EXC
1e0b0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
1e0c0 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70   next time the p
1e0d0 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20  rocess tries to 
1e0e0 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a  commit the.    *
1e0f0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
1e100 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20  e m-j name will 
1e110 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1e120 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  n written..    *
1e130 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1e140 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a  r->setMaster ){.
1e150 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1e160 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1e170 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1e180 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e190 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1e1a0 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
1e1b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e1c0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1e1d0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1e1e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1e1f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1e200 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1e210 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1e220 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1e230 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
1e240 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
1e250 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
1e260 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1e270 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1e280 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1e290 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1e2a0 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
1e2b0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  pPage;.        i
1e2c0 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
1e2d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1e2e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
1e2f0 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
1e300 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1e310 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
1e320 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
1e330 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
1e340 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
1e350 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
1e360 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1e370 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1e380 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
1e390 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1e3a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e3b0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1e3c0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1e3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1e3e0 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1e400 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1e410 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e420 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e430 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1e440 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1e450 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20   }.        } .  
1e460 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e470 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
1e480 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1e490 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1e4a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e4b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1e4c0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20  _exit;.      rc 
1e4d0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1e4e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1e4f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e500 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1e510 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
1e520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e530 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
1e540 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1e550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1e560 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1e570 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
1e580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e590 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1e5a0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
1e5b0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
1e5c0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
1e5d0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1e5e0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
1e5f0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
1e600 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
1e610 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
1e620 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1e630 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
1e640 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e650 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1e660 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
1e670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e680 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
1e690 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1e6a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e6b0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1e6c0 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
1e6d0 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1e6e0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1e6f0 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
1e700 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
1e710 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
1e720 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
1e730 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1e740 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
1e750 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1e760 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1e770 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1e780 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1e790 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1e7a0 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1e7b0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1e7c0 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1e7d0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1e7e0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1e7f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1e800 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1e810 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1e820 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1e830 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1e840 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1e850 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1e860 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1e870 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1e880 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1e890 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1e8a0 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1e8b0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1e8c0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1e8d0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1e8e0 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1e8f0 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1e900 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1e910 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1e920 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1e930 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1e940 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1e950 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1e960 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1e970 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1e980 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1e990 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1e9a0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1e9b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1e9c0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1e9d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e9e0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1e9f0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1ea00 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1ea10 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1ea20 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1ea30 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1ea40 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1ea50 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1ea60 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1ea70 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1ea80 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1ea90 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1eaa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1eab0 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1eac0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1ead0 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1eae0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1eaf0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1eb00 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1eb10 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1eb20 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1eb30 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1eb40 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1eb50 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1eb60 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1eb70 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1eb80 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1eb90 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1eba0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1ebb0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1ebc0 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1ebd0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1ebe0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1ebf0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1ec00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1ec10 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1ec20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1ec30 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1ec40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1ec50 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1ec60 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1ec70 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1ec80 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1ec90 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1eca0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1ecb0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1ecc0 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1ecd0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1ece0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1ecf0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1ed00 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1ed10 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1ed20 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1ed30 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1ed40 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1ed50 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1ed60 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1ed70 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1ed80 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1ed90 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1eda0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1edb0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1edc0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1edd0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1ede0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1edf0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1ee00 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1ee10 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
1ee20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28  pPgOld);.    if(
1ee30 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1ee40 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1ee50 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1ee60 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1ee70 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1ee80 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1ee90 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1eea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1eeb0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1eec0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1eed0 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1eee0 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1eef0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1ef00 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1ef10 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1ef20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67  pgno!=0 );.  pPg
1ef30 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
1ef40 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
1ef50 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
1ef60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
1ef70 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
1ef80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
1ef90 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1efa0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1efb0 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1efc0 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1efd0 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
1efe0 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1eff0 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
1f000 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
1f010 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
1f020 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69  h = 0;..  makeDi
1f030 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
1f040 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1f050 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
1f060 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
1f070 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
1f080 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
1f090 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1f0a0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
1f0b0 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
1f0c0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
1f0d0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1f0e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
1f0f0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
1f100 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
1f110 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
1f120 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
1f130 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
1f140 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61   .    ** Pager.a
1f150 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
1f160 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
1f170 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
1f180 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
1f190 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
1f1a0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
1f1b0 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
1f1c0 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1f1d0 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
1f1e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
1f1f0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
1f200 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
1f210 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
1f220 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
1f230 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
1f240 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1f250 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
1f260 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
1f270 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53 79     void *pNeedSy
1f280 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nc;.    assert( 
1f290 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1f2a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1f2b0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1f2c0 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
1f2d0 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29 3b  no, &pNeedSync);
1f2e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f2f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1f300 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
1f310 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1f320 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28    DATA_TO_PGHDR(
1f330 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64  pNeedSync)->need
1f340 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41  Sync = 1;.    DA
1f350 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1f360 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61  dSync)->inJourna
1f370 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
1f380 69 72 74 79 28 44 41 54 41 5f 54 4f 5f 50 47 48  irty(DATA_TO_PGH
1f390 44 52 28 70 4e 65 65 64 53 79 6e 63 29 29 3b 0a  DR(pNeedSync));.
1f3a0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1f3b0 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e 63  _unref(pNeedSync
1f3c0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1f3d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1f3e0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1f3f0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1f400 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1f410 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1f420 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
1f430 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69   state of the fi
1f440 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20  le lock for the 
1f450 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
1f460 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1f470 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f   is one of NO_LO
1f480 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
1f490 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a   RESERVED_LOCK,.
1f4a0 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c  ** PENDING_LOCK,
1f4b0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
1f4c0 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
1f4d0 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74  e3pager_lockstat
1f4e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1f4f0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1f500 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70 50  e3OsLockState(pP
1f510 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e  ager->fd);.}.#en
1f520 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1f530 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
1f540 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
1f550 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
1f560 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
1f570 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
1f580 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1f590 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
1f5a0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
1f5b0 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
1f5c0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1f5d0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1f5e0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
1f5f0 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
1f600 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
1f610 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1f620 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25  "PAGE %3d addr=%
1f630 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  p nRef=%d\n", . 
1f640 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
1f650 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1f660 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
1f670 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
1f680 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f690 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.