/ Hex Artifact Content
Login

Artifact c78d1cc1a02d9c6ab3263c3ca757e4466973fa2a:


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 38  : pager.c,v 1.28
0350: 35 20 32 30 30 37 2f 30 33 2f 30 34 20 31 33 3a  5 2007/03/04 13:
0360: 31 35 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a  15:28 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 2d 33 64 20 74 6f  =%p nRef=%-3d to
4320: 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  tal=%d\n",.     
4330: 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52    p->pgno, PGHDR
4340: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
4350: 6e 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d  nRef, p->pPager-
4360: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4370: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
4380: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
4390: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
43a0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
43b0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
43c0: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
43d0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
43e0: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  O(X).#endif.../*
43f0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
4400: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
4410: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
4420: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
4430: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
4440: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4450: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
4460: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
4470: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
4480: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
4490: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
44a0: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
44b0: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
44c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
44d0: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
44e0: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
44f0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
4500: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
4510: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
4520: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
4530: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
4540: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
4550: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4560: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
4570: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
4580: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
4590: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
45a0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
45b0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
45c0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
45d0: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
45e0: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
45f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4600: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
4610: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
4620: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
4630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4640: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
4650: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
4660: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
4670: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
4680: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
4690: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
46a0: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
46b0: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
46c0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
46d0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
46e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
46f0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4700: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
4710: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4720: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
4730: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
4740: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
4750: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4760: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4770: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
4780: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4790: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
47a0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
47b0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
47c0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
47d0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
47e0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
47f0: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4800: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4810: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4820: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4830: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4840: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
4850: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4860: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4870: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4880: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4890: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
48a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
48b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
48c0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
48d0: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
48e0: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
48f0: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4910: 70 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a  put32bits(char *
4920: 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  ac, u32 val){.  
4930: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
4940: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
4950: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4960: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4970: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4980: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4990: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
49a0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
49b0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
49c0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
49d0: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
49e0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
49f0: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4a00: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4a10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4a30: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
4a40: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
4a50: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4a60: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4a70: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4a80: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
4a90: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
4aa0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
4ab0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
4ac0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
4ad0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
4ae0: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
4af0: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
4b00: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4b10: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4b20: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4b30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4b40: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4b50: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4b60: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4b70: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4b80: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4b90: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4ba0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4bb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
4bc0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
4bd0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
4be0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
4bf0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
4c00: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
4c10: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
4c20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4c30: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
4c40: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
4c50: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
4c60: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
4c70: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
4c80: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
4c90: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
4ca0: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
4cb0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4cc0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
4cd0: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
4ce0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4cf0: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
4d00: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
4d10: 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52  UPT or SQLITE_PR
4d20: 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65  OTOCOL,.** the e
4d30: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4d40: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4d50: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4d60: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4d70: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4d80: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4d90: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4db0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4dc0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4dd0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
4de0: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
4df0: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
4e00: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4e10: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
4e20: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
4e30: 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63 32 3d  .  if( .    rc2=
4e40: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
4e50: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4e60: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
4e70: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
4e80: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4e90: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29  ITE_PROTOCOL.  )
4ea0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4eb0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
4ec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4ed0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
4ee0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
4ef0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
4f00: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
4f10: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
4f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4f30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
4f40: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  Hdr *pPage){.  u
4f50: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4f60: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
4f70: 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28   char *pData = (
4f80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4f90: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
4fa0: 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  age);.  for(i=0;
4fb0: 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72   i<pPage->pPager
4fc0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29  ->pageSize; i++)
4fd0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4fe0: 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a  sh+i)^pData[i];.
4ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5000: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  h;.}../*.** The 
5010: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
5020: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
5030: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
5040: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
5050: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
5060: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
5070: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
5080: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
5090: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
50a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
50b0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
50c0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
50d0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
50e0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
50f0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
5100: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
5110: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
5120: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
5130: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
5140: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5150: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
5160: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
5170: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
5180: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
5190: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
51a0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
51b0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
51c0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
51d0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
51e0: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
51f0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5200: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5210: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5220: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5230: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
5240: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5250: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
5260: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
5270: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
5280: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
5290: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
52a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
52b0: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
52c0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
52d0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
52e0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
52f0: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
5300: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
5310: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
5320: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
5330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5340: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
5350: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
5360: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
5370: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5380: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5390: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
53a0: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
53b0: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
53c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
53d0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
53e0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
53f0: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
5400: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
5410: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
5420: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
5430: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
5440: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
5450: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5460: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5470: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5480: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
5490: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
54a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
54b0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
54c0: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
54d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
54e0: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
54f0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5500: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
5510: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5520: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5530: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5540: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
5550: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5560: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5570: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5580: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
5590: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
55a0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
55b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
55c0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
55d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
55e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
55f0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
5600: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5610: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5620: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
5630: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
5640: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
5650: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
5660: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5670: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5680: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
5690: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
56a0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
56b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
56c0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
56d0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
56e0: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
56f0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
5700: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
5710: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
5720: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
5730: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5740: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5750: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5760: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
5770: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
5780: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
5790: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
57a0: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
57b0: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
57c0: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
57d0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
57e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
57f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5800: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
5810: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
5820: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
5830: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
5840: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
5850: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5860: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5870: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
5880: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
5890: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
58a0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
58b0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
58c0: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
58d0: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
58e0: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
58f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5900: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
5910: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
5920: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
5930: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
5940: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
5950: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
5960: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
5970: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
5980: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
5990: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
59a0: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
59b0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
59c0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
59d0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
59e0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
59f0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
5a00: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
5a30: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5a40: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
5a50: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
5a60: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5a70: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
5a80: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5a90: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
5aa0: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
5ab0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
5ac0: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
5ad0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5ae0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
5af0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
5b00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5b10: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
5b20: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
5b30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5b40: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
5b50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5b60: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
5b70: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
5b80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5b90: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5ba0: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
5bb0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
5bc0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
5bd0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
5be0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5bf0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
5c00: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5c10: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
5c20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5c30: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5c40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5c50: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5c60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5c70: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5c80: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5c90: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5ca0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5cb0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5cc0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5cd0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5ce0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
5cf0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
5d00: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
5d10: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
5d20: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
5d30: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5d40: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5d50: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5d60: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5d70: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5d80: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5d90: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5da0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5db0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5dc0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5dd0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5de0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5df0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5e00: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5e10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5e20: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5e30: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5e40: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5e50: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5e60: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5e80: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5e90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5ea0: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
5eb0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5ec0: 69 63 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20  ic)+16];..  int 
5ed0: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
5ee0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
5ef0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5f00: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
5f10: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5f20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5f30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5f40: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5f50: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5f60: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5f70: 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20  ournalHdr;.  }. 
5f80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5f90: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
5fa0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
5fb0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
5fc0: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
5fd0: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
5fe0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
5ff0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
6000: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
6010: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
6020: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
6030: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
6040: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
6050: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
6060: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
6070: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
6080: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
6090: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
60a0: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
60b0: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
60c0: 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  is..  */.  memcp
60d0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
60e0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
60f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
6100: 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20  ;.  /* The nRec 
6110: 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46  Field. 0xFFFFFFF
6120: 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f  F for no-sync jo
6130: 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74  urnals. */.  put
6140: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6150: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6160: 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
6170: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
6180: 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54  fff : 0);.  /* T
6190: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
61a0: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
61b0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61   */ .  sqlite3Ra
61c0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
61d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
61e0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
61f0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
6200: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6210: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6220: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
6230: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
6240: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
6250: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
6260: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6270: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6280: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
6290: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
62a0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
62b0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
62c0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
62d0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
62e0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
62f0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
6300: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
6310: 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
6320: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
6330: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
6340: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
6350: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
6360: 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ).  rc = sqlite3
6370: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6380: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
6390: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a  zeof(zHeader));.
63a0: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
63b0: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
63c0: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
63d0: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
63e0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
63f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
6400: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6410: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
6420: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
6430: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6440: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
6450: 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e  "JTAIL %p %lld\n
6460: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
6470: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
6480: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
6490: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
64a0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
64b0: 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20  urnalOff-1);.   
64c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
64d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
64e0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
64f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
6500: 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  00", 1);.    }. 
6510: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6520: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6530: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6540: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
6550: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
6560: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
6570: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
6580: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
6590: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
65a0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
65b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
65c0: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
65d0: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
65e0: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
65f0: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
6600: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
6610: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6620: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
6630: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
6640: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
6650: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
6660: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
6670: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
6680: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
6690: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
66a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
66b0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
66c0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
66d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
66e0: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
66f0: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
6700: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
6710: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
6720: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
6730: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
6740: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6750: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
6760: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
6770: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6780: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
6790: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
67a0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
67b0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
67c0: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
67d0: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
67e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
67f0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
6800: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6810: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
6820: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
6830: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
6840: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
6850: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
6860: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
6870: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
6880: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
6890: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
68a0: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
68b0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
68c0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
68d0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
68e0: 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ader */..  rc = 
68f0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6900: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
6910: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6920: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
6930: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
6940: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
6950: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
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 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
6990: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
69a0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
69b0: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
69c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
69d0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
69e0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
69f0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6a00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
6a10: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
6a20: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
6a30: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6a40: 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  jfd, pNRec);.  i
6a50: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6a60: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6a70: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6a80: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  d, &pPager->cksu
6a90: 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63  mInit);.  if( rc
6aa0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6ab0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6ac0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
6ad0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
6ae0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6af0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
6b00: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
6b10: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
6b20: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
6b30: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
6b40: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
6b50: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
6b60: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
6b70: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
6b80: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
6b90: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
6ba0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
6bb0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
6bc0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
6bd0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6be0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
6bf0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
6c00: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
6c10: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
6c20: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
6c30: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
6c40: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6c50: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26  r->jfd, (u32 *)&
6c60: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
6c70: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
6c80: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
6c90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6ca0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
6cb0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  SZ(pPager);.  rc
6cc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
6cd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
6ce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6cf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
6d00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
6d10: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
6d20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6d30: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
6d40: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
6d50: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
6d60: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
6d70: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
6d80: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
6d90: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
6da0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
6db0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
6dc0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
6dd0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
6de0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
6df0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
6e00: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
6e10: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
6e20: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
6e30: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
6e40: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
6e50: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
6e60: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
6e70: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
6e80: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
6e90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ea0: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
6eb0: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
6ec0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
6ed0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
6ee0: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
6ef0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
6f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
6f10: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
6f20: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
6f30: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
6f40: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
6f50: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
6f60: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
6f70: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
6f80: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
6f90: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
6fa0: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
6fb0: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
6fc0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
6fd0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
6fe0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
6ff0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
7000: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
7010: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
7020: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
7030: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20  u32 cksum = 0;. 
7040: 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f   char zBuf[sizeo
7050: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7060: 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a  +2*4];..  if( !z
7070: 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72  Master || pPager
7080: 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74  ->setMaster) ret
7090: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
70a0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
70b0: 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d  er = 1;..  len =
70c0: 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29   strlen(zMaster)
70d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
70e0: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
70f0: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69  sum += zMaster[i
7100: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
7110: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
7120: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
7130: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
7140: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
7150: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
7160: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
7170: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
7180: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
7190: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
71a0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
71b0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
71c0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
71d0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
71e0: 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
71f0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
7200: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
7210: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
7220: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7240: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
7250: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
7260: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7270: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
7280: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
7290: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
72a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
72b0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
72c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
72d0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
72e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
72f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7300: 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c   put32bits(zBuf,
7310: 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69   len);.  put32bi
7320: 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73  ts(&zBuf[4], cks
7330: 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a  um);.  memcpy(&z
7340: 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c  Buf[8], aJournal
7350: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
7360: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
7370: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
7380: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
7390: 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66  , zBuf, 8+sizeof
73a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
73b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
73c0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
73d0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
73e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
73f0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
7400: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
7410: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
7420: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
7430: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7440: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
7450: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
7460: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
7470: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
7480: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
7490: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
74a0: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
74b0: 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
74c0: 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a  stmt_commit().**
74d0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43   routine run MUC
74e0: 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  H faster for the
74f0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7500: 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e  re there are man
7510: 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65  y.** pages in me
7520: 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20  mory but only a 
7530: 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73  few are in the s
7540: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7560: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
7570: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
7580: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
7590: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
75a0: 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  r;.  if( pPg->in
75b0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
75c0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
75d0: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50  revStmt==0 && pP
75e0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  g->pNextStmt==0 
75f0: 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  );.  pPg->pPrevS
7600: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tmt = 0;.  if( p
7610: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
7620: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
7630: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
7640: 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
7650: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
7660: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67  r->pStmt;.  pPag
7670: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
7680: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
7690: 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   1;.}.static voi
76a0: 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72  d page_remove_fr
76b0: 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  om_stmt_list(PgH
76c0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
76d0: 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72  !pPg->inStmt ) r
76e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
76f0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20  ->pPrevStmt ){. 
7700: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7710: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
7720: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
7730: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
7740: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67  >pNextStmt = pPg
7750: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7760: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7770: 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
7780: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
7790: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
77a0: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
77b0: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Stmt;.  }.  if( 
77c0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29  pPg->pNextStmt )
77d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
77e0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
77f0: 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  revStmt==pPg );.
7800: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74      pPg->pNextSt
7810: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
7820: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a  pPg->pPrevStmt;.
7830: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
7840: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
7850: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7860: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
7870: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
7880: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
7890: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
78a0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
78b0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
78c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
78d0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
78e0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
78f0: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
7900: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
7910: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
7920: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
7930: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
7940: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7950: 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48    p = pPager->aH
7960: 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67  ash[pgno & (pPag
7970: 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20  er->nHash-1)];. 
7980: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
7990: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
79a0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
79b0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
79c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
79d0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
79e0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   file..**.** Onc
79f0: 65 20 61 6c 6c 20 6c 6f 63 6b 73 20 68 61 76 65  e all locks have
7a00: 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   been removed fr
7a10: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
7a20: 66 69 6c 65 2c 20 6f 74 68 65 72 0a 2a 2a 20 70  file, other.** p
7a30: 72 6f 63 65 73 73 65 73 20 6f 72 20 74 68 72 65  rocesses or thre
7a40: 61 64 73 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ads might change
7a50: 20 74 68 65 20 66 69 6c 65 2e 20 20 53 6f 20 6d   the file.  So m
7a60: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6f 66 0a  ake sure all of.
7a70: 2a 2a 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  ** our internal 
7a80: 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
7a90: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
7aa0: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
7ab0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
7ac0: 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  {.  if( !MEMDB )
7ad0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55  {.    sqlite3OsU
7ae0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
7af0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
7b00: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
7b10: 20 2d 31 3b 0a 20 20 20 20 49 4f 54 52 41 43 45   -1;.    IOTRACE
7b20: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
7b30: 20 70 50 61 67 65 72 29 29 0a 20 20 7d 0a 20 20   pPager)).  }.  
7b40: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
7b50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
7b60: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7b70: 70 41 6c 6c 3d 3d 30 20 29 3b 0a 7d 0a 0a 0a 2f  pAll==0 );.}.../
7b80: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
7b90: 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65  database and cle
7ba0: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
7bb0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
7bc0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
7bd0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
7be0: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
7bf0: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
7c00: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
7c10: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
7c20: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
7c30: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
7c40: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
7c50: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
7c60: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
7c70: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
7c80: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
7c90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7ca0: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
7cb0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
7cc0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
7cd0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
7ce0: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
7cf0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
7d00: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7d10: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
7d20: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
7d30: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
7d40: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
7d50: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
7d60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
7d70: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
7d80: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
7d90: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
7da0: 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  All = 0;.  pPage
7db0: 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->nHash = 0;.  
7dc0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
7dd0: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
7de0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7df0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
7e00: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
7e10: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
7e20: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
7e30: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
7e40: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
7e50: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
7e60: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
7e70: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
7e80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7e90: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61  >errCode || (pPa
7ea0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7eb0: 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
7ec0: 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 7d  tmtOpen==0) );.}
7ed0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
7ee0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7ef0: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
7f00: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
7f10: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
7f20: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
7f30: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
7f40: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
7f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
7f60: 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ases.** the data
7f70: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
7f80: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
7f90: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
7fa0: 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a  e.  The journal.
7fb0: 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  ** file is delet
7fc0: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a  ed and closed..*
7fd0: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
7fe0: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
7ff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8000: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
8010: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
8020: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
8030: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
8040: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
8050: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
8060: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
8070: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
8080: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
8090: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
80a0: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
80b0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
80c0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Pg;.  int rc;.  
80d0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
80e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
80f0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
8100: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
8110: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8120: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
8130: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
8140: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
8150: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
8160: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8170: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
8180: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
8190: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
81a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
81b0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
81c0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
81d0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
81e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
81f0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
8200: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
8210: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
8220: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
8230: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
8240: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
8250: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8260: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
8270: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
8280: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
8290: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
82a0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
82b0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
82c0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
82d0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
82e0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
82f0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
8300: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
8310: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
8320: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
8330: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
8340: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
8350: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8360: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
8370: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
8380: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8390: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
83a0: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
83b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
83c0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
83d0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
83e0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
83f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
8400: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
8410: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
8420: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
8430: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
8440: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8450: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
8460: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
8470: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
8480: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
8490: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
84a0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
84b0: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  t;.  pPager->dbS
84c0: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
84d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
84e0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
84f0: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8500: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8510: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8520: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8530: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8540: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8550: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8560: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8570: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8580: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8590: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
85a0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
85b0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
85c0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
85d0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
85e0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
85f0: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8600: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8610: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8620: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8630: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8640: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8650: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8660: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8670: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8680: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8690: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
86a0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
86b0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
86c0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
86d0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
86e0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
86f0: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8700: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8710: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8730: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8740: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8750: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8760: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8770: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8780: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8790: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
87a0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
87b0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
87c0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
87d0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
87e0: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
87f0: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
8800: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
8810: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
8820: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
8830: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
8840: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
8850: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
8860: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
8870: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
8880: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
8890: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
88a0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
88b0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
88c0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
88d0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
88e0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
88f0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
8900: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
8910: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
8920: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
8930: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
8940: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
8950: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
8960: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
8970: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
8980: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
8990: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
89a0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
89b0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
89c0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
89d0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
89e0: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
89f0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
8a00: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
8a10: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
8a20: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
8a30: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
8a40: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
8a50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
8a60: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
8a70: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
8a80: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
8a90: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
8aa0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
8ab0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
8ac0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
8ad0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8ae0: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
8af0: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
8b00: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
8b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8b20: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
8b30: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
8b40: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
8b50: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
8b60: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
8b70: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
8b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8b90: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
8ba0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
8bb0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bd0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
8be0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
8bf0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
8c00: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
8c10: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
8c20: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
8c30: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
8c40: 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54    u8 aData[SQLIT
8c50: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d  E_MAX_PAGE_SIZE]
8c60: 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61  ;  /* Temp stora
8c70: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
8c80: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
8c90: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
8ca0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
8cb0: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
8cc0: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
8cd0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
8ce0: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
8cf0: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
8d00: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
8d10: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
8d20: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
8d30: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b  pPager->stfd) );
8d40: 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ...  rc = read32
8d50: 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29  bits(jfd, &pgno)
8d60: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d70: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8d80: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
8d90: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44  3OsRead(jfd, &aD
8da0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
8db0: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  eSize);.  if( rc
8dc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8dd0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
8de0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8df0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8e00: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
8e10: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
8e20: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
8e30: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
8e40: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
8e50: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
8e60: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
8e70: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
8e80: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8e90: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
8ea0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
8eb0: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
8ec0: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
8ed0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8ee0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
8ef0: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
8f00: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
8f10: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
8f20: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
8f30: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
8f40: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
8f50: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
8f60: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
8f70: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8f80: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
8f90: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
8fa0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
8fb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8fc0: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
8fd0: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
8fe0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
8ff0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
9000: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9010: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
9020: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
9030: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
9040: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
9050: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
9060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9070: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
9080: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9090: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
90a0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
90b0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
90c0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
90d0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
90e0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
90f0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
9100: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
9110: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
9120: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
9130: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
9140: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
9150: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
9160: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
9170: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
9180: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
9190: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
91a0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
91b0: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
91c0: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
91d0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
91e0: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
91f0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
9200: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
9210: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
9220: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
9230: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
9240: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
9250: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
9260: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
9270: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
9280: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
9290: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
92a0: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
92b0: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
92c0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
92d0: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
92e0: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
92f0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
9300: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
9310: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
9320: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
9330: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
9340: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
9350: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
9360: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
9370: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
9380: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
9390: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
93a0: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
93b0: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
93c0: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
93d0: 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  are in the main 
93e0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
93f0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
9400: 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c  e, if a full ROL
9410: 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74  LBACK occurs aft
9420: 65 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  er the statement
9430: 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  .  ** rollback t
9440: 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b  he full ROLLBACK
9450: 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72   will not restor
9460: 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74  e the page to it
9470: 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
9480: 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f  content.  Two co
9490: 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
94a0: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
94b0: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
94c0: 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20  ase.  ** files. 
94d0: 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
94e0: 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e   must be locked.
94f0: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
9500: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  at the original.
9510: 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e    ** page conten
9520: 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  t is in the main
9530: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
9540: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
9550: 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20   is not in.  ** 
9560: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74  cache or else it
9570: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
9580: 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a  edSync==0..  */.
9590: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
95a0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
95b0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
95c0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
95d0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
95e0: 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43  pPg!=0 );.  TRAC
95f0: 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E3("PLAYBACK %d 
9600: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
9610: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
9620: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  o);.  if( pPager
9630: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9640: 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67  XCLUSIVE && (pPg
9650: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64  ==0 || pPg->need
9660: 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Sync==0) ){.    
9670: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
9680: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
9690: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
96a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
96b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
96c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
96d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
96e0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
96f0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9700: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
9710: 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
9720: 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
9730: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
9740: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
9750: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
9760: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
9770: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
9780: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
9790: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
97a0: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
97b0: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
97c0: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
97d0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
97e0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
97f0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
9800: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
9810: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
9820: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
9830: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
9840: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
9850: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
9860: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
9870: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
9880: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
9890: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
98a0: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
98b0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
98c0: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
98d0: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
98e0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
98f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
9900: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
9910: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
9930: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
9940: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
9950: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
9960: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
9970: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9980: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
9990: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
99a0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
99b0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
99c0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
99d0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
99e0: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
99f0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
9a00: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
9a10: 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 3);.  }.  retu
9a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9a30: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
9a40: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
9a50: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9a60: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
9a70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9a80: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
9a90: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
9aa0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
9ab0: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
9ac0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
9ad0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
9ae0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
9af0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
9b00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
9b10: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
9b20: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
9b30: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
9b40: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9b50: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
9b60: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
9b70: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
9b80: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
9b90: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
9ba0: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
9bb0: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
9bc0: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
9bd0: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
9be0: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
9bf0: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
9c00: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
9c10: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
9c20: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
9c30: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
9c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9c50: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
9c60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
9c70: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
9c80: 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65    int master_ope
9c90: 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20  n = 0;.  OsFile 
9ca0: 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63  *master = 0;.  c
9cb0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
9cc0: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
9cd0: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
9ce0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
9cf0: 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
9d00: 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
9d10: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
9d20: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
9d30: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
9d40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9d50: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
9d60: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
9d70: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
9d80: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
9d90: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
9da0: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
9db0: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
9dc0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
9dd0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
9de0: 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ly(zMaster, &mas
9df0: 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ter);.  if( rc!=
9e00: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9e10: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9e20: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
9e30: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
9e40: 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74  3OsFileSize(mast
9e50: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
9e60: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
9e70: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9e80: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9e90: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
9ea0: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
9eb0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
9ec0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
9ed0: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
9ee0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
9ef0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9f00: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
9f10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
9f20: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
9f30: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
9f40: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
9f50: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
9f60: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
9f70: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
9f80: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
9f90: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
9fa0: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
9fb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
9fc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9fd0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
9fe0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
9ff0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a000: 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73  ead(master, zMas
a010: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
a020: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a030: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a040: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
a050: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
a060: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
a070: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
a080: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
a090: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
a0a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
a0b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a0c0: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
a0d0: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
a0e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
a0f0: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
a100: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
a110: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
a120: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
a130: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
a140: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
a150: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a160: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
a170: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
a180: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
a190: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a1a0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
a1b0: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
a1c0: 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20   *journal = 0;. 
a1d0: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20         int c;.. 
a1e0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a1f0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
a200: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
a210: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
a220: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a230: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
a240: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a250: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
a260: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
a270: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
a280: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
a290: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2a0: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
a2b0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
a2c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a2d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
a2e0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a2f0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
a300: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
a310: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
a320: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
a330: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
a340: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
a350: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
a360: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
a370: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
a380: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
a390: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
a3a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
a3b0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a3c0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
a3d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a3e0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
a3f0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
a400: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
a410: 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f   }.  .  sqlite3O
a420: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
a430: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
a440: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
a450: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
a460: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
a470: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
a480: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
a490: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
a4a0: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
a4b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a4c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
a4d0: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
a4e0: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
a4f0: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
a500: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
a510: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
a520: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
a530: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
a540: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
a550: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a560: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
a570: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
a580: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
a590: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
a5a0: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
a5b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
a5c0: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
a5d0: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
a5e0: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
a5f0: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
a600: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
a610: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
a620: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
a630: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
a640: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
a650: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
a660: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
a670: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
a680: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
a690: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
a6a0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
a6b0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
a6c0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
a6d0: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d  ar zBuf[SQLITE_M
a6e0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  AX_PAGE_SIZE];. 
a6f0: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
a700: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
a710: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
a720: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
a730: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
a740: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a750: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
a760: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
a770: 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e  Size*(i64)(pPg->
a780: 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20  pgno-1));.      
a790: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a7a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
a7b0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a7c0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
a7d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a7e0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
a7f0: 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54     TRACE3("REFET
a800: 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
a810: 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
a820: 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
a830: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
a840: 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  eak;.      CODEC
a850: 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  1(pPager, zBuf, 
a860: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
a870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a880: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
a890: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a8a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a8b0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
a8c0: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
a8d0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a8e0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a8f0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ze) ){.      mem
a900: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
a910: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50  A(pPg), zBuf, pP
a920: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a930: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
a940: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
a950: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a960: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
a970: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
a980: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a990: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a9a0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
a9b0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
a9c0: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
a9d0: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
a9e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a9f0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
aa00: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  0;.    pPg->dirt
aa10: 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
aa20: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
aa30: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
aa40: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
aa50: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
aa60: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
aa70: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74  Dirty = 0;.  ret
aa80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
aa90: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
aaa0: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
aab0: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
aac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
aad0: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a  s.** indicated..
aae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
aaf0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
ab00: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
ab10: 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
ab20: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
ab30: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
ab40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
ab50: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
ab60: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
ab70: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
ab80: 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  )nPage);.}../*.*
ab90: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
aba0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
abb0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
abc0: 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
abd0: 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
abe0: 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
abf0: 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
ac00: 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
ac10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
ac20: 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
ac30: 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
ac40: 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
ac50: 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
ac60: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
ac70: 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
ac80: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
ac90: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
aca0: 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
acb0: 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
acc0: 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
acd0: 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
ace0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
acf0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
ad00: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
ad10: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
ad20: 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
ad30: 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
ad40: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
ad50: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
ad60: 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
ad70: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
ad80: 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
ad90: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
ada0: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
adb0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
adc0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
add0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
ade0: 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
adf0: 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
ae00: 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
ae10: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
ae20: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
ae30: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
ae40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ae50: 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
ae60: 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
ae70: 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
ae80: 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
ae90: 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
aea0: 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
aeb0: 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (6)  N bytes of
aec0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
aed0: 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
aee0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
aef0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
af00: 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
af10: 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
af20: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
af30: 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
af40: 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
af50: 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
af60: 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
af70: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
af80: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
af90: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
afa0: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
afb0: 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
afc0: 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (7)  Zero or m
afd0: 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
afe0: 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
aff0: 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
b000: 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
b010: 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
b020: 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
b030: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
b040: 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
b050: 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
b060: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
b070: 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
b080: 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
b090: 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20  ean the first 6 
b0a0: 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
b0b0: 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
b0c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
b0d0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
b0e0: 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  7th item..**.** 
b0f0: 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
b100: 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
b110: 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
b120: 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
b130: 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
b140: 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
b150: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
b160: 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
b170: 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
b180: 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
b190: 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
b1a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b1b0: 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
b1c0: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
b1d0: 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
b1e0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
b1f0: 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
b200: 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
b210: 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
b220: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b230: 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
b240: 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
b250: 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
b260: 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
b270: 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
b280: 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
b290: 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
b2a0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
b2b0: 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
b2c0: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
b2d0: 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
b2e0: 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
b2f0: 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
b300: 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
b310: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
b320: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
b330: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
b340: 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
b350: 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
b360: 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
b370: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
b380: 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
b390: 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
b3a0: 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
b3b0: 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
b3c0: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
b3d0: 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
b3e0: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
b3f0: 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
b400: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
b410: 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
b420: 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
b430: 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
b440: 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
b450: 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
b460: 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
b470: 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
b480: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
b490: 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
b4a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
b4b0: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
b4c0: 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
b4d0: 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
b4e0: 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
b4f0: 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
b500: 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
b510: 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
b520: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
b530: 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
b540: 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
b550: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
b560: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
b570: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
b580: 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
b590: 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
b5a0: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
b5b0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
b5c0: 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
b5d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
b5e0: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
b5f0: 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
b600: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
b610: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
b620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b630: 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
b640: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
b650: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
b660: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b670: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b680: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
b690: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
b6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b6b0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
b6c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
b6d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b6f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b700: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
b710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b720: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
b730: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
b740: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b760: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
b770: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
b780: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
b790: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
b7a0: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
b7b0: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
b7c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
b7d0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
b7e0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
b7f0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
b800: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
b810: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
b820: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
b830: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
b840: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
b850: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
b860: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
b870: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
b880: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b890: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
b8a0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
b8b0: 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
b8c0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
b8d0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
b8e0: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
b8f0: 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
b900: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
b910: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
b920: 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
b930: 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
b940: 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
b950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b960: 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
b970: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
b980: 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
b990: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
b9a0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
b9b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d  pPager->jfd, &zM
b9c0: 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74  aster);.  assert
b9d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
b9e0: 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  E );.  if( rc!=S
b9f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61  QLITE_OK || (zMa
ba00: 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33  ster && !sqlite3
ba10: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61  OsFileExists(zMa
ba20: 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71  ster)) ){.    sq
ba30: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
ba40: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
ba50: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   0;.    if( rc==
ba60: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63  SQLITE_DONE ) rc
ba70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ba80: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
ba90: 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ack;.  }.  sqlit
baa0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
bab0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67  >jfd, 0);.  pPag
bac0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
bad0: 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
bae0: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
baf0: 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
bb00: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
bb10: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
bb20: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
bb30: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
bb40: 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
bb50: 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
bb60: 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
bb70: 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
bb80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bb90: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
bba0: 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
bbb0: 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
bbc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bbd0: 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
bbe0: 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
bbf0: 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
bc00: 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
bc10: 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
bc20: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
bc30: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
bc40: 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
bc50: 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
bc60: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
bc70: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
bc80: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
bc90: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
bca0: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
bcb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bcc0: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
bcd0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
bce0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
bcf0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
bd00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
bd10: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
bd20: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
bd30: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
bd40: 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
bd50: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
bd60: 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
bd70: 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
bd80: 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
bd90: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
bda0: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
bdb0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
bdc0: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
bdd0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
bde0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
bdf0: 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
be00: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
be10: 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
be20: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
be30: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
be40: 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
be50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
be60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
be70: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
be80: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
be90: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
bea0: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
beb0: 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
bec0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
bed0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
bee0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
bef0: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
bf00: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
bf10: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
bf20: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
bf30: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
bf40: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
bf50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
bf60: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
bf70: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
bf80: 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
bf90: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
bfa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bfb0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
bfc0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
bfd0: 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70  igDbSize==0 || p
bfe0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
bff0: 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20  e==mxPg );.     
c000: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
c010: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
c020: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
c030: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c040: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
c050: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
c060: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
c070: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
c080: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
c090: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
c0a0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
c0b0: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
c0c0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
c0d0: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
c0e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
c0f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
c100: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
c110: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
c120: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
c130: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
c140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c150: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
c160: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
c170: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c180: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
c190: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c1a0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
c1b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c1c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c1d0: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
c1e0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
c1f0: 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
c200: 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  al, then the dat
c210: 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  abase.          
c220: 2a 2a 20 69 73 20 70 72 6f 62 61 62 6c 79 20 6e  ** is probably n
c230: 6f 74 20 72 65 63 6f 76 65 72 61 62 6c 65 2e 20  ot recoverable. 
c240: 20 52 65 74 75 72 6e 20 43 4f 52 52 55 50 54 2e   Return CORRUPT.
c250: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c260: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c270: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
c280: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
c290: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
c2a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c2b0: 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
c2c0: 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
c2d0: 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
c2e0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
c2f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c300: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
c310: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
c320: 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65    }.  if( zMaste
c330: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  r ){.    /* If t
c340: 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
c350: 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
c360: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c370: 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20  return true,.   
c380: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
c390: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
c3a0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
c3b0: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
c3c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c3d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c3e0: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
c3f0: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
c400: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
c410: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
c420: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
c430: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
c440: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
c450: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
c460: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
c470: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
c480: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
c490: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
c4a0: 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  t PAGER_SECTOR_S
c4b0: 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  IZE.  ** value. 
c4c0: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
c4d0: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
c4e0: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
c4f0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73    */.  pPager->s
c500: 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45  ectorSize = PAGE
c510: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  R_SECTOR_SIZE;. 
c520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c530: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
c540: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
c550: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
c560: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
c570: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
c580: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
c590: 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
c5a0: 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
c5b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
c5c0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
c5d0: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
c5e0: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
c5f0: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
c600: 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
c610: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
c620: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c630: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
c640: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
c650: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
c660: 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
c670: 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
c680: 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
c690: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
c6a0: 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
c6b0: 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
c6c0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
c6d0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
c6e0: 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
c6f0: 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
c700: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
c710: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c720: 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
c730: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
c740: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
c750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
c760: 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
c770: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
c780: 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
c790: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
c7a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c7b0: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
c7c0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c7d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c7e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
c7f0: 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
c800: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
c810: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
c820: 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73    {.    i64 os_s
c830: 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  zJ;.    rc = sql
c840: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
c850: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f  Pager->jfd, &os_
c860: 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  szJ);.    if( rc
c870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
c880: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73  turn rc;.    ass
c890: 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a  ert( szJ==os_szJ
c8a0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
c8b0: 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
c8c0: 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
c8d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a 6f   to the first jo
c8e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
c8f0: 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73  tten.  ** this s
c900: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
c910: 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64  tion, or the end
c920: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20   of the file if 
c930: 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  no journal.  ** 
c940: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
c950: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66  en..  */.  hdrOf
c960: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
c970: 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  HdrOff;.  assert
c980: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
c990: 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b  nc || !hdrOff );
c9a0: 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29  .  if( !hdrOff )
c9b0: 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73  {.    hdrOff = s
c9c0: 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  zJ;.  }.  .  /* 
c9d0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
c9e0: 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
c9f0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
ca00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
ca10: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
ca20: 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
ca30: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
ca40: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
ca50: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b  ager->stmtSize);
ca60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ca70: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
ca80: 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
ca90: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
caa0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
cab0: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
cac0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
cad0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
cae0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
caf0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
cb00: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
cb10: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
cb20: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
cb30: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
cb40: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
cb50: 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
cb60: 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
cb70: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
cb80: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
cb90: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cba0: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
cbb0: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
cbc0: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
cbd0: 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
cbe0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
cbf0: 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
cc00: 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
cc10: 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
cc20: 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
cc30: 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
cc40: 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
cc50: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
cc60: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
cc70: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
cc80: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
cc90: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
cca0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  ger, pPager->stf
ccb0: 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 0);.    asser
ccc0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
ccd0: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
cce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
ccf0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
cd00: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
cd10: 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61  Now roll some pa
cd20: 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  ges back from th
cd30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
cd40: 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d  urnal. Pager.stm
cd50: 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20  tJSize.  ** was 
cd60: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
cd70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
cd80: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
cd90: 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f   was started, so
cda0: 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67  .  ** everything
cdb0: 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64   after that need
cdc0: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
cdd0: 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f  ack, either into
cde0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cdf0: 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  se, the memory c
ce00: 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20  ache, or both.. 
ce10: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69   **.  ** If it i
ce20: 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
ce30: 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66   Pager.stmtHdrOf
ce40: 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  f is the offset 
ce50: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
ce60: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a  * of the first j
ce70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
ce80: 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69  itten during thi
ce90: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
cea0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
ceb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
cec0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
ced0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
cee0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
cef0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
cf00: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
cf10: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
cf20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
cf30: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  = pPager->stmtJS
cf40: 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
cf50: 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65  ksumInit = pPage
cf60: 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20  r->stmtCksum;.  
cf70: 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f  assert( JOURNAL_
cf80: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28  HDR_SZ(pPager)<(
cf90: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cfa0: 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  +8) );.  while( 
cfb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cfc0: 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70  ff <= (hdrOff-(p
cfd0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
cfe0: 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  8)) ){.    rc = 
cff0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d000: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d010: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
d030: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
d040: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d050: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
d060: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d070: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
d080: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d090: 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
d0a0: 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20  2 nJRec;        
d0b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
d0c0: 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
d0d0: 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
d0e0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
d0f0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
d100: 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
d110: 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
d120: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d130: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
d140: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
d150: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
d160: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
d170: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65    }.    if( nJRe
d180: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a  c==0 ){.      nJ
d190: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
d1a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
d1b0: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
d1c0: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
d1d0: 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31     for(i=nJRec-1
d1e0: 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72  ; i>=0 && pPager
d1f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
d200: 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  zJ; i--){.      
d210: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
d220: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
d230: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
d240: 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
d250: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
d260: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ONE );.      if(
d270: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d280: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d290: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d2a0: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
d2b0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
d2c0: 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79    .end_stmt_play
d2d0: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
d2e0: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
d2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d300: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
d310: 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
d320: 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
d330: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
d350: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
d360: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
d370: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
d380: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
d390: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
d3a0: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67  et_cachesize(Pag
d3b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d3c0: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
d3d0: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
d3e0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
d3f0: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65   mxPage;.  }else
d400: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
d410: 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d  Page = 10;.  }.}
d420: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
d430: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
d440: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
d450: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
d460: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
d470: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
d480: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
d490: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
d4a0: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
d4b0: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
d4c0: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
d4d0: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
d4e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
d4f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
d500: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
d510: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
d520: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
d530: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
d540: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
d550: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
d560: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
d570: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
d580: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
d590: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
d5a0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
d5b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
d5c0: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
d5d0: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
d5e0: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
d5f0: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
d600: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
d610: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
d620: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
d630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
d640: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
d650: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
d660: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
d670: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
d680: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
d690: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
d6a0: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
d6b0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
d6d0: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
d6e0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
d6f0: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
d700: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
d710: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
d720: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
d740: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
d750: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
d760: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
d770: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
d780: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
d790: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d7a0: 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
d7b0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
d7c0: 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
d7d0: 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
d7e0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
d7f0: 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
d800: 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
d810: 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
d820: 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
d830: 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
d850: 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
d860: 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
d870: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
d880: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
d890: 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
d8a0: 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
d8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
d8c0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
d8d0: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
d8e0: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
d8f0: 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
d900: 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
d910: 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
d920: 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
d930: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
d940: 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
d950: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
d960: 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61  _safety_level(Pa
d970: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d980: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
d990: 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  _fsync){.  pPage
d9a0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
d9b0: 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
d9c0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
d9d0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
d9e0: 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
d9f0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
da00: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
da10: 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63  ync = full_fsync
da20: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
da30: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
da40: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
da50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
da60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
da70: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
da80: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
da90: 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
daa0: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
dab0: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
dac0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
dad0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
dae0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
daf0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
db00: 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
db10: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
db20: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
db30: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
db40: 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
db50: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
db60: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
db70: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
db80: 20 7a 46 69 6c 65 0a 2a 2a 20 28 7a 46 69 6c 65   zFile.** (zFile
db90: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
dba0: 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  t SQLITE_TEMPNAM
dbb0: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e  E_SIZE bytes lon
dbc0: 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68  g.)  Write.** th
dbd0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
dbe0: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
dbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
dc00: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
dc10: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
dc20: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
dc30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69  .**.** The OS wi
dc40: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
dc50: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
dc60: 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
dc70: 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  it is.** closed.
dc80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
dc90: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
dca0: 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65  temp(char *zFile
dcb0: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b  , OsFile **pFd){
dcc0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
dcd0: 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66    int rc;.#ifdef
dce0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
dcf0: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
dd00: 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
dd10: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
dd20: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
dd30: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a  */.#endif.  do{.
dd40: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
dd50: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
dd60: 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Name(zFile);.   
dd70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
dd80: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69  penExclusive(zFi
dd90: 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d  le, pFd, 1);.  }
dda0: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
ddb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
ddc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
ddd0: 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  M );.  return rc
dde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
ddf0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
de00: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
de10: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
de20: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
de30: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
de40: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
de50: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
de60: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
de70: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
de80: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
de90: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
dea0: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
deb0: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
dec0: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
ded0: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
dee0: 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  g sqlite3pager_u
def0: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
df00: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
df10: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
df20: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
df30: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
df40: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
df50: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
df60: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
df70: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
df80: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
df90: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
dfa0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
dfb0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
dfc0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
dfd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
dfe0: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
dff0: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
e000: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
e010: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
e020: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
e030: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
e040: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
e050: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
e060: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
e070: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
e080: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
e090: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
e0a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e0b0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
e0c0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
e0d0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
e0e0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
e0f0: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
e100: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
e110: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
e120: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
e130: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
e150: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
e160: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
e170: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e180: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
e190: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
e1a0: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20  .  int nameLen; 
e1b0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20   /* Compiler is 
e1c0: 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61  wrong. This is a
e1d0: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
e1e0: 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a  d before use */.
e1f0: 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20    OsFile *fd;.  
e200: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e210: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
e220: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
e230: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
e240: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
e250: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
e260: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
e270: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
e280: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
e290: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
e2a0: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
e2b0: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
e2c0: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
e2d0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
e2e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e2f0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
e300: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
e310: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
e320: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
e330: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
e340: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
e350: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
e360: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
e370: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
e380: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
e390: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
e3a0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
e3b0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
e3c0: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
e3d0: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
e3e0: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
e3f0: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
e400: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
e410: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
e420: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
e430: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
e440: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
e450: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
e460: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
e470: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
e480: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
e490: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
e4a0: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
e4b0: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
e4c0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e4d0: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
e4e0: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
e4f0: 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20   /* If malloc() 
e500: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c  has already fail
e510: 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ed return SQLITE
e520: 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65  _NOMEM. Before e
e530: 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67  ven.  ** testing
e540: 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a   for this, set *
e550: 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20  ppPager to NULL 
e560: 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e  so the caller kn
e570: 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  ows the pager.  
e580: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77 61 73  ** structure was
e590: 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64   never allocated
e5a0: 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67  . .  */.  *ppPag
e5b0: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  er = 0;.  if( sq
e5c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
e5d0: 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d() ){.    retur
e5e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e5f0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64    }.  memset(&fd
e600: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29  , 0, sizeof(fd))
e610: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
e620: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
e630: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
e640: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
e650: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
e660: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
e670: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
e680: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
e690: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
e6a0: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
e6b0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
e6c0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
e6d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e6e0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
e6f0: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
e700: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
e710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
e720: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
e730: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e740: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
e750: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
e760: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
e770: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e780: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
e790: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
e7a0: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
e7b0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
e7c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e7d0: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
e7e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
e7f0: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
e800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
e810: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
e820: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
e830: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
e840: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
e850: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
e860: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e870: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
e880: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
e890: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e8a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
e8b0: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
e8c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
e8d0: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
e8e0: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
e8f0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
e900: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
e910: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
e920: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
e930: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
e940: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
e950: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
e960: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
e970: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
e980: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
e990: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
e9a0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e9b0: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
e9c0: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
e9d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
e9e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
e9f0: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
ea00: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
ea10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
ea20: 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
ea30: 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
ea40: 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
ea50: 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20  ee the memory . 
ea60: 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
ea70: 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y zFullPathname,
ea80: 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20   free the Pager 
ea90: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
eaa0: 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  ose the .  ** fi
eab0: 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  le. Since the pa
eac0: 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
ead0: 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
eae0: 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
eaf0: 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
eb00: 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
eb10: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
eb20: 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68  er || !zFullPath
eb30: 6e 61 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  name || rc!=SQLI
eb40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
eb50: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
eb60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
eb70: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
eb80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
eb90: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
eba0: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
ebb0: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
ebc0: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52  M:rc);.  }..  TR
ebd0: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
ebe0: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
ebf0: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
ec00: 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  name);.  IOTRACE
ec10: 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
ec20: 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50  , pPager, zFullP
ec30: 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67  athname)).  pPag
ec40: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
ec50: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
ec60: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
ec70: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
ec80: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
ec90: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
eca0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
ecb0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
ecc0: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
ecd0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
ece0: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
ecf0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
ed00: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
ed10: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
ed20: 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  name);..  for(i=
ed30: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
ed40: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
ed50: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
ed60: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
ed70: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
ed80: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
ed90: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
eda0: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
edb0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
edc0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
edd0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
ede0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
edf0: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
ee00: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
ee10: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20  ->fd = fd;.  /* 
ee20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ee30: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
ee40: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
ee50: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
ee60: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
ee70: 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
ee80: 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
ee90: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
eea0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
eeb0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
eec0: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
eed0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
eee0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
eef0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
ef00: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
ef10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
ef20: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
ef30: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  AGE_SIZE;.  /* p
ef40: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
ef50: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
ef60: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
ef70: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
ef80: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
ef90: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
efa0: 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  MaxPage = 0; */.
efb0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
efc0: 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74   = 100;.  assert
efd0: 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d  ( PAGER_UNLOCK==
efe0: 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  0 );.  /* pPager
eff0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
f000: 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
f010: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f020: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f030: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
f040: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
f050: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
f060: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
f070: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
f080: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
f090: 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
f0a0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
f0b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f0c0: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
f0d0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
f0e0: 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
f0f0: 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a  oSync?0:1);.  /*
f100: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
f110: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f120: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
f130: 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
f140: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
f150: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
f160: 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
f170: 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
f180: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  .  pPager->secto
f190: 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45  rSize = PAGER_SE
f1a0: 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  CTOR_SIZE;.  /* 
f1b0: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
f1c0: 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
f1d0: 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
f1e0: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
f1f0: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
f200: 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
f210: 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65   = pPager;.#ifde
f220: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f230: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
f240: 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  T.  pPager->pNex
f250: 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  t = pTsd->pPager
f260: 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72  ;.  pTsd->pPager
f270: 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69   = pPager;.#endi
f280: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
f290: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
f2a0: 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
f2b0: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
f2c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
f2d0: 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c  er_set_busyhandl
f2e0: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
f2f0: 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
f300: 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
f310: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
f320: 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
f330: 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
f340: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
f350: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
f360: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
f370: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
f380: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
f390: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
f3a0: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
f3b0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
f3c0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
f3d0: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
f3e0: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
f3f0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
f400: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
f410: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
f420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
f430: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
f440: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
f450: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
f460: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
f470: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
f480: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
f490: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
f4a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f4b0: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
f4c0: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
f4d0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
f4e0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20  )(void*,int)){. 
f4f0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
f500: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
f510: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
f520: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
f530: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
f540: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
f550: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
f560: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
f570: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
f580: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
f590: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
f5a0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
f5b0: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
f5c0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
f5d0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
f5e0: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
f5f0: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
f600: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
f610: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
f620: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
f630: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
f640: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
f650: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
f660: 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61  _set_reiniter(Pa
f670: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
f680: 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69  d (*xReinit)(voi
f690: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
f6a0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
f6b0: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
f6c0: 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
f6d0: 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ize.  Return the
f6e0: 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74   new size.  If t
f6f0: 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
f700: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69  age.** size is i
f710: 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
f720: 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
f730: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
f740: 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72  elected.** and r
f750: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
f760: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f770: 5f 70 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  _pagesize(Pager 
f780: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67  *pPager, int pag
f790: 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  eSize){.  assert
f7a0: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
f7b0: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
f7c0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
f7d0: 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  E );.  if( !pPag
f7e0: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
f7f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f800: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
f810: 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
f820: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  r->pageSize;.}..
f830: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
f840: 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
f850: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
f860: 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
f870: 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
f880: 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
f890: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
f8a0: 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
f8b0: 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
f8c0: 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
f8d0: 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
f8e0: 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
f8f0: 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
f900: 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
f910: 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
f920: 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
f930: 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
f940: 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
f950: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f960: 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
f970: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f980: 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
f990: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
f9a0: 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
f9b0: 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
f9c0: 76 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c  void clear_simul
f9d0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b  ated_io_error(){
f9e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
f9f0: 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76  ror_hit = 0;.}.v
fa00: 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
fa10: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
fa20: 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
fa30: 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
fa40: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
fa50: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
fa60: 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
fa70: 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
fa80: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fa90: 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
faa0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
fab0: 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
fac0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
fad0: 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65  e clear_simulate
fae0: 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64  d_io_error().# d
faf0: 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
fb00: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fb10: 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
fb20: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
fb30: 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
fb40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
fb50: 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
fb60: 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
fb70: 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
fb80: 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
fb90: 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
fba0: 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72  o. .**.** No err
fbb0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
fbc0: 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  one. The rationa
fbd0: 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  l for this is th
fbe0: 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
fbf0: 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c   .** may be call
fc00: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  ed even if the f
fc10: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
fc20: 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20  st or contain a 
fc30: 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74  header. In .** t
fc40: 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74  hese cases sqlit
fc50: 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20  e3OsRead() will 
fc60: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c  return an error,
fc70: 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
fc80: 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e  rrect .** respon
fc90: 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68  se is to zero th
fca0: 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73  e memory at pDes
fcb0: 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20  t and continue. 
fcc0: 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72   A real IO error
fcd0: 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d   .** will presum
fce0: 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62  ably recur and b
fcf0: 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65  e picked up late
fd00: 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61  r (Todo: Think a
fd10: 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69  bout this)..*/.i
fd20: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
fd30: 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28  read_fileheader(
fd40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
fd50: 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
fd60: 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
fd70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
fd80: 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
fd90: 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20  t, 0, N);.  if( 
fda0: 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20  MEMDB==0 ){.    
fdb0: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
fdc0: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
fdd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
fde0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  (pPager->fd, 0);
fdf0: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
fe00: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
fe10: 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
fe20: 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
fe30: 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
fe40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fe50: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
fe60: 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20  , pDest, N);.   
fe70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fe80: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
fe90: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
fea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
feb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
fec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
fed0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
fee0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
fef0: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
ff00: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
ff10: 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
ff20: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
ff30: 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
ff40: 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
ff50: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
ff60: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
ff70: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
ff80: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
ff90: 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
ffa0: 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
ffb0: 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
ffc0: 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
ffd0: 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
ffe0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
fff0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
10000 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
10010 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
10020 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
10030 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
10040 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
10050 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  er){.  i64 n;.  
10060 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
10070 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
10080 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
10090 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
100a0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
100b0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
100c0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
100d0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
100e0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
100f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10100 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
10110 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
10120 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10130 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
10140 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
10150 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
10160 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10170 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
10180 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
10190 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
101a0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
101b0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
101c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
101d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
101e0 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
101f0 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
10200 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
10210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
10220 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
10230 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
10240 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
10250 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
10260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10270 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
10280 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
10290 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
102a0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
102b0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
102c0 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
102d0 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
102e0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
102f0 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
10300 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
10310 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
10320 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
10330 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10340 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
10350 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
10360 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
10370 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
10380 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
10390 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
103a0 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
103b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
103c0 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
103d0 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
103e0 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
103f0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
10400 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f  er_movepage() ro
10410 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
10420 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
10430 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
10440 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
10450 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
10460 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
10470 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10480 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
10490 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
104a0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
104b0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
104c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
104d0 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
104e0 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
104f0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  h==0 );.    retu
10500 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rn;.  }.  if( pP
10510 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
10520 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
10530 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
10540 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
10550 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10560 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
10570 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10580 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20  aHash[pPg->pgno 
10590 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
105a0 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20  -1)]!=pPg );.   
105b0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
105c0 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
105d0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
105e0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
105f0 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  = pPg->pgno & (p
10600 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
10610 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
10620 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
10630 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  xtHash;.  }.  if
10640 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63  ( MEMDB ){.    c
10650 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
10660 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
10670 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70  Pager));.  }.  p
10680 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
10690 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
106a0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
106b0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  = 0;.}../*.** Un
106c0 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d  link a page from
106d0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28   the free list (
106e0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
106f0 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
10700 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d  ==0).** and from
10710 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73   its hash collis
10720 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ion chain..*/.st
10730 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
10740 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
10750 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
10760 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
10770 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20  ..  /* Keep the 
10780 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69  pFirstSynced poi
10790 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  nter pointing at
107a0 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68   the first synch
107b0 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a  ronized page */.
107c0 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
107d0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
107e0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
107f0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10800 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26  ;.    while( p &
10810 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
10820 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
10830 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d  e; }.    pPager-
10840 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
10850 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  p;.  }..  /* Unl
10860 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ink from the fre
10870 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70  elist */.  if( p
10880 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
10890 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
108a0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
108b0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
108c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
108d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
108e0 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irst==pPg );.   
108f0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
10900 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10920 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
10930 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
10940 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
10950 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
10960 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
10970 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  t( pPager->pLast
10980 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
10990 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
109a0 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
109b0 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  .  pPg->pNextFre
109c0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
109d0 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e  ee = 0;..  /* Un
109e0 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67  link from the pg
109f0 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  no hash table */
10a00 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
10a10 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
10a20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10a30 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10a40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10a50 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
10a60 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65  runcate an in-me
10a70 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
10a80 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61  Delete.** all pa
10a90 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
10aa0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
10ab0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
10ac0 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
10ad0 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  ..** Referenced 
10ae0 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
10af0 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
10b00 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a   are zeroed..*/.
10b10 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f  static void memo
10b20 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  ryTruncate(Pager
10b30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
10b40 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
10b50 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
10b60 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
10b70 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20  dbSize;..  ppPg 
10b80 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
10b90 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
10ba0 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
10bb0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
10bc0 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
10bd0 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
10be0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
10bf0 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
10c00 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
10c10 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
10c20 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
10c30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10c40 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
10c50 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
10c60 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
10c70 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
10c80 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
10c90 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61  e(pPg);.      ma
10ca0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
10cb0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10cc0 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
10cd0 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
10ce0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
10cf0 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e  efine memoryTrun
10d00 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a  cate(p).#endif..
10d10 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
10d20 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
10d30 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
10d40 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
10d50 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
10d60 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
10d70 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
10d80 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
10d90 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
10da0 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
10db0 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
10dc0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
10dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10de0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
10df0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
10e00 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
10e10 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
10e20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
10e30 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
10e40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
10e50 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
10e60 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
10e70 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
10e80 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
10e90 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
10ea0 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
10eb0 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
10ec0 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
10ed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
10ee0 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
10ef0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
10f00 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
10f10 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
10f20 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
10f30 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
10f40 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
10f50 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
10f60 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
10f70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
10f80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
10f90 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
10fa0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
10fb0 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
10fc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
10fd0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
10fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
11000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11010 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
11020 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
11030 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
11040 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
11050 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
11060 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
11070 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
11080 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
110a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
110b0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
110c0 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
110d0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
110e0 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
110f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11100 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
11110 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
11120 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
11130 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
11140 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11150 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
11160 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11170 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
11180 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
11190 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
111a0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45  GER_SHARED || ME
111b0 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  MDB );.  sqlite3
111c0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
111d0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
111e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
111f0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
11200 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
11210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
11220 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
11230 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
11240 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
11250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11260 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
11270 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
11280 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
11290 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
112a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
112b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
112c0 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f   }.  rc = syncJo
112d0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
112e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
112f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
11300 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
11310 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
11320 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
11330 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
11340 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  cating. */.  rc 
11350 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
11360 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
11370 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
11380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11390 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
113a0 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rc;.  }..  rc = 
113b0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
113c0 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
113d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
113e0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
113f0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
11400 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11410 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
11420 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
11430 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
11440 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
11450 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
11460 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
11470 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
11480 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
11490 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
114a0 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
114b0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
114c0 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
114d0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
114e0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
114f0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
11500 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
11510 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
11520 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
11530 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
11540 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
11550 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11560 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
11570 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
11580 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
11590 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
115a0 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
115b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
115c0 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
115d0 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
115e0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
115f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11600 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
11610 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
11620 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
11630 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
11640 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
11650 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
11660 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11680 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
11690 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
116a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
116b0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
116c0 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
116d0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
116e0 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
116f0 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
11700 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
11710 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
11720 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
11730 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
11740 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
11750 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
11760 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
11770 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
11780 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
11790 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
117a0 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
117b0 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
117c0 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20  oc can be set.. 
117d0 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
117e0 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
117f0 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
11800 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29  assert( pPager )
11810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
11820 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63   && pTsd->nAlloc
11830 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69   );.#endif..  di
11840 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
11850 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70  io_errors();.  p
11860 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
11870 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65   0;.  pager_rese
11880 74 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61  t(pPager);.  ena
11890 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
118a0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 54 52 41  _errors();.  TRA
118b0 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
118c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
118d0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
118e0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
118f0 67 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20  ger)).  assert( 
11900 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11910 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
11920 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50  nalOpen==0 && pP
11930 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d  ager->stmtOpen==
11940 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
11950 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11960 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11970 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
11980 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
11990 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
119a0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  nJournal);.  if(
119b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
119c0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
119d0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
119e0 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >stfd);.  }.  sq
119f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
11a00 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
11a10 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
11a20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
11a30 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
11a40 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
11a50 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
11a60 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
11a70 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
11a80 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
11a90 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
11aa0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
11ab0 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
11ac0 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  Remove the pager
11ad0 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64   from the linked
11ae0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
11af0 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a  starting at .  *
11b00 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61  * ThreadData.pPa
11b10 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61  ger if memory-ma
11b20 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
11b30 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
11b40 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50  pPager==pTsd->pP
11b50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64  ager ){.    pTsd
11b60 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
11b70 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
11b80 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54  e{.    Pager *pT
11b90 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70  mp;.    for(pTmp
11ba0 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b   = pTsd->pPager;
11bb0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50   pTmp->pNext!=pP
11bc0 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d  ager; pTmp=pTmp-
11bd0 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54  >pNext){}.    pT
11be0 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67  mp->pNext = pPag
11bf0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23  er->pNext;.  }.#
11c00 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72  endif.  sqliteFr
11c10 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
11c20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
11c30 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
11c40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11c50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11c60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
11c70 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
11c80 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
11c90 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
11ca0 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
11cb0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
11cc0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
11cd0 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
11ce0 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
11cf0 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
11d00 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
11d10 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
11d20 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
11d30 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
11d40 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
11d50 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
11d60 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
11d70 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
11d80 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
11d90 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
11da0 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
11db0 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
11dc0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
11dd0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
11de0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
11df0 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
11e00 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
11e10 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
11e20 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
11e30 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
11e40 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
11e50 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
11e60 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
11e70 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
11e80 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
11e90 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
11ea0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
11eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
11ec0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
11ed0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
11ee0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
11ef0 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
11f00 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
11f10 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
11f20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
11f30 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
11f40 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
11f50 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
11f60 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
11f70 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
11f80 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11f90 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
11fa0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
11fb0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
11fc0 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
11fd0 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
11fe0 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
11ff0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
12000 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
12010 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12020 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
12030 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
12040 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
12050 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
12060 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
12070 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12080 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
12090 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
120a0 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
120b0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
120c0 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
120d0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
120e0 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
120f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
12100 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
12110 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
12120 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
12130 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
12140 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
12150 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12160 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
12170 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
12180 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
12190 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
121a0 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
121b0 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
121c0 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
121d0 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
121e0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
121f0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
12200 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
12210 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
12220 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
12230 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
12240 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
12250 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76  lite3pager_ref(v
12260 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
12270 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
12280 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
12290 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
122a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
122b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
122c0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
122d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
122e0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
122f0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
12300 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
12310 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
12320 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
12330 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
12340 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
12350 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
12360 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
12370 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12380 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
12390 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
123a0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
123b0 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
123c0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
123d0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
123e0 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
123f0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
12400 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
12410 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
12420 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
12430 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
12440 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
12450 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
12460 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
12470 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
12480 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
12490 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
124a0 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
124b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
124c0 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
124d0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
124e0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
124f0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
12500 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
12510 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
12520 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
12530 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12540 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
12550 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
12560 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
12570 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
12580 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
12590 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
125a0 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
125b0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
125c0 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
125d0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
125e0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
125f0 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
12600 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
12610 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
12620 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
12630 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
12640 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
12650 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12660 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
12670 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
12680 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
12690 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
126a0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
126b0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
126c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
126d0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
126e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
126f0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  _OK;..  /* Sync 
12700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
12710 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
12720 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
12730 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
12740 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
12750 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
12760 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
12770 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12780 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
12790 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
127a0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
127b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
127c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
127d0 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
127e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
127f0 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
12800 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
12810 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
12820 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
12830 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
12840 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
12850 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
12860 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
12870 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
12880 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
12890 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
128a0 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
128b0 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
128c0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
128d0 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
128e0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
128f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12900 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
12910 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
12920 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12930 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
12940 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
12950 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12960 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
12970 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12990 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
129a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
129b0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72   {.        /* Wr
129c0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
129d0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
129e0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
129f0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
12a00 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
12a10 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
12a20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
12a30 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
12a40 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
12a50 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
12a60 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
12a70 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
12a80 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
12a90 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
12aa0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
12ab0 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20  ollback. .      
12ac0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
12ad0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
12ae0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  c ){.          T
12af0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
12b00 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
12b10 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
12b20 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
12b30 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
12b40 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
12b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12b60 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
12b70 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
12b80 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12b90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12ba0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
12bb0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
12bc0 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
12bf0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
12c00 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
12c10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12c20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12c30 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
12c40 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
12c50 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20  \n", pPager,.   
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12c70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12c80 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
12c90 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20  nalMagic), 4)). 
12ca0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
12cb0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
12cc0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
12cd0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
12ce0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12cf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12d00 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
12d10 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12d20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
12d30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
12d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12d50 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
12d60 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
12d70 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
12d80 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
12d90 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
12da0 64 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  d\n", pPager)). 
12db0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12dc0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
12dd0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
12de0 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20  l_fsync);.      
12df0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
12e00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
12e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
12e20 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
12e30 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
12e40 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
12e50 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
12e60 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
12e70 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
12e80 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
12e90 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
12ea0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
12eb0 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
12ec0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
12ed0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
12ee0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
12ef0 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
12f00 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
12f10 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
12f20 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
12f30 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
12f40 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
12f50 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
12f60 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
12f70 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
12f80 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
12f90 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
12fa0 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
12fb0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
12fc0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
12fd0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
12fe0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
12ff0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
13000 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
13010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
13020 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13030 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
13040 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
13050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13060 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
13070 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
13080 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
13090 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
130a0 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
130b0 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
130c0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
130d0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
130e0 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
130f0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
13100 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
13110 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
13120 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
13130 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
13140 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
13150 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
13160 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
13170 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13180 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
13190 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
131a0 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
131b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
131c0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
131d0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
131e0 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
131f0 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
13200 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
13210 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
13220 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
13230 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
13240 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
13250 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
13260 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13270 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13280 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
13290 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
132a0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
132b0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
132c0 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
132d0 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
132e0 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
132f0 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
13300 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
13310 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
13320 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
13330 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
13340 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61 74 69  _BUCKET 25.stati
13350 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
13360 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
13370 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
13380 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a  _SORT_BUCKET], *
13390 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65  p;.  int i;.  me
133a0 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
133b0 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  f(a));.  while( 
133c0 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  pIn ){.    p = p
133d0 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d  In;.    pIn = p-
133e0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
133f0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
13400 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52  for(i=0; i<N_SOR
13410 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29  T_BUCKET-1; i++)
13420 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
13430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
13440 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
13450 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
13460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
13470 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13480 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
13490 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    a[i] = 0;.    
134a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
134b0 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b  ( i==N_SORT_BUCK
134c0 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 61 5b  ET-1 ){.      a[
134d0 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
134e0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
134f0 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
13500 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
13510 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
13520 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
13530 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
13540 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
13550 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
13560 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
13570 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
13580 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
13590 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
135a0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
135b0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
135c0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
135d0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
135e0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
135f0 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
13600 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
13610 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
13620 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
13630 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
13640 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
13650 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
13660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
13670 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
13680 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
13690 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
136a0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
136b0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
136c0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
136d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
136e0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
136f0 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
13700 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
13710 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
13720 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
13730 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
13740 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
13750 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
13760 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
13770 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
13780 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
13790 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
137a0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
137b0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
137c0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
137d0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
137e0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
137f0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
13800 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
13810 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
13820 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
13830 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
13840 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
13850 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
13860 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
13870 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
13880 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
13890 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
138a0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
138b0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
138c0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
138d0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
138e0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
138f0 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
13900 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
13910 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
13920 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
13930 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
13940 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
13950 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13960 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
13970 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
13980 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
13990 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
139a0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
139b0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
139c0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
139d0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
139e0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
139f0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
13a00 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
13a10 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
13a20 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
13a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13a40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13a50 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
13a60 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
13a70 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  st);.  while( pL
13a80 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
13a90 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
13aa0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
13ab0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
13ac0 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
13ad0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
13ae0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
13af0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13b00 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20  n rc;.    /* If 
13b10 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
13b20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
13b30 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
13b40 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
13b50 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
13b60 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
13b70 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61   means sqlite3pa
13b80 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77  ger_truncate() w
13b90 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
13ba0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
13bb0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
13bc0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
13bd0 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
13be0 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
13bf0 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
13c00 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
13c10 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
13c20 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
13c30 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
13c40 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
13c50 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
13c60 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
13c70 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
13c80 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
13c90 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
13ca0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13cb0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
13cc0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  gno);.      IOTR
13cd0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
13ce0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
13cf0 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  ist->pgno)).    
13d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13d10 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
13d20 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
13d30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13d40 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
13d50 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
13d60 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
13d70 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
13d80 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52    TRACE3("NOSTOR
13d90 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
13da0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13db0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13dc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13dd0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13de0 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
13df0 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
13e00 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13e10 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
13e20 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
13e30 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
13e40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
13e50 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
13e60 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
13e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13e80 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
13e90 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
13ea0 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
13eb0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
13ec0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
13ed0 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
13ee0 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
13ef0 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
13f00 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
13f10 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
13f20 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
13f30 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
13f40 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
13f50 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
13f60 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
13f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13f80 20 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69   TRUE if there i
13f90 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
13fa0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
13fb0 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75  er..** A hot jou
13fc0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
13fd0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
13fe0 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  yed back..**.** 
13ff0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
14000 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
14010 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
14020 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
14030 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
14040 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
14050 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
14060 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
14070 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
14080 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
14090 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20  e.  Just delete 
140a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
140b0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
140c0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
140d0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
140e0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
140f0 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
14100 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46   if( !sqlite3OsF
14110 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
14120 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65  ->zJournal) ) re
14130 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
14140 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
14150 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
14160 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b  >fd) ) return 0;
14170 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61  .  if( sqlite3pa
14180 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
14190 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
141a0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
141b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
141c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
141d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
141e0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
141f0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64  *.** Try to find
14200 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63   a page in the c
14210 61 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65  ache that can be
14220 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a   recycled. .**.*
14230 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
14240 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
14250 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46  _IOERR, SQLITE_F
14260 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  ULL or SQLITE_OK
14270 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  . It .** does no
14280 74 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72  t set the pPager
14290 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  ->errCode variab
142a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
142b0 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  t pager_recycle(
142c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
142d0 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72  nt syncOk, PgHdr
142e0 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64   **ppPg){.  PgHd
142f0 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20  r *pPg;.  *ppPg 
14300 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  = 0;..  /* Find 
14310 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
14320 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
14330 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
14340 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
14350 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
14360 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
14370 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
14380 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
14390 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
143a0 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
143b0 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
143c0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
143d0 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
143e0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
143f0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
14400 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
14410 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
14420 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
14430 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
14440 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
14450 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
14460 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
14470 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
14480 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
14490 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
144a0 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21  t && syncOk && !
144b0 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20  MEMDB){.    int 
144c0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
144d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
144e0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
144f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14500 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
14510 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
14520 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c      /* If in ful
14530 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69  l-sync mode, wri
14540 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c  te a new journal
14550 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65   header into the
14560 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
14570 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  l file. This is 
14580 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76  done to avoid ev
14590 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a  er modifying a j
145a0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
145b0 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
145c0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
145d0 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
145e0 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20   that have.     
145f0 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e   ** already been
14600 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
14610 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73  database (in cas
14620 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a  e the header is.
14630 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64        ** trashed
14640 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   when the nRec f
14650 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29  ield is updated)
14660 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14670 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
14680 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
14690 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
146a0 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20  Off > 0 );.     
146b0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
146c0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
146d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
146e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
146f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
14700 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61   }.    pPg = pPa
14710 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
14720 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
14730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14740 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
14750 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
14760 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
14770 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
14780 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14790 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
147a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
147b0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74  dirty ){.    int
147c0 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
147d0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
147e0 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  0 );.    makeCle
147f0 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
14800 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
14810 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
14820 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14830 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
14840 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20   pPg );.    if( 
14850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14860 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
14870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
14880 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
14890 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
148a0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
148b0 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
148c0 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
148d0 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a  lback, then.  **
148e0 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
148f0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
14900 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
14910 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  ing the.  ** sql
14920 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
14930 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
14940 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
14950 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
14960 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  n..  ** It is ne
14970 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
14980 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
14990 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
149a0 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d  sRollback.  ** m
149b0 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
149c0 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
149d0 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
149e0 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
149f0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69  mber.  ** that i
14a00 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
14a10 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
14a20 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
14a30 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a  l pages must.  *
14a40 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
14a50 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
14a60 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
14a70 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
14a80 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
14a90 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
14aa0 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20  ALWAYS_ROLLBACK 
14ab0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
14ac0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
14ad0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
14ae0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
14af0 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
14b00 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
14b10 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
14b20 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e  ble.  */.  unlin
14b30 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45  kPage(pPg);.  TE
14b40 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
14b50 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67  nOvfl);..  *ppPg
14b60 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
14b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14b80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14b90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
14ba0 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
14bb0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
14bc0 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
14bd0 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
14be0 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
14bf0 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
14c00 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
14c10 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
14c20 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
14c30 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46 72 65  may be sqliteFre
14c40 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65  e()ed..**.** nRe
14c50 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  q is the number 
14c60 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
14c70 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63  ry required. Onc
14c80 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a  e this much has.
14c90 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ** been released
14ca0 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
14cb0 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69  eturns. A negati
14cc0 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65  ve value for nRe
14cd0 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20  q means.** free 
14ce0 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
14cf0 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20  s possible. The 
14d00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
14d10 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
14d20 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
14d30 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
14d40 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14d50 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
14d60 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20  _MANAGEMENT.int 
14d70 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 6c  sqlite3pager_rel
14d80 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20  ease_memory(int 
14d90 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54  nReq){.  const T
14da0 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 72  hreadData *pTsdr
14db0 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  o = sqlite3Threa
14dc0 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b  dDataReadOnly();
14dd0 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69  .  Pager *p;.  i
14de0 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
14df0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
14e00 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62   If the the glob
14e10 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  al mutex is held
14e20 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
14e30 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a  e becomes a.  **
14e40 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65   o-op; zero byte
14e50 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20  s of memory are 
14e60 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73 20  freed.  This is 
14e70 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d  because.  ** som
14e80 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e  e of the code in
14e90 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66 75  voked by this fu
14ea0 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a  nction may also.
14eb0 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61    ** try to obta
14ec0 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65  in the mutex, re
14ed0 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61  sulting in a dea
14ee0 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  dlock..  */.  if
14ef0 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74  ( sqlite3OsInMut
14f00 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74  ex(0) ){.    ret
14f10 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
14f20 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20   Outermost loop 
14f30 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74  runs for at most
14f40 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e   two iterations.
14f50 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   First iteration
14f60 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20   we.  ** try to 
14f70 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74  find memory that
14f80 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
14f90 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
14fa0 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64   fsync(). Second
14fb0 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20  .  ** iteration 
14fc0 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73  (which only runs
14fd0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61   if the first fa
14fe0 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65  iled to free nRe
14ff0 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20  q bytes of.  ** 
15000 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69  memory) is permi
15010 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79  tted to call fsy
15020 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66  nc(). This is of
15030 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72   course much mor
15040 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76  e .  ** expensiv
15050 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
15060 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a  0; i<=1; i++){..
15070 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
15080 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69  ugh all the SQLi
15090 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64  te pagers opened
150a0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
150b0 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66  thread. */.    f
150c0 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61  or(p=pTsdro->pPa
150d0 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c  ger; p && (nReq<
150e0 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e  0 || nReleased<n
150f0 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  Req); p=p->pNext
15100 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
15110 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  pPg;.      int r
15120 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72  c;..      /* For
15130 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79   each pager, try
15140 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79   to free as many
15150 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
15160 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20  le (without .   
15170 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73     ** calling fs
15180 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73  ync() if this is
15190 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
151a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65  tion of the oute
151b0 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rmost .      ** 
151c0 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
151d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
151e0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61  ITE_OK==(rc = pa
151f0 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69  ger_recycle(p, i
15200 2c 20 26 70 50 67 29 29 20 26 26 20 70 50 67 29  , &pPg)) && pPg)
15210 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65   {.        /* We
15220 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65  've found a page
15230 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69   to free. At thi
15240 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65  s point the page
15250 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20   has been .     
15260 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72     ** removed fr
15270 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68  om the page hash
15280 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73  -table, free-lis
15290 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73  t and synced-lis
152a0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70  t .        ** (p
152b0 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74  FirstSynced). It
152c0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65   is still in the
152d0 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c   all pages (pAll
152e0 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  ) list. .       
152f0 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
15300 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
15310 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
15320 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
15330 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74  ** Todo: Check t
15340 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c  he Pager.pStmt l
15350 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ist to make sure
15360 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20   this is Ok. It 
15370 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
15380 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a  ably is though..
15390 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
153a0 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a     PgHdr *pTmp;.
153b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
153c0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  pPg );.        p
153d0 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
153e0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
153f0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d          if( pPg=
15400 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  =p->pAll ){.    
15410 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d         p->pAll =
15420 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
15430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15440 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54           for( pT
15450 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70  mp=p->pAll; pTmp
15460 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b  ->pNextAll!=pPg;
15470 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
15480 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20  tAll ){}.       
15490 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c     pTmp->pNextAl
154a0 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
154b0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
154c0 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b       nReleased +
154d0 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a  = sqliteAllocSiz
154e0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
154f0 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
15500 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15510 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15520 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
15530 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
15540 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
15550 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15560 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20  file or .       
15570 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70   ** journal in p
15580 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20  ager_recycle(). 
15590 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74  The error is not
155a0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
155b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c   .        ** cal
155c0 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ler of this func
155d0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73  tion. Instead, s
155e0 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72  et the Pager.err
155f0 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20  Code variable.. 
15600 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72         ** The er
15610 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
15620 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
15630 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74   (or users, in t
15640 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 20  he case .       
15650 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20   ** of a shared 
15660 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20  pager cache) of 
15670 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68  the pager for wh
15680 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63  ich the error oc
15690 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  cured..        *
156a0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
156b0 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
156c0 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d  ITE_IOERR || rc=
156d0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a  =SQLITE_FULL );.
156e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
156f0 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
15700 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
15710 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
15720 70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  p, rc);.      }.
15730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15740 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
15750 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15760 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
15770 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  MANAGEMENT */../
15780 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
15790 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61  age..**.** A rea
157a0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69  d lock on the di
157b0 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69  sk file is obtai
157c0 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72  ned when the fir
157d0 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69  st page is acqui
157e0 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65  red. .** This re
157f0 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70  ad lock is dropp
15800 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ed when the last
15810 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
15820 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20  d..**.** A _get 
15830 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
15840 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
15850 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
15860 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
15870 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
15880 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
15890 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
158a0 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
158b0 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
158c0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
158d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
158e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
158f0 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
15900 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
15910 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
15920 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
15930 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
15940 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
15950 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
15960 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
15970 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
15980 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
15990 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
159a0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
159b0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
159c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
159d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
159e0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
159f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
15a00 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
15a10 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  er_lookup().  Bo
15a20 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
15a30 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74  and _lookup() at
15a40 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
15a50 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
15a60 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
15a70 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
15a80 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
15a90 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
15aa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
15ab0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
15ac0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
15ad0 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73  _lookup().** jus
15ae0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
15af0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
15b00 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
15b10 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
15b20 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
15b30 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
15b40 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
15b50 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
15b60 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
15b70 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20  Since _lookup() 
15b80 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
15b90 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
15ba0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
15bb0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
15bc0 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
15bd0 66 20 63 6c 72 46 6c 61 67 20 69 73 20 66 61 6c  f clrFlag is fal
15be0 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
15bf0 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
15c00 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
15c10 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61 67  k..** If clfFlag
15c20 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
15c30 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
15c40 62 6f 75 74 20 74 6f 20 62 65 20 65 72 61 73 65  bout to be erase
15c50 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74 74  d and.** rewritt
15c60 65 6e 20 77 69 74 68 6f 75 74 20 66 69 72 73 74  en without first
15c70 20 62 65 69 6e 67 20 72 65 61 64 20 73 6f 20 74   being read so t
15c80 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
15c90 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65   it doing.** the
15ca0 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e   disk I/O..*/.in
15cb0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 61  t sqlite3pager_a
15cc0 63 71 75 69 72 65 28 50 61 67 65 72 20 2a 70 50  cquire(Pager *pP
15cd0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
15ce0 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 2c 20   void **ppPage, 
15cf0 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a 20 20  int clrFlag){.  
15d00 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
15d10 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
15d20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
15d30 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
15d40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
15d50 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
15d60 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
15d70 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
15d80 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
15d90 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
15da0 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
15db0 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20  O || pgno==0 || 
15dc0 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
15dd0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
15de0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15df0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
15e00 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
15e10 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
15e20 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
15e30 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
15e40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
15e50 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
15e60 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
15e70 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
15e80 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
15e90 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
15ea0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
15eb0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
15ec0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
15ed0 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
15ee0 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
15ef0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
15f00 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
15f10 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
15f20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
15f30 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b  ==0 && !MEMDB ){
15f40 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
15f50 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
15f60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15f70 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
15f80 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
15f90 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
15fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15fb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
15fc0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
15fd0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
15fe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15ff0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
16000 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
16010 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
16020 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
16030 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16040 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
16050 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
16060 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
16070 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
16080 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  if( hasHotJourna
16090 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
160a0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
160b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
160c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
160d0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
160e0 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a   it is.       **
160f0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16100 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
16110 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
16120 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
16130 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  e.       ** EXCL
16140 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16150 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16160 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
16170 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  en the.       **
16180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16190 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
161a0 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
161b0 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
161c0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
161d0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
161e0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
161f0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
16200 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
16210 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
16220 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20    ** .       ** 
16230 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
16240 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
16250 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
16260 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
16270 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
16280 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
16290 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
162a0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
162b0 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f  l to.       ** o
162c0 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
162d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
162e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
162f0 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  le..       */.  
16300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16310 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
16320 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
16330 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  CK);.       if( 
16340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16350 0a 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  .         pager_
16360 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
16370 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16380 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16390 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
163a0 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
163b0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
163c0 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20  XCLUSIVE;..     
163d0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
163e0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
163f0 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
16400 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
16410 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
16420 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
16430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
16440 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
16450 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
16460 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
16470 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
16480 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
16490 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
164a0 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
164b0 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
164c0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
164d0 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
164e0 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
164f0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
16500 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
16510 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
16520 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
16530 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
16540 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
16550 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
16560 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16570 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
16580 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
16590 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
165a0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
165b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
165c0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
165d0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
165e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
165f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16600 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
16610 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
16620 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
16630 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
16640 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  d = 0;.       pP
16650 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
16660 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
16670 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
16680 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
16690 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
166a0 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
166b0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
166c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
166d0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
166e0 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
166f0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
16700 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
16710 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
16720 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
16730 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
16740 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
16750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16760 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
16770 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
16780 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a  , rc);.       }.
16790 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
167a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
167b0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
167c0 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
167d0 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
167e0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
167f0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  no);.    if( MEM
16800 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  DB && pPager->st
16810 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
16820 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
16830 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16840 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
16850 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
16860 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
16870 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
16880 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
16890 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
168a0 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  t h;.    TEST_IN
168b0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
168c0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
168d0 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
168e0 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
168f0 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
16900 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
16910 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
16920 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
16930 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
16940 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
16950 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
16960 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65  esize_hash_table
16970 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  (pPager,.       
16980 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73      pPager->nHas
16990 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50  h<256 ? 256 : pP
169a0 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a  ager->nHash*2);.
169b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
169c0 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a  er->nHash==0 ){.
169d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
169e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
169f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16a00 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
16a10 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
16a20 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
16a30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20  ger->pageSize.  
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
16a60 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
16a70 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
16aa0 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
16ab0 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y) );.      if( 
16ac0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
16ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ae0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
16af0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
16b00 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
16b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
16b20 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  DB ){.        me
16b30 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
16b40 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
16b50 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
16b60 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  tory));.      }.
16b70 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
16b80 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
16b90 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
16ba0 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
16bb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
16bc0 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
16bd0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
16be0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
16bf0 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  r->nPage>pPager-
16c00 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20 20  >nMaxPage ){.   
16c10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16c20 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28  ger->nMaxPage==(
16c30 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29  pPager->nPage-1)
16c40 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
16c50 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a  er->nMaxPage++;.
16c60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
16c70 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
16c80 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
16c90 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  er, 1, &pPg);.  
16ca0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16cd0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
16ce0 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a 20 20  (pPg) ;.    }.  
16cf0 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
16d00 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
16d10 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
16d20 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
16d30 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
16d40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16d50 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
16d60 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
16d70 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
16d80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
16d90 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
16da0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
16db0 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
16dc0 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
16dd0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
16de0 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
16df0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
16e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e10 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
16e20 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
16e30 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
16e40 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16e50 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
16e60 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
16e70 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
16e80 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
16e90 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
16ea0 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
16eb0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
16ec0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
16ed0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
16ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
16ef0 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
16f00 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
16f10 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61    }.    makeClea
16f20 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
16f30 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
16f40 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
16f50 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
16f60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
16f70 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
16f80 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
16f90 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
16fa0 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
16fb0 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
16fc0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
16fd0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
16fe0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
16ff0 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
17000 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
17010 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17020 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74  rCode;.      ret
17030 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
17040 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
17050 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
17060 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
17070 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
17080 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
17090 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
170a0 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
170b0 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
170c0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
170d0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
170e0 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67  (pPager)<(int)pg
170f0 6e 6f 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 20  no || MEMDB.    
17100 20 20 20 20 20 7c 7c 20 28 63 6c 72 46 6c 61 67       || (clrFlag
17110 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77   && !pPager->alw
17120 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 0a 20 20  aysRollback) .  
17130 20 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65    ){.      memse
17140 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
17150 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
17160 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
17180 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
17190 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
171a0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
171b0 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
171c0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
171d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
171e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
171f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
17200 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
17210 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
17220 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20  O_DATA(pPg),.   
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17240 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
17250 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17260 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52      }.      IOTR
17270 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
17280 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
17290 6f 29 29 0a 20 20 20 20 20 20 54 52 41 43 45 33  o)).      TRACE3
172a0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
172b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
172c0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
172d0 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  o);.      CODEC1
172e0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
172f0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
17300 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
17310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17320 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
17330 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
17340 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AD ){.        pP
17350 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20  g->pgno = 0;.   
17360 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
17370 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
17380 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
17390 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
173a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
173b0 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70       TEST_INCR(p
173c0 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
173d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
173e0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61    /* Link the pa
173f0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
17400 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
17410 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70     h = pgno & (p
17420 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
17430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
17440 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d  o!=0 );.    pPg-
17450 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
17460 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
17470 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
17480 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
17490 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
174a0 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
174b0 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
174c0 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
174d0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
174e0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
174f0 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
17500 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
17510 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
17520 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
17530 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
17540 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
17550 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
17560 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
17570 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
17580 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54 5f  he. */.    TEST_
17590 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
175a0 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66  t);.    page_ref
175b0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
175c0 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Page = PGHDR_TO_
175d0 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74  DATA(pPg);.  ret
175e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
175f0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
17600 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
17610 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
17620 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
17630 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
17640 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
17650 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
17660 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
17670 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
17680 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17690 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   cache..**.** Se
176a0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61  e also sqlite3pa
176b0 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20  ger_get().  The 
176c0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
176d0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
176e0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61  ** and sqlite3pa
176f0 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61  ger_get() is tha
17700 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
17710 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
17720 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
17730 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
17740 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
17750 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
17760 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
17770 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
17780 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
17790 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
177a0 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
177b0 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
177c0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
177d0 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50  e3pager_lookup(P
177e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
177f0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
17800 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
17810 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
17820 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
17830 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
17840 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
17850 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
17860 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
17870 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
17880 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
17890 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
178a0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
178b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
178c0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
178d0 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
178e0 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
178f0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
17900 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
17910 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
17920 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
17930 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
17940 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
17950 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
17960 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
17970 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
17980 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
17990 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
179a0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
179b0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
179c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
179d0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
179e0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
179f0 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
17a00 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
17a10 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
17a20 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
17a30 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
17a40 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
17a50 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
17a60 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
17a70 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
17a80 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
17a90 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
17aa0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
17ab0 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
17ac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
17ad0 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
17ae0 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
17af0 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
17b00 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
17b10 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
17b20 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
17b30 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
17b40 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
17b50 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  r;.    pPager = 
17b60 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
17b70 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
17b80 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  = 0;.    pPg->pP
17b90 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72  revFree = pPager
17ba0 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61  ->pLast;.    pPa
17bb0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
17bc0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
17bd0 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
17be0 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
17bf0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
17c00 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
17c10 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
17c20 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  st = pPg;.    }.
17c30 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
17c40 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  dSync==0 && pPag
17c50 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
17c60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
17c70 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
17c80 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  d = pPg;.    }. 
17c90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
17ca0 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
17cb0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
17cc0 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70  tructor(pData, p
17cd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17ce0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
17cf0 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
17d00 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
17d10 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
17d20 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
17d30 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
17d40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
17d50 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
17d60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
17d70 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
17d80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17d90 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d  >nRef==0 && !MEM
17da0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  DB ){.      page
17db0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17dd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17de0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
17df0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
17e00 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
17e10 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
17e20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
17e30 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
17e40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17e50 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
17e60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
17e70 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
17e80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17e90 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
17ea0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
17eb0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
17ec0 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
17ed0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
17ee0 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
17ef0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
17f00 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
17f10 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
17f20 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
17f30 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
17f40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
17f50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
17f60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17f70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
17f80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17f90 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
17fa0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
17fb0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17fc0 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
17fd0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
17fe0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
17ff0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
18000 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
18010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
18020 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
18030 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
18040 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
18050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18060 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
18070 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
18080 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
18090 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
180a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
180b0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  , &pPager->jfd,.
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
180f0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
18100 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
18110 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
18120 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
18130 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
18140 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
18160 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
18170 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73  journal;.  }.  s
18180 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
18190 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
181a0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
181b0 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ync);.  sqlite3O
181c0 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61  sSetFullSync(pPa
181d0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
181e0 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20  >full_fsync);.  
181f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
18200 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  ectory(pPager->j
18210 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  fd, pPager->zDir
18220 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65  ectory);.  pPage
18230 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
18240 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
18250 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
18260 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
18270 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
18280 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
18290 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
182a0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
182b0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
182c0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
182d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
182e0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
182f0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
18300 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
18310 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
18320 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
18330 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
18340 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
18350 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
18360 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
18370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18380 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
18390 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61  r_stmt_begin(pPa
183a0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
183b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
183c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
183d0 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  M ){.    rc = pa
183e0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
183f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
18400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18410 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18420 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
18430 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18440 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
18450 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
18460 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
18470 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
18480 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18490 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
184a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
184b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
184c0 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  as a malloc() fa
184d0 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77  ilure, then we w
184e0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69  ill not be closi
184f0 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ng the pager.   
18500 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c   ** file. So del
18510 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ete any journal 
18520 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65  file we may have
18530 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f   just created. O
18540 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a  therwise,.    **
18550 20 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c   the system will
18560 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77   get confused, w
18570 65 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f  e have a read-lo
18580 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ck on the file a
18590 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74  nd a.    ** myst
185a0 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  erious journal h
185b0 61 73 20 61 70 70 65 61 72 65 64 20 69 6e 20 74  as appeared in t
185c0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20  he filesystem.. 
185d0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
185e0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
185f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  ->zJournal);.  }
18600 65 6c 73 65 7b 0a 20 20 20 20 70 61 67 65 72 5f  else{.    pager_
18610 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
18620 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18630 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
18640 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
18650 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
18660 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
18670 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
18680 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
18690 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
186a0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
186b0 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
186c0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
186d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
186e0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
186f0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
18700 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
18710 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
18720 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
18730 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
18740 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
18750 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
18760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
18770 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
18780 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18790 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
187a0 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
187b0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
187c0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
187d0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
187e0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
187f0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
18800 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
18810 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
18820 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
18830 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
18840 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
18850 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
18860 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
18870 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
18880 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
18890 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
188a0 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
188b0 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
188c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
188d0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
188e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
188f0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
18900 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
18910 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
18920 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
18930 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
18940 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
18950 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
18960 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
18970 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
18980 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
18990 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
189a0 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
189b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
189c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
189d0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
189e0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
189f0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
18a00 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
18a10 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
18a20 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
18a30 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
18a40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
18a50 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
18a60 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
18a70 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
18a80 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
18a90 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
18aa0 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
18ab0 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
18ac0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
18ad0 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
18ae0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
18af0 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  gin(void *pData,
18b00 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
18b10 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
18b20 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
18b30 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
18b40 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
18b50 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18b60 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
18b70 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
18b80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18b90 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
18ba0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
18bb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18bc0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
18bd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18be0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
18bf0 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
18c00 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
18c10 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
18c20 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
18c30 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
18c40 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
18c50 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
18c60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18c70 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
18c80 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
18c90 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
18ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18cb0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
18cc0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
18cd0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
18ce0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
18cf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
18d00 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
18d10 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
18d20 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
18d30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18d40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18d70 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
18d80 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
18d90 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
18da0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
18db0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18dc0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
18dd0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
18de0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
18df0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
18e00 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
18e10 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
18e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18e30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
18e50 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53 65   page dirty.  Se
18e60 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61 67  t its dirty flag
18e70 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74   and add it to t
18e80 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65  he dirty.** page
18e90 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
18ea0 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28   void makeDirty(
18eb0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
18ec0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  f( pPg->dirty==0
18ed0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
18ee0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
18ef0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  ger;.    pPg->di
18f00 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
18f10 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
18f20 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69  r->pDirty;.    i
18f30 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  f( pPager->pDirt
18f40 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  y ){.      pPage
18f50 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  r->pDirty->pPrev
18f60 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20  Dirty = pPg;.   
18f70 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65   }.    pPg->pPre
18f80 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  vDirty = 0;.    
18f90 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
18fa0 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   pPg;.  }.}../*.
18fb0 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63  ** Make a page c
18fc0 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73  lean.  Clear its
18fd0 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72   dirty bit and r
18fe0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
18ff0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
19000 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
19010 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
19020 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
19030 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
19040 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
19050 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   0;.    if( pPg-
19060 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
19070 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50   pPg->pDirty->pP
19080 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  revDirty = pPg->
19090 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20  pPrevDirty;.    
190a0 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
190b0 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20  PrevDirty ){.   
190c0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
190d0 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  ty->pDirty = pPg
190e0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
190f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
19100 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
19110 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
19120 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
19130 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
19140 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
19150 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
19160 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
19170 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
19180 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
19190 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
191a0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
191b0 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
191c0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
191d0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
191e0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
191f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
19200 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
19210 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
19220 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
19230 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
19240 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19250 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
19260 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
19270 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
19280 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
19290 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
192a0 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
192b0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
192c0 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
192d0 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
192e0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
192f0 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
19300 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
19310 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
19320 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
19330 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
19340 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
19350 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
19360 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
19370 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
19380 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
19390 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
193a0 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
193b0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
193c0 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
193d0 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
193e0 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
193f0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
19400 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
19410 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
19420 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
19430 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65  ) or sqlite3page
19440 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  r_rollback() to.
19450 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74  ** reset..*/.int
19460 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
19470 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ite(void *pData)
19480 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
19490 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
194a0 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
194b0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
194c0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
194d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
194e0 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
194f0 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
19500 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
19510 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
19520 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
19530 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
19540 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
19550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
19560 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
19570 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
19580 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
19590 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
195a0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
195b0 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
195c0 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
195d0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
195e0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
195f0 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
19600 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
19610 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44  ay..  */.  makeD
19620 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
19630 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
19640 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && (pPg->inStmt 
19650 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
19660 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
19670 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
19680 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  he = 1;.  }else{
19690 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
196a0 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
196b0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
196c0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
196d0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
196e0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
196f0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
19700 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
19710 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
19720 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
19730 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
19740 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
19750 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
19760 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
19770 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
19780 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
19790 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
197a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
197b0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
197c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
197d0 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74  pager_begin(pDat
197e0 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  a, 0);.    if( r
197f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19800 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19810 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19820 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19830 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19840 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
19850 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19860 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
19870 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
19880 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
19890 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
198a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
198b0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
198c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
198d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
198e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
198f0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
19900 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
19910 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
19920 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
19930 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
19940 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
19950 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
19960 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
19970 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
19980 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
19990 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
199a0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
199b0 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
199c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
199d0 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
199e0 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
199f0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
19a00 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
19a10 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73  l && (pPager->us
19a20 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44  eJournal || MEMD
19a30 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  B) ){.      if( 
19a40 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
19a50 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
19a60 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
19a70 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20  int szPg;.      
19a80 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
19a90 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f           PgHisto
19aa0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
19ab0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
19ac0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
19ad0 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41    TRACE3("JOURNA
19ae0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
19af0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19b00 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
19b10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19b20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
19b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
19b40 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
19b50 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
19b60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
19b70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19b80 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
19b90 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
19ba0 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
19bb0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
19bc0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
19bd0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
19be0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
19bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
19c00 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20  cksum, saved;.  
19c10 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
19c20 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  ata2, *pEnd;.   
19c30 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
19c40 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
19c50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
19c60 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
19c70 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
19c80 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
19c90 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
19ca0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
19cb0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
19cc0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
19cd0 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
19ce0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
19cf0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
19d00 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
19d10 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
19d20 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
19d30 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
19d40 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
19d50 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
19d60 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
19d70 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
19d80 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44         pEnd = pD
19d90 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70  ata2 + pPager->p
19da0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
19db0 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a     pData2 -= 4;.
19dc0 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
19dd0 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20  = *(u32*)pEnd;. 
19de0 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69           put32bi
19df0 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b  ts(pEnd, cksum);
19e00 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20  .          szPg 
19e10 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
19e20 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+8;.          
19e30 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
19e40 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
19e50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19e60 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
19e70 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
19e80 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20   szPg);.        
19e90 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
19ea0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
19eb0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
19ec0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
19ed0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
19ee0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50  >journalOff, szP
19ef0 67 29 29 0a 20 20 20 20 20 20 20 20 20 20 70 50  g)).          pP
19f00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19f10 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20   += szPg;.      
19f20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52      TRACE4("JOUR
19f30 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
19f40 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19f70 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
19f80 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
19f90 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45         *(u32*)pE
19fa0 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20  nd = saved;...  
19fb0 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
19fc0 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
19fd0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
19fe0 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
19ff0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1a000 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1a010 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1a020 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1a030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a060 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a070 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a080 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1a090 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
1a0a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1a0b0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1a0c0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1a0d0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
1a0e0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1a0f0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1a100 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
1a110 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1a120 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1a130 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a140 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1a150 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1a160 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1a170 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1a180 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1a190 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
1a1a0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1a1b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a1d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
1a1e0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1a1f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1a200 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
1a210 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1a220 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44    TRACE4("APPEND
1a230 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1a240 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
1a250 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1a260 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1a270 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1a280 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
1a290 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
1a2a0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1a2b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1a2c0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
1a2d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1a2e0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
1a2f0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
1a300 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1a310 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
1a320 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1a330 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
1a340 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
1a350 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
1a360 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1a370 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
1a380 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
1a390 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
1a3a0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
1a3b0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
1a3c0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
1a3d0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
1a3e0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
1a3f0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
1a400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a410 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1a420 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1a430 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1a440 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1a450 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  mtSize ){.      
1a460 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1a470 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1a480 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1a490 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1a4a0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1a4b0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1a4c0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1a4d0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1a4e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1a4f0 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1a500 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1a510 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1a520 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1a530 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
1a540 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1a550 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1a560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1a570 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
1a580 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
1a590 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1a5a0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1a5b0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43    }.        TRAC
1a5c0 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
1a5d0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1a5e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1a5f0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1a600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a610 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
1a620 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1a630 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1a640 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20  , 7)-4;.        
1a650 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1a660 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1a670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a680 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1a690 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
1a6a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a6b0 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  +4);.        TRA
1a6c0 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1a6d0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1a6e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a6f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1a700 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a720 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a740 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1a750 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1a760 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1a770 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1a780 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1a790 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1a7a0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1a7b0 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
1a7c0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1a7d0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1a7e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a7f0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
1a800 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
1a810 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
1a820 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1a830 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1a840 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1a850 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
1a860 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
1a870 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1a880 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
1a890 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1a8a0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
1a8b0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
1a8c0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1a8d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1a8e0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
1a8f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1a910 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
1a920 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1a930 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
1a940 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
1a950 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1a960 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
1a970 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
1a980 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
1a990 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
1a9a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1a9b0 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
1a9c0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1a9d0 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
1a9e0 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
1a9f0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1aa00 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
1aa10 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
1aa20 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e  Pg->dirty;.}.#en
1aa30 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1aa40 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
1aa50 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
1aa60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
1aa70 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
1aa80 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1aa90 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
1aaa0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
1aab0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76   sqlite3pager_ov
1aac0 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
1aad0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1aae0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
1aaf0 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1ab00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
1ab10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1ab20 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
1ab30 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
1ab40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ab50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ab60 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1ab70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1ab80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab90 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c     memcpy(pPage,
1aba0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1abb0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
1abc0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1abd0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1abe0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1abf0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ac00 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1ac10 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1ac20 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
1ac30 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1ac40 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
1ac50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1ac60 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b  page "pgno" back
1ac70 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1ac80 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1ac90 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1aca0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1acb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
1acc0 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
1acd0 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
1ace0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
1acf0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
1ad00 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1ad10 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
1ad20 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
1ad30 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
1ad40 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
1ad50 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
1ad60 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
1ad70 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
1ad80 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1ad90 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
1ada0 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
1adb0 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
1adc0 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
1add0 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
1ade0 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
1adf0 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
1ae00 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
1ae10 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
1ae20 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
1ae30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1ae40 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1ae50 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
1ae60 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
1ae70 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
1ae80 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1ae90 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1aea0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
1aeb0 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
1aec0 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
1aed0 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
1aee0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1aef0 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
1af00 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
1af10 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
1af20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
1af30 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
1af40 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
1af50 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
1af60 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1af70 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1af80 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
1af90 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
1afa0 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
1afb0 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
1afc0 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
1afd0 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
1afe0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
1aff0 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
1b000 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1b010 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
1b020 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
1b030 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1b040 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1b050 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e  use the page con
1b060 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61  tains.** critica
1b070 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1b080 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1b090 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20   it gets rolled 
1b0a0 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a  back in spite.**
1b0b0 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c   of the dont_rol
1b0c0 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
1b0d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1b0e0 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61  er_dont_write(Pa
1b0f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1b100 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1b110 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45   *pPg;..  if( ME
1b120 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  MDB ) return;.. 
1b130 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
1b140 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1b150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1b160 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65  !=0 );  /* We ne
1b170 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77  ver call _dont_w
1b180 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65 20  rite unless the 
1b190 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a  page is in mem *
1b1a0 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  /.  pPg->alwaysR
1b1b0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
1b1c0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
1b1d0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1b1e0 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
1b1f0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b200 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
1b210 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1b220 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
1b230 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
1b240 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
1b250 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
1b260 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
1b270 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
1b280 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
1b290 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
1b2a0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
1b2b0 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
1b2c0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1b2d0 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
1b2e0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
1b2f0 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
1b300 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
1b310 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
1b320 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
1b330 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
1b340 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
1b350 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
1b360 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
1b370 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
1b380 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
1b390 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
1b3a0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
1b3b0 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
1b3c0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1b3d0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1b3e0 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
1b3f0 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
1b400 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
1b410 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
1b420 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
1b430 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
1b440 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
1b450 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
1b460 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
1b470 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
1b480 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1b490 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70   pgno, PAGERID(p
1b4a0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
1b4b0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
1b4c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1b4d0 20 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61   pgno)).      ma
1b4e0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69  keClean(pPg);.#i
1b4f0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1b500 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
1b510 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
1b520 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1b530 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
1b540 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
1b550 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1b560 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1b570 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
1b580 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
1b590 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
1b5a0 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
1b5b0 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
1b5c0 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
1b5d0 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
1b5e0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
1b5f0 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
1b600 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
1b610 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
1b620 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
1b630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1b640 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
1b650 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
1b660 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
1b670 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
1b680 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
1b690 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1b6a0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  r;..  assert( pP
1b6b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1b6c0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1b6d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1b6e0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1b6f0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1b700 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1b710 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1b720 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1b730 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1b740 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1b750 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1b760 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1b770 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1b780 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b790 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1b7a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1b7b0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1b7c0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1b7d0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1b7e0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1b7f0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
1b800 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1b810 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1b820 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1b830 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1b840 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
1b850 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
1b860 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
1b870 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
1b880 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
1b890 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1b8a0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1b8b0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f  pPager));.    IO
1b8c0 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20  TRACE(("GARBAGE 
1b8d0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1b8e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
1b8f0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1b900 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
1b910 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
1b920 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1b930 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
1b940 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1b950 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
1b960 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
1b970 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1b980 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b990 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
1b9a0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1b9b0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
1b9c0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1b9d0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1b9e0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1b9f0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
1ba00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
1ba10 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
1ba20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1ba30 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1ba40 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
1ba50 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
1ba60 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
1ba70 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
1ba80 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
1ba90 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1baa0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1bab0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
1bac0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
1bad0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
1bae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1baf0 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
1bb00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1bb10 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
1bb20 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
1bb30 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1bb40 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1bb50 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
1bb60 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1bb70 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
1bb80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1bb90 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1bba0 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  .  TRACE2("COMMI
1bbb0 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
1bbc0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1bbd0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
1bbe0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1bbf0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1bc00 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
1bc10 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63  ( pPg ){.      c
1bc20 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
1bc30 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1bc40 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
1bc50 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1bc60 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1bc70 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1bc80 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
1bc90 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1bca0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
1bcb0 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
1bcc0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
1bcd0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   0;.      pPg = 
1bce0 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
1bcf0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
1bd00 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64  Dirty = 0;.#ifnd
1bd10 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
1bd20 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
1bd30 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
1bd40 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1bd50 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1bd60 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1bd70 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1bd80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bd90 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
1bda0 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
1bdb0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
1bdc0 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
1bdd0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
1bde0 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
1bdf0 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
1be00 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
1be10 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1be20 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1be30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1be40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1be50 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
1be60 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
1be70 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
1be80 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
1be90 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33  onsuming sqlite3
1bea0 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a  OsSync() calls).
1beb0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
1bec0 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
1bed0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1bee0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1bef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bf00 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
1bf10 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1bf20 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
1bf30 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
1bf40 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
1bf50 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1bf60 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
1bf70 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
1bf80 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  c(pPager, 0, 0);
1bf90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bfa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1bfb0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
1bfc0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
1bfd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bfe0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1bff0 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
1c000 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
1c010 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
1c020 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  ARED mode..** Al
1c030 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
1c040 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
1c050 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
1c060 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
1c070 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
1c080 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
1c090 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1c0a0 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
1c0b0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
1c0c0 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
1c0d0 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
1c0e0 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
1c0f0 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f  ocol (SQLITE_PRO
1c100 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73  TOCOL) or unless
1c110 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
1c120 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
1c130 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
1c140 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
1c150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
1c160 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
1c170 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
1c180 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
1c190 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
1c1a0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
1c1b0 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
1c1c0 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
1c1d0 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
1c1e0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1c1f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1c200 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1c210 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
1c220 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c230 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c  c;.  TRACE2("ROL
1c240 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1c250 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c260 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1c270 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
1c280 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
1c290 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
1c2a0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
1c2b0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
1c2c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
1c2d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1c2e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
1c2f0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
1c300 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
1c310 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
1c320 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1c330 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
1c340 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
1c350 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
1c360 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
1c370 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
1c380 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1c390 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1c3a0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
1c3b0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1c3c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
1c3d0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
1c3e0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1c3f0 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
1c400 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
1c410 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c420 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52         TRACE3("R
1c430 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20  OLLBACK-PAGE %d 
1c440 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  of %d\n", p->pgn
1c450 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1c460 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r));.      }else
1c470 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  {.        TRACE3
1c480 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
1c490 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e  an on %d\n", p->
1c4a0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1c4b0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ager));.      }.
1c4c0 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
1c4d0 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
1c4e0 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
1c4f0 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
1c500 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  l = 0;.      p->
1c510 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1c520 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d    p->pPrevStmt =
1c530 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20   p->pNextStmt = 
1c540 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  0;.      if( pPa
1c550 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
1c560 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1c570 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
1c580 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50  R_TO_DATA(p), pP
1c590 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c5a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c5b0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
1c5c0 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
1c5d0 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
1c5e0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1c5f0 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   = pPager->origD
1c600 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  bSize;.    memor
1c610 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
1c620 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
1c630 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
1c640 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1c650 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1c660 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c670 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
1c680 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
1c690 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
1c6a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
1c6b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
1c6c0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
1c6d0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
1c6e0 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
1c6f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
1c700 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c710 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
1c720 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c730 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
1c740 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
1c750 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1c760 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1c770 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1c780 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1c790 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c7a0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
1c7b0 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
1c7c0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
1c7d0 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
1c7e0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20  Pager);.    rc2 
1c7f0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1c800 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1c810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1c830 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
1c840 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
1c850 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1c860 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ger);.  }.  pPag
1c870 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1c880 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
1c890 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
1c8a0 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
1c8b0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
1c8c0 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
1c8d0 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
1c8e0 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
1c8f0 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
1c900 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
1c910 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e   .  ** persisten
1c920 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  t..  */.  return
1c930 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1c940 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
1c950 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1c960 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1c970 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
1c980 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
1c990 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
1c9a0 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
1c9b0 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
1c9c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1c9d0 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  3pager_isreadonl
1c9e0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
1c9f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1ca00 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
1ca10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ca20 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1ca30 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1ca40 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1ca50 65 33 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  e3pager_refcount
1ca60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ca70 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1ca80 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
1ca90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1caa0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cab0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1cac0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
1cad0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
1cae0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
1caf0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
1cb00 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
1cb10 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
1cb20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
1cb30 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
1cb40 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
1cb50 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
1cb60 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
1cb70 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
1cb80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
1cb90 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
1cba0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
1cbb0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
1cbc0 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
1cbd0 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
1cbe0 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
1cbf0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
1cc00 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
1cc10 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
1cc20 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
1cc30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1cc40 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
1cc50 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
1cc60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1cc70 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
1cc80 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
1cc90 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1cca0 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
1ccb0 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
1ccc0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
1ccd0 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
1cce0 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
1ccf0 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
1cd00 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
1cd10 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
1cd20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
1cd30 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1cd40 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
1cd50 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
1cd60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1cd70 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
1cd80 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
1cd90 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1cda0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
1cdb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1cdc0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1cdd0 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
1cde0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
1cdf0 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  ze>=0 );.  TRACE
1ce00 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
1ce10 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1ce20 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1ce30 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
1ce40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
1ce50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1ce60 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
1ce70 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75  dbSize;.    retu
1ce80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ce90 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
1cea0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
1ceb0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1cec0 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  Autoopen = 1;.  
1ced0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cee0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1cef0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1cf00 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65  lOpen );.  pPage
1cf10 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->aInStmt = sql
1cf20 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
1cf30 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1cf40 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1cf50 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  >aInStmt==0 ){. 
1cf60 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c     /* sqlite3OsL
1cf70 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
1cf80 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f  SHARED_LOCK); */
1cf90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cfa0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69  TE_NOMEM;.  }.#i
1cfb0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72  fndef NDEBUG.  r
1cfc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1cfd0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1cfe0 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
1cff0 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
1d000 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1d010 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
1d020 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
1d030 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72  tJSize == pPager
1d040 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
1d050 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
1d060 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
1d070 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1d080 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
1d090 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1d0a0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
1d0b0 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
1d0c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
1d0d0 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
1d0e0 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
1d0f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1d100 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d110 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
1d120 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65  mp(zTemp, &pPage
1d130 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
1d140 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1d150 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1d160 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
1d170 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
1d180 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1d190 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1d1a0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1d1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d1c0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
1d1d0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
1d1e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1d1f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1d200 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
1d210 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1d220 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
1d230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d240 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
1d250 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1d260 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1d270 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
1d280 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1d290 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1d2a0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1d2b0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
1d2c0 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f   TRACE2("STMT-CO
1d2d0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1d2e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1d2f0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1d300 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
1d310 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
1d320 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
1d330 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1d340 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
1d350 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
1d360 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
1d370 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
1d380 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1d390 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1d3a0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1d3b0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1d3c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
1d3d0 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
1d3e0 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Stmt;.      asse
1d3f0 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  rt( pPg->inStmt 
1d400 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1d410 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d420 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
1d430 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
1d440 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  = 0;.      if( M
1d450 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1d460 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1d470 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1d480 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1d490 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1d4a0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
1d4b0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
1d4c0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
1d4d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
1d4e0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1d4f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1d500 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
1d510 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1d520 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
1d530 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1d540 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1d550 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d560 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
1d570 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
1d580 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
1d590 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
1d5a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d5b0 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
1d5c0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1d5d0 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
1d5e0 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
1d5f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1d600 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
1d610 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
1d620 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  pPg;.      for(p
1d630 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
1d640 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1d650 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20  pNextStmt){.    
1d660 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1d670 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1d680 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1d690 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1d6a0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
1d6b0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1d6c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1d6d0 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  g), pHist->pStmt
1d6e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1d6f0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
1d700 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
1d710 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
1d720 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1d730 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1d740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1d750 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1d760 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
1d770 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e        memoryTrun
1d780 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
1d790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d7a0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1d7b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d7c0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50  stmt_playback(pP
1d7d0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
1d7e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1d7f0 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72  mt_commit(pPager
1d800 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d820 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1d830 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
1d840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1d860 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1d870 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1d880 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
1d890 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
1d8a0 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  _filename(Pager 
1d8b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1d8c0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
1d8d0 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
1d8e0 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74  eturn the direct
1d8f0 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ory of the datab
1d900 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1d910 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1d920 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61  pager_dirname(Pa
1d930 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d940 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1d950 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
1d960 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
1d970 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
1d980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d990 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1d9a0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f  *sqlite3pager_jo
1d9b0 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
1d9c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1d9d0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
1d9e0 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
1d9f0 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
1da00 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
1da10 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
1da20 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
1da30 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
1da40 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
1da50 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
1da60 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1da70 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  nosync(Pager *pP
1da80 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1da90 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1daa0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1dab0 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
1dac0 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
1dad0 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
1dae0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
1daf0 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
1db00 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
1db10 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
1db20 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
1db30 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
1db40 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
1db50 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
1db60 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
1db70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1db80 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1db90 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
1dba0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1dbb0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
1dbc0 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
1dbd0 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
1dbe0 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
1dbf0 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
1dc00 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1dc10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1dc20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
1dc30 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
1dc40 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
1dc50 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ter;.  int rc;..
1dc60 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
1dc70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
1dc80 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72   writing. */.  r
1dc90 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1dca0 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  _get(pPager, 1, 
1dcb0 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
1dcc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1dcd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
1dce0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1dcf0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  ite(pPage);.  if
1dd00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dd10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1dd20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72  /* Read the curr
1dd30 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74  ent value at byt
1dd40 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64  e 24. */.  pPgHd
1dd50 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  r = DATA_TO_PGHD
1dd60 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e  R(pPage);.  chan
1dd70 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
1dd80 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
1dd90 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49  dr, 24);..  /* I
1dda0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1ddb0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1ddc0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1ddd0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1dde0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
1ddf0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1de00 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
1de10 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c  ATA(pPgHdr))+24,
1de20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1de30 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
1de40 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
1de50 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ce. */.  sqlite3
1de60 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
1de70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
1de80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1de90 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1dea0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1deb0 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
1dec0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
1ded0 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
1dee0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1def0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1df00 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1df10 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
1df20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1df30 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
1df40 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
1df50 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
1df60 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
1df70 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
1df80 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1df90 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
1dfa0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
1dfb0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1dfc0 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
1dfd0 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
1dfe0 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
1dff0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
1e000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e010 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
1e020 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
1e030 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
1e040 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1e050 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
1e060 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1e070 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
1e080 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
1e090 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
1e0a0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
1e0b0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
1e0c0 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
1e0d0 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
1e0e0 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
1e0f0 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  o an sqlite3page
1e100 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  r_sync() call..*
1e110 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1e120 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
1e130 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
1e140 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
1e150 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
1e160 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
1e170 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
1e180 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1e190 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1e1a0 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65  3pager_sync(Page
1e1b0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
1e1c0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
1e1d0 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20  Pgno nTrunc){.  
1e1e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e1f0 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44  OK;..  TRACE4("D
1e200 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
1e210 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
1e220 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
1e230 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
1e240 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
1e250 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a  , nTrunc);..  /*
1e260 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1e270 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
1e280 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
1e290 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
1e2a0 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
1e2b0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1e2c0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
1e2d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1e2e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1e2f0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
1e300 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
1e310 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1e320 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
1e330 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
1e340 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1e350 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
1e360 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1e370 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1e380 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1e390 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1e3a0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1e3b0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1e3c0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1e3d0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1e3e0 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1e3f0 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1e400 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1e410 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1e420 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1e430 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1e440 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1e450 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1e460 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1e470 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1e480 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1e490 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1e4a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e4b0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1e4c0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1e4d0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1e4e0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1e4f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1e500 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1e510 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e520 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1e530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e540 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e550 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
1e560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1e570 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
1e580 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
1e590 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
1e5a0 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
1e5b0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
1e5c0 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1e5d0 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1e5e0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1e5f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1e600 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
1e610 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e620 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1e630 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a     void *pPage;.
1e640 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69          int iSki
1e650 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
1e660 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  O(pPager);.     
1e670 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63     for( i=nTrunc
1e680 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f  +1; i<=pPager->o
1e690 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29  rigDbSize; i++ )
1e6a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1e6b0 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
1e6c0 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c  rnal[i/8] & (1<<
1e6d0 28 69 26 37 29 29 29 20 26 26 20 69 21 3d 69 53  (i&7))) && i!=iS
1e6e0 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
1e6f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1e700 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1e710 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
1e720 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1e740 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1e750 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e760 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1e770 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1e780 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
1e790 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e7b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e7c0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1e7d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e7e0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
1e7f0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1e800 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
1e810 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
1e820 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
1e830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e840 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1e850 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1e860 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1e870 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e880 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1e890 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1e8a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e8b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1e8c0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1e8d0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e8e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
1e8f0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1e900 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1e910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e920 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1e930 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1e940 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1e950 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1e960 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e970 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
1e980 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1e990 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1e9a0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1e9b0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1e9c0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1e9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1e9e0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20  o sync_exit;..  
1e9f0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
1ea00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1ea10 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1ea20 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
1ea30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1ea40 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1ea50 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  0);.    }.    IO
1ea60 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
1ea70 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
1ea80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1ea90 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
1eaa0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
1eab0 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
1eac0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ead0 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
1eae0 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
1eaf0 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
1eb00 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1eb10 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1eb20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1eb30 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
1eb40 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
1eb50 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f  d by pData to lo
1eb60 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
1eb70 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  he file. .**.** 
1eb80 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
1eb90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1eba0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1ebb0 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74  pgno. If current
1ebc0 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73   page.** pgno is
1ebd0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1ebe0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1ebf0 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
1ec00 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79  written there by
1ec10 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74  .** by this rout
1ec20 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70  ine. The same ap
1ec30 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67  plies to the pag
1ec40 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74  e pData refers t
1ec50 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  o on entry to.**
1ec60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1ec70 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
1ec80 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65  to the page refe
1ec90 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20  red to by pData 
1eca0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
1ecb0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
1ecc0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
1ecd0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61  ed with page pDa
1ece0 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  ta (i.e. data st
1ecf0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
1ed00 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
1ed10 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
1ed20 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
1ed30 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1ed40 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
1ed50 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1ed60 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
1ed70 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
1ed80 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1ed90 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
1eda0 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
1edb0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1edc0 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
1edd0 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
1ede0 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
1edf0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
1ee00 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
1ee10 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
1ee20 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
1ee30 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
1ee40 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
1ee50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1ee60 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65  er_movepage(Page
1ee70 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
1ee80 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e  *pData, Pgno pgn
1ee90 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1eea0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1eeb0 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72  (pData);.  PgHdr
1eec0 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
1eed0 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
1eee0 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
1eef0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1ef00 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35  f>0 );..  TRACE5
1ef10 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
1ef20 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
1ef30 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
1ef40 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
1ef50 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1ef60 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1ef70 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41  , pgno);.  IOTRA
1ef80 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
1ef90 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1efa0 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
1efb0 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ..  if( pPg->nee
1efc0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
1efd0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
1efe0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
1eff0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1f000 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
1f010 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
1f020 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f030 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
1f040 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
1f050 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
1f060 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e  sh-chain */.  un
1f070 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1f080 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f  ager, pPg);..  /
1f090 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
1f0a0 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
1f0b0 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
1f0c0 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
1f0d0 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68    ** from it's h
1f0e0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
1f0f0 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
1f100 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
1f110 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
1f120 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
1f130 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
1f140 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
1f150 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
1f160 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
1f170 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
1f180 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
1f190 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1f1a0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
1f1b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1f1c0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
1f1d0 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
1f1e0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
1f1f0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
1f200 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
1f210 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e     if( pPgOld->n
1f220 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1f230 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
1f240 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
1f250 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1f260 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  al = 1;.      pP
1f270 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  g->needSync = 1;
1f280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f290 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1f2a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f2b0 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
1f2c0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
1f2d0 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
1f2e0 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
1f2f0 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73  h-chain. */.  as
1f300 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1f310 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70  .  pPg->pgno = p
1f320 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20  gno;.  h = pgno 
1f330 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
1f340 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  -1);.  if( pPage
1f350 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
1f360 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f370 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1f380 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1f390 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1f3a0 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
1f3b0 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
1f3c0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
1f3d0 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
1f3e0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1f3f0 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
1f400 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
1f410 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
1f420 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1f430 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
1f440 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
1f450 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
1f460 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
1f470 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
1f480 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
1f490 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1f4a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
1f4b0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
1f4c0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
1f4d0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
1f4e0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
1f4f0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
1f500 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
1f510 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
1f520 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
1f530 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
1f540 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
1f550 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
1f560 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
1f570 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
1f580 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1f590 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
1f5a0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
1f5b0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
1f5c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1f5d0 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
1f5e0 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  get() call may c
1f5f0 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
1f600 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
1f610 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
1f620 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1f630 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
1f640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1f650 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70   rc;.    void *p
1f660 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61 73  NeedSync;.    as
1f670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1f680 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
1f690 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1f6a0 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  get(pPager, need
1f6b0 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64  SyncPgno, &pNeed
1f6c0 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 72  Sync);.    if( r
1f6d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f6e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
1f6f0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
1f700 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1f710 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1f720 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1f730 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1f740 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e  R(pNeedSync)->in
1f750 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1f760 20 6d 61 6b 65 44 69 72 74 79 28 44 41 54 41 5f   makeDirty(DATA_
1f770 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1f780 6e 63 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nc));.    sqlite
1f790 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e 65  3pager_unref(pNe
1f7a0 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20  edSync);.  }..  
1f7b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f7c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1f7d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1f7e0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1f7f0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
1f800 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1f810 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1f820 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
1f830 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
1f840 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
1f850 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
1f860 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
1f870 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
1f880 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
1f890 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
1f8a0 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
1f8b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
1f8c0 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
1f8d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1f8e0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
1f8f0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
1f900 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1f910 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1f920 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
1f930 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
1f940 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
1f950 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
1f960 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f970 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  3pager_refdump(P
1f980 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f990 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
1f9a0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1f9b0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1f9c0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1f9d0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
1f9e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1f9f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1fa00 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
1fa10 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
1fa20 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
1fa30 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
1fa40 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1fa50 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
1fa60 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
1fa70 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1fa80 4f 20 2a 2f 0a                                   O */.