/ Hex Artifact Content
Login

Artifact d9b188cbe6bc502c328115181ae9426256c49058:


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 39  : pager.c,v 1.29
0350: 38 20 32 30 30 37 2f 30 33 2f 32 36 20 31 33 3a  8 2007/03/26 13:
0360: 34 38 3a 31 33 20 64 72 68 20 45 78 70 20 24 0a  48:13 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 50 61 67 65  a.** sqlite3Page
0dd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0de0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0df0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0e00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0e10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0e20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0e30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0e40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0e50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0e70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0e80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0e90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0ea0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0eb0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ec0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0ed0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0ee0: 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65  that sqlite_page
0ef0: 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  _write() can onl
0f00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0f10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0f20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0f30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0f40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0f50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0f60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0f70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0f80: 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61  VED.).** The tra
0f90: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0fa0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0fb0: 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e  s when before an
0fc0: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
0fd0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
0fe0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74  abase file.  Aft
0ff0: 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  er an sqlite3Pag
1000: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  erRollback().** 
1010: 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f  or sqlite_pager_
1020: 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74  commit(), the st
1030: 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f  ate goes back to
1040: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
1050: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1060: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
1070: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52  efine PAGER_SHAR
1080: 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73  ED      1   /* s
1090: 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f  ame as SHARED_LO
10a0: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
10b0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20  GER_RESERVED    
10c0: 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52  2   /* same as R
10d0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a  ESERVED_LOCK */.
10e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58  #define PAGER_EX
10f0: 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a  CLUSIVE   4   /*
1100: 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49   same as EXCLUSI
1110: 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  VE_LOCK */.#defi
1120: 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  ne PAGER_SYNCED 
1130: 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66       5../*.** If
1140: 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1150: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d  _RESERVED_LOCK m
1160: 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  acro is set to t
1170: 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  rue at compile-t
1180: 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69  ime,.** then fai
1190: 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20  led attempts to 
11a0: 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  get a reserved l
11b0: 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  ock will invoke 
11c0: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
11d0: 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66  k..** This is of
11e0: 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54  f by default.  T
11f0: 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69  o see why, consi
1200: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1210: 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a  g scenario:.** .
1220: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65 61  ** Suppose threa
1230: 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  d A already has 
1240: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
1250: 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72 76  d wants a reserv
1260: 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65  ed lock..** Thre
1270: 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61 73  ad B already has
1280: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1290: 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78   and wants an ex
12a0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
12b0: 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64  f.** both thread
12c0: 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 69  s are using thei
12d0: 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73  r busy callbacks
12e0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  , it might be a 
12f0: 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20  long time.** be 
1300: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  for one of the t
1310: 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20 61  hreads give up a
1320: 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74  nd allows the ot
1330: 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a  her to proceed..
1340: 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 68  ** But if the th
1350: 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67  read trying to g
1360: 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64 20  et the reserved 
1370: 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71 75  lock gives up qu
1380: 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20  ickly.** (if it 
1390: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74  never invokes it
13a0: 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29  s busy callback)
13b0: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
13c0: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
13d0: 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79  resolved quickly
13e0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13f0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
1400: 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  D_LOCK.# define 
1410: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1420: 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64  RVED_LOCK 0.#end
1430: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  if../*.** This m
1440: 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75  acro rounds valu
1450: 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69 66  es up so that if
1460: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
1470: 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69   address it.** i
1480: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1490: 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74 68  be an address th
14a0: 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f  at is aligned to
14b0: 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
14c0: 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ary..*/.#define 
14d0: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
14e0: 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37  X)   (((X)+7)&~7
14f0: 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  )../*.** Each in
1500: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
1510: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
1520: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1530: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
1540: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1550: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1560: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1570: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1580: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1590: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
15a0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
15b0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
15c0: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
15d0: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
15e0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15f0: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
1600: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1610: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1620: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1630: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1640: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1650: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1660: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1670: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1680: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1690: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
16a0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
16b0: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
16c0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
16d0: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
16e0: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
16f0: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
1700: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
1710: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
1720: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
1730: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
1740: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
1750: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1760: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1770: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1780: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1790: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
17a0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
17b0: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
17c0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
17d0: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
17e0: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
17f0: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
1800: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61  t when sqlite3Pa
1810: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1820: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
1830: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
1840: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
1850: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1860: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1870: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1880: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
1890: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
18a0: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
18b0: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
18c0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
18e0: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
18f0: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
1900: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
1930: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
1940: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1950: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
1960: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
1970: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
1980: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
1990: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
19a0: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
19b0: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
19c0: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
19d0: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
19e0: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
19f0: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
1a00: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
1a10: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53  .  PgHdr *pNextS
1a20: 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b  tmt, *pPrevStmt;
1a30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
1a40: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
1a50: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ent journal */. 
1a60: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
1a90: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
1aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1ab0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
1ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1ad0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
1ae0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1af0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1b20: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1b30: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1b40: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1b70: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1b80: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1b90: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1ba0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1bb0: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1bc0: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1bd0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68  his page */.  sh
1be0: 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ort int nRef;   
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c00: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20  Number of users 
1c10: 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  of this page */.
1c20: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c    PgHdr *pDirty,
1c30: 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20   *pPrevDirty;   
1c40: 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20   /* Dirty pages 
1c50: 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64  */.  u32 notUsed
1c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c70: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70      /* Buffer sp
1c80: 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ace */.#ifdef SQ
1c90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1ca0: 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b  .  u32 pageHash;
1cb0: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61  .#endif.  /* pPa
1cc0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1cd0: 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61  tes of page data
1ce0: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61   follow this hea
1cf0: 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65  der */.  /* Page
1d00: 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
1d10: 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c  f local data fol
1d20: 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74  low the page dat
1d30: 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  a */.};../*.** F
1d40: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
1d50: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73  only database, s
1d60: 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  ome extra inform
1d70: 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65  ation is recorde
1d80: 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20  d about.** each 
1d90: 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61  page so that cha
1da0: 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c  nges can be roll
1db0: 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e  ed back.  (Journ
1dc0: 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74  al files are not
1dd0: 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d  .** used for in-
1de0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1df0: 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .)  The followin
1e00: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  g information is
1e10: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65   added to.** the
1e20: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58   end of every EX
1e30: 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e  TRA block for in
1e40: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
1e60: 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20  formation could 
1e70: 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
1e80: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1e90: 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e  PgHdr structure.
1ea0: 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20  .** But then it 
1eb0: 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e  would take up an
1ec0: 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f   extra 8 bytes o
1ed0: 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65  f storage on eve
1ee0: 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e  ry PgHdr.** even
1ef0: 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20   for disk-based 
1f00: 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69  databases.  Spli
1f10: 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76  tting it out sav
1f20: 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69  es 8 bytes.  Thi
1f30: 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73  s.** is only a s
1f40: 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62  avings of 0.8% b
1f50: 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74  ut those percent
1f60: 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a  ages add up..*/.
1f70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
1f80: 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f  gHistory PgHisto
1f90: 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73  ry;.struct PgHis
1fa0: 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72  tory {.  u8 *pOr
1fb0: 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  ig;     /* Origi
1fc0: 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20  nal page text.  
1fd0: 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20  Restore to this 
1fe0: 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61  on a full rollba
1ff0: 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d  ck */.  u8 *pStm
2000: 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61  t;     /* Text a
2010: 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20  s it was at the 
2020: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2030: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
2040: 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  nt */.};../*.** 
2050: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
2060: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
2070: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
2080: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
2090: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
20a0: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
20b0: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
20c0: 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78  Codec!=0 ){ P->x
20d0: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
20e0: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64  rg,D,N,X); }.# d
20f0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2100: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50  ,N,X) ((char*)(P
2110: 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78  ->xCodec!=0?P->x
2120: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2130: 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65  rg,D,N,X):D)).#e
2140: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  lse.# define COD
2150: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20  EC1(P,D,N,X) /* 
2160: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
2170: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
2180: 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e  ) ((char*)D).#en
2190: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
21a0: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
21b0: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
21c0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
21d0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
21e0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
21f0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2200: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2210: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2220: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
2230: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
2240: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
2250: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
2260: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
2270: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
2280: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
2290: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
22a0: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
22b0: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
22c0: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
22d0: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
22e0: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
22f0: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2300: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
2310: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
2320: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2330: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2340: 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64  .** Pager.errCod
2350: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2360: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2370: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 53 51  LITE_CORRUPT, SQ
2380: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 2a 2a  LITE_PROTOCOL.**
2390: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
23a0: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
23b0: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
23c0: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
23d0: 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69  ersists.** and i
23e0: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
23f0: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
2400: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
2410: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
2420: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75  SQLITE_FULL retu
2430: 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68  rn code is sligh
2440: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49  tly different. I
2450: 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20  t persists only 
2460: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78  until the.** nex
2470: 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c  t successful rol
2480: 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d  lback is perform
2490: 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ed on the pager 
24a0: 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20  cache. Also,.** 
24b0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
24c0: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
24d0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
24e0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
24f0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  erLookup().** AP
2500: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
2510: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
2520: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75  ssfully..*/.stru
2530: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20  ct Pager {.  u8 
2540: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20  journalOpen;    
2550: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2560: 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
2570: 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20   descriptors is 
2580: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f  valid */.  u8 jo
2590: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
25a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25b0: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
25c0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
25d0: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
25e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
25f0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
2600: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
2610: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
2620: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
2630: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2640: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
2650: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
2660: 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20   u8 stmtOpen;   
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2680: 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74  True if the stat
2690: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
26a0: 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38   is open */.  u8
26b0: 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20   stmtInUse;     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26d0: 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  e we are in a st
26e0: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
26f0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73  action */.  u8 s
2700: 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20  tmtAutoopen;    
2710: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2720: 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65  stmt journal whe
2730: 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  n main journal i
2740: 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20  s opened*/.  u8 
2750: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
2760: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2770: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
2780: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
2790: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b0: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
27c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
27d0: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
27e0: 20 20 75 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b    u8 full_fsync;
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2800: 20 55 73 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   Use F_FULLFSYNC
2810: 20 77 68 65 6e 20 61 76 61 69 6c 61 62 6c 65 20   when available 
2820: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
2850: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
2860: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
2870: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
2880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2890: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
28a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
28b0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
28e0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
28f0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
2920: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
2930: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
2940: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
2950: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2960: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
2970: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
2980: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
2990: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
29a0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
29b0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
29c0: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a   for all pages *
29d0: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
2a00: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
2a10: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
2a20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2a30: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
2a40: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
2a50: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
2a60: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65  */.  int errCode
2a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a80: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2a90: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2aa0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69  rs */.  int dbSi
2ab0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2ac0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ad0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
2ae0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67  le */.  int orig
2af0: 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  DbSize;         
2b00: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
2b10: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2b20: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74   change */.  int
2b30: 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20   stmtSize;      
2b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b50: 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e   of database (in
2b60: 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f   pages) at stmt_
2b70: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
2b80: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
2b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ba0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2bb0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2bc0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
2bd0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
2be0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
2bf0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
2c00: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
2c10: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
2c20: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2c30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c40: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
2c50: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2c60: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2c80: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
2c90: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
2ca0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2cb0: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
2cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cd0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2ce0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
2cf0: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2d10: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
2d20: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
2d30: 20 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20   int nMaxPage;  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d50: 48 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20  High water mark 
2d60: 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e  of nPage */.  in
2d70: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d90: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2da0: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2db0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2dc0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2de0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
2df0: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
2e00: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61  cache */.  u8 *a
2e10: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
2e20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
2e30: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
2e40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2e50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
2e60: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
2e70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2e80: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2e90: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
2ea0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
2eb0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2ec0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2ed0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2ee0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f00: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2f10: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2f20: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
2f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2f40: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
2f50: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2f60: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46  l files */.  OsF
2f70: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2f90: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
2fa0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2fb0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
2fc0: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
2fd0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2fe0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2ff0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
3000: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
3010: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
3020: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
3030: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
3040: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48  Handler */.  PgH
3050: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
3060: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
3070: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
3080: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
3090: 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  tSynced;        
30a0: 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61  /* First free pa
30b0: 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  ge with PgHdr.ne
30c0: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50  edSync==0 */.  P
30d0: 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20  gHdr *pAll;     
30e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
30f0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
3100: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d  */.  PgHdr *pStm
3110: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3120: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
3130: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
3140: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
3150: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
3160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3170: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69  * List of all di
3180: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  rty pages */.  i
3190: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
31b0: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
31c0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
31d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
31e0: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
31f0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
3200: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
3210: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
3220: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
3230: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
3240: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
3250: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
3260: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
3270: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
3280: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
3290: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
32a0: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
32b0: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  i
32c0: 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20  64 stmtJSize;   
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
32e0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
32f0: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
3300: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
3310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
3320: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
3330: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
3340: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
3350: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3360: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
3370: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
3380: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
3390: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
33a0: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ows */.  int nRe
33b0: 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20  ad,nWrite;      
33c0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
33d0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
33e0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
33f0: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
3400: 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  or)(DbPage*,int)
3410: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
3420: 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65  outine when free
3430: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
3440: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
3450: 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20  (DbPage*,int);  
3460: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
3470: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
3480: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
3490: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
34a0: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
34b0: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
34c0: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
34d0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
34e0: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3500: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
3510: 64 65 63 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  dec() */.  int n
3520: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
3530: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
3540: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
3550: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64   table */.  PgHd
3560: 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20  r **aHash;      
3570: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
3580: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
3590: 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64  e number to PgHd
35a0: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
35b0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
35c0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
35d0: 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ger *pNext;     
35e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
35f0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
3600: 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61  rs in this threa
3610: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  d */.#endif.  ch
3620: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
3630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3640: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
3650: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
3660: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 75 33 32 20  mp use */.  u32 
3670: 69 43 68 61 6e 67 65 43 6f 75 6e 74 3b 20 20 20  iChangeCount;   
3680: 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 63 68          /* Db ch
3690: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 6f 72  ange-counter for
36a0: 20 77 68 69 63 68 20 63 61 63 68 65 20 69 73 20   which cache is 
36b0: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 64 6f  valid */.  u8 do
36c0: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
36d0: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
36e0: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
36f0: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
3700: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78  cache */.  u8 ex
3710: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
3720: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3730: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
3740: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
3750: 56 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67  VE */.  u8 chang
3760: 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20  eCountDone;     
3770: 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72      /* Set after
3780: 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
3790: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
37a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66   */.};../*.** If
37b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
37c0: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 69 6e 63  defined then inc
37d0: 72 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 61  rement the varia
37e0: 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a 2a 20  ble given in.** 
37f0: 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  the argument.*/.
3800: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3810: 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54  ST.# define TEST
3820: 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a 23 65  _INCR(x)  x++.#e
3830: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 45 53  lse.# define TES
3840: 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64 69 66  T_INCR(x).#endif
3850: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
3860: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
3870: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3880: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
3890: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
38a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
38b0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
38c0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
38d0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
38e0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
38f0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
3900: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
3910: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
3920: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
3930: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
3940: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
3950: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
3960: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
3970: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
3980: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
3990: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
39a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
39b0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
39c0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
39d0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
39e0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
39f0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
3a00: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
3a10: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
3a20: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
3a30: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
3a40: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
3a50: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
3a60: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
3a70: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
3a80: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
3a90: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
3aa0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
3ab0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
3ac0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
3ad0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
3ae0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
3af0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
3b00: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
3b10: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
3b20: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
3b30: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
3b40: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
3b50: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
3b60: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
3b70: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
3b80: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3b90: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
3ba0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
3bb0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
3bc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
3bd0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
3be0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
3bf0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
3c00: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
3c10: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
3c20: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
3c30: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
3c40: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
3c50: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
3c60: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
3c70: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3c80: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
3c90: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
3ca0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
3cb0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
3cc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
3cd0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
3ce0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
3cf0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
3d00: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
3d10: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
3d20: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
3d30: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
3d40: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
3d50: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
3d60: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
3d70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3d80: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
3d90: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
3da0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
3db0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
3dc0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
3dd0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
3de0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
3df0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3e00: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
3e10: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
3e20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
3e30: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
3e40: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
3e50: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
3e60: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
3e70: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
3e80: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
3e90: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
3ea0: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
3eb0: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
3ec0: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
3ed0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
3ee0: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
3ef0: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
3f00: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
3f10: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
3f20: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
3f30: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
3f40: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
3f50: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
3f60: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
3f70: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
3f80: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
3f90: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
3fa0: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
3fb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
3fc0: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
3fd0: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
3fe0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
3ff0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
4000: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
4010: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
4020: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
4030: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
4040: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
4050: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
4060: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
4070: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
4080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
4090: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
40a0: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
40b0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
40c0: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
40d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  if../*.** Page n
40e0: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
40f0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
4100: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
4110: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
4120: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
4130: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
4140: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
4150: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
4160: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
4170: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
4180: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
4190: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
41a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
41b0: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
41c0: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
41d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
41e0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
41f0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
4200: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
4210: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
4220: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
4230: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
4240: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
4250: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
4260: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
4270: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
4280: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
4290: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
42a0: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
42b0: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
42c0: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
42d0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
42e0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
42f0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
4300: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
4310: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
4320: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
4330: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
4340: 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e  ng (for debuggin
4350: 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64  g) here:.*/.#ifd
4360: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4370: 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69   int pager3_refi
4380: 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a  nfo_enable = 0;.
4390: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
43a0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64  ger_refinfo(PgHd
43b0: 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69  r *p){.    stati
43c0: 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20  c int cnt = 0;. 
43d0: 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72     if( !pager3_r
43e0: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
43f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
4400: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
4410: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
4420: 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %4d addr=%p nRef
4430: 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e  =%-3d total=%d\n
4440: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
4450: 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
4460: 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d  (p), p->nRef, p-
4470: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20  >pPager->nRef.  
4480: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
4490: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
44a0: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
44b0: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
44c0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
44d0: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
44e0: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
44f0: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
4500: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4510: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ge the size of t
4520: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
4530: 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73  ble to N.  N mus
4540: 74 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t be a power.** 
4550: 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69  of two..*/.stati
4560: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
4570: 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50  ize_hash_table(P
4580: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
4590: 74 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a  t N){.  PgHdr **
45a0: 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61  aHash, *pPg;.  a
45b0: 73 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e  ssert( N>0 && (N
45c0: 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  &(N-1))==0 );.  
45d0: 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61  aHash = sqliteMa
45e0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61  lloc( sizeof(aHa
45f0: 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66  sh[0])*N );.  if
4600: 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ( aHash==0 ){.  
4610: 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
4620: 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e  rehash is not an
4630: 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f   error.  It is o
4640: 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  nly a performanc
4650: 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65  e hit. */.    re
4660: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
4670: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
4680: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
4690: 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50  >nHash = N;.  pP
46a0: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48  ager->aHash = aH
46b0: 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ash;.  for(pPg=p
46c0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
46d0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
46e0: 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b  All){.    int h;
46f0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
4700: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  no==0 ){.      a
4710: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
4720: 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
4730: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
4740: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
4750: 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70  .    }.    h = p
4760: 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29  Pg->pgno & (N-1)
4770: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
4780: 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b  Hash = aHash[h];
4790: 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68  .    if( aHash[h
47a0: 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68  ] ){.      aHash
47b0: 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
47c0: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
47d0: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
47e0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
47f0: 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  sh = 0;.  }.}../
4800: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
4810: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
4820: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4830: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
4840: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
4850: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
4860: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
4870: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
4880: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
4890: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
48a0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
48b0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
48c0: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
48d0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
48e0: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
48f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
4900: 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20  ad32bits(OsFile 
4910: 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  *fd, u32 *pRes){
4920: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4930: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
4940: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4950: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
4960: 61 63 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ac));.  if( rc==
4970: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4980: 20 2a 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c   *pRes = (ac[0]<
4990: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
49a0: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
49b0: 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72  | ac[3];.  }.  r
49c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
49d0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
49e0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
49f0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
4a00: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
4a10: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
4a20: 69 63 20 76 6f 69 64 20 70 75 74 33 32 62 69 74  ic void put32bit
4a30: 73 28 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20  s(char *ac, u32 
4a40: 76 61 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20  val){.  ac[0] = 
4a50: 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66  (val>>24) & 0xff
4a60: 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c  ;.  ac[1] = (val
4a70: 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20  >>16) & 0xff;.  
4a80: 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29  ac[2] = (val>>8)
4a90: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d   & 0xff;.  ac[3]
4aa0: 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d   = val & 0xff;.}
4ab0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4ac0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4ad0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4ae0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4af0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4b00: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4b10: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4b20: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4b30: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4b40: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4b50: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4b60: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
4b70: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
4b80: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
4b90: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
4ba0: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
4bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
4bc0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4bd0: 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65  at offset 'offse
4be0: 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  t' from the page
4bf0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
4c00: 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70  * page header 'p
4c10: 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  '..*/.static u32
4c20: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
4c30: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
4c40: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
4c50: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
4c60: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
4c70: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
4c80: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
4c90: 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c    return (ac[0]<
4ca0: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
4cb0: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
4cc0: 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a  | ac[3];.}.../*.
4cd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4ce0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
4cf0: 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  d when an error 
4d00: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
4d10: 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e  e pager.** code.
4d20: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
4d30: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
4d40: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
4d50: 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20  ructure, the.** 
4d60: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
4d70: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
4d80: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
4d90: 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
4da0: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75  on. .** The valu
4db0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
4dc0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
4dd0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
4de0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
4df0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
4e00: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
4e10: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
4e20: 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53  ITE_CORRUPT or S
4e30: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c 0a  QLITE_PROTOCOL,.
4e40: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
4e50: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
4e60: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
4e70: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
4e80: 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20  s Pager.** will 
4e90: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
4ea0: 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
4eb0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
4ec0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
4ed0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
4ee0: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
4ef0: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
4f00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4f10: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4f20: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
4f30: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4f40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 0a  TE_OK );.  if( .
4f50: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4f60: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
4f70: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
4f80: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
4f90: 5f 43 4f 52 52 55 50 54 20 7c 7c 0a 20 20 20 20  _CORRUPT ||.    
4fa0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 50 52 4f 54  rc2==SQLITE_PROT
4fb0: 4f 43 4f 4c 0a 20 20 29 7b 0a 20 20 20 20 70 50  OCOL.  ){.    pP
4fc0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
4fd0: 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
4fe0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
4ff0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5000: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
5010: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
5020: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
5030: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
5040: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
5050: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
5060: 67 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20  ge){.  u32 hash 
5070: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
5080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
5090: 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  Data = (unsigned
50a0: 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f   char *)PGHDR_TO
50b0: 5f 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20  _DATA(pPage);.  
50c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
50d0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
50e0: 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  ze; i++){.    ha
50f0: 73 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44  sh = (hash+i)^pD
5100: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
5110: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a  turn hash;.}../*
5120: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
5130: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
5140: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
5150: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
5160: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
5170: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
5180: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
5190: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
51a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
51b0: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
51c0: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
51d0: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
51e0: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
51f0: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
5200: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
5210: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
5220: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
5230: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
5240: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
5250: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
5260: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
5270: 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73  t( !pPg->pageHas
5280: 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  h || pPager->err
5290: 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  Code || MEMDB ||
52a0: 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a   pPg->dirty || .
52b0: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
52c0: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
52d0: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
52e0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45  else.#define CHE
52f0: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
5300: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
5310: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
5320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
5330: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
5340: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
5350: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
5360: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
5370: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e  read from the en
5380: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
5390: 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  d .** written in
53a0: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
53b0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
53c0: 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65  lloc(). *pzMaste
53d0: 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70  r is.** set to p
53e0: 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f  oint at the memo
53f0: 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
5400: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
5410: 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71  aller must.** sq
5420: 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61  liteFree() *pzMa
5430: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ster..**.** If n
5440: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
5450: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
5460: 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20  esent *pzMaster 
5470: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
5480: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
5490: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
54a0: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
54b0: 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70  ournal(OsFile *p
54c0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d  Jrnl, char **pzM
54d0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
54e0: 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69  ;.  u32 len;.  i
54f0: 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b  64 szJ;.  u32 ck
5500: 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sum;.  int i;.  
5510: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
5520: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
5530: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
5540: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
5550: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
5560: 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0;..  rc = sqlit
5570: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
5580: 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  nl, &szJ);.  if(
5590: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
55a0: 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72  | szJ<16 ) retur
55b0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
55c0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
55d0: 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66  l, szJ-16);.  if
55e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
55f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20  ) return rc;. . 
5600: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5610: 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20  (pJrnl, &len);. 
5620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5630: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5640: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5650: 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d  ts(pJrnl, &cksum
5660: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5670: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5680: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
5690: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
56a0: 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69   aMagic, 8);.  i
56b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
56c0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
56d0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
56e0: 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63  , 8) ) return rc
56f0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5700: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
5710: 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66  zJ-16-len);.  if
5720: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5730: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5740: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61  *pzMaster = (cha
5750: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
5760: 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21  (len+1);.  if( !
5770: 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  *pzMaster ){.   
5780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5790: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
57a0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
57b0: 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c  Jrnl, *pzMaster,
57c0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
57d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
57e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
57f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a  Master);.    *pz
5800: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
5810: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
5820: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
5830: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
5840: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5850: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
5860: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
5870: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
5880: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b   (*pzMaster)[i];
5890: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
58a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
58b0: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
58c0: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
58d0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
58e0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
58f0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
5900: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
5910: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
5920: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
5930: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
5940: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
5950: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
5960: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
5970: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
5980: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
5990: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
59a0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
59b0: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
59c0: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
59d0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
59e0: 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65    (*pzMaster)[le
59f0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  n] = '\0';.  }. 
5a00: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
5a10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5a20: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
5a30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5a40: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
5a50: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
5a60: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
5a70: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
5a80: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
5a90: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
5aa0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
5ab0: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
5ac0: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
5ad0: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
5ae0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
5af0: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
5b10: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
5bd0: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f  tatic int seekJo
5be0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
5bf0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
5c00: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
5c10: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
5c20: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
5c30: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
5c40: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
5c50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
5c60: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
5c70: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
5c80: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
5c90: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
5ca0: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
5cb0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
5cc0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
5cd0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
5ce0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5cf0: 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r) );.  pPager->
5d00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66  journalOff = off
5d10: 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  set;.  return sq
5d20: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
5d30: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5d40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a  >journalOff);.}.
5d50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5d60: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
5d70: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
5d80: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5d90: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
5da0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
5db0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
5dc0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
5dd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
5de0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5df0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
5e00: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
5e10: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5e20: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
5e30: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
5e40: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
5e50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
5e60: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
5e70: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
5e80: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
5e90: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
5ea0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
5eb0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
5ec0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
5ed0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
5ee0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
5ef0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
5f00: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5f10: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
5f20: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
5f30: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
5f40: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
5f50: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
5f60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
5f70: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
5f80: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
5f90: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
5fa0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5fb0: 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48  ager){.  char zH
5fc0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
5fd0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b  urnalMagic)+16];
5fe0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
5ff0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
6000: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
6010: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
6020: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
6030: 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72  nalOff;.  }..  r
6040: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
6050: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
6060: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6070: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
6080: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
6090: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
60a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
60b0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
60c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
60d0: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a   /* FIX ME: .  *
60e0: 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  *.  ** Possibly 
60f0: 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20  for a pager not 
6100: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
6110: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67   the journal mag
6120: 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20  ic should not.  
6130: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e  ** be written un
6140: 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c  til nRec is fill
6150: 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66  ed in as part of
6160: 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61   next syncJourna
6170: 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l(). .  **.  ** 
6180: 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74  Actually maybe t
6190: 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
61a0: 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62   header should b
61b0: 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  e delayed until 
61c0: 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e  that.  ** point.
61d0: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
61e0: 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  s..  */.  memcpy
61f0: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
6200: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6210: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
6220: 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46  .  /* The nRec F
6230: 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46  ield. 0xFFFFFFFF
6240: 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75   for no-sync jou
6250: 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33  rnals. */.  put3
6260: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6270: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6280: 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
6290: 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66  oSync ? 0xffffff
62a0: 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68  ff : 0);.  /* Th
62b0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
62c0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
62d0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e  */ .  sqlite3Ran
62e0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
62f0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6300: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
6310: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
6320: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6330: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6340: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
6350: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
6360: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
6370: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
6380: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6390: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
63a0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
63b0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
63c0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
63d0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
63e0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
63f0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6400: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6410: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
6420: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
6430: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  );.  IOTRACE(("J
6440: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
6450: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
6460: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73  r->journalHdr, s
6470: 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29  izeof(zHeader)))
6480: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6490: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
64a0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
64b0: 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a  eof(zHeader));..
64c0: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
64d0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
64e0: 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73   written success
64f0: 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20  fully. Seek the 
6500: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
6510: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
6520: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
6530: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
6540: 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ctor..  */.  if(
6550: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6560: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
6570: 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22  JTAIL %p %lld\n"
6580: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
6590: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29  ->journalOff-1))
65a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
65b0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
65c0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
65d0: 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20  rnalOff-1);.    
65e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
65f0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
6600: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
6610: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
6620: 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  0", 1);.    }.  
6630: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6640: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6650: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6660: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6670: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6680: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
6690: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
66a0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
66b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
66c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
66d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
66e0: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
66f0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
6700: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
6710: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
6720: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
6730: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
6740: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
6750: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
6760: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
6770: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
6780: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6790: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
67a0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
67b0: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
67c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
67d0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
67e0: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
67f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
6800: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
6810: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
6820: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
6830: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
6840: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
6850: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
6860: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6870: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
6880: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
6890: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
68a0: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
68b0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
68c0: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
68d0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
68e0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
68f0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
6900: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6910: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
6920: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6930: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
6940: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6950: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6960: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
6970: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
6980: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
6990: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
69a0: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
69b0: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
69c0: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
69d0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
69e0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
69f0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6a00: 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73  der */..  rc = s
6a10: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6a20: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6a30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6a40: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6a50: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
6a60: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
6a70: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
6a80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6a90: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
6aa0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
6ab0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
6ac0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6ad0: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20  gic));.  if( rc 
6ae0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6af0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
6b00: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6b10: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
6b20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
6b30: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
6b40: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
6b50: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
6b60: 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66  fd, pNRec);.  if
6b70: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6b80: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
6b90: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6ba0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6bb0: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
6bc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6bd0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6be0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62  pPager->jfd, pDb
6bf0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
6c00: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6c10: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
6c20: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
6c30: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
6c40: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
6c50: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
6c60: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
6c70: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
6c80: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
6c90: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
6ca0: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
6cb0: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
6cc0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
6cd0: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
6ce0: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
6cf0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
6d00: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
6d10: 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e  e.  ** of Pager.
6d20: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
6d30: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
6d40: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
6d50: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  e..  */.  rc = r
6d60: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6d70: 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70  ->jfd, (u32 *)&p
6d80: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
6d90: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
6da0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
6db0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6dc0: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
6dd0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  Z(pPager);.  rc 
6de0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
6df0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6e00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
6e10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6e20: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
6e30: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
6e40: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
6e50: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
6e60: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
6e70: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
6e80: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
6e90: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
6ea0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
6eb0: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
6ec0: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
6ed0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
6ee0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
6ef0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
6f00: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
6f10: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
6f20: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
6f30: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
6f40: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
6f50: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
6f60: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
6f70: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20  mat is:.**.** + 
6f80: 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
6f90: 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62  J_PGNO..** + N b
6fa0: 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20  ytes: length of 
6fb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6fc0: 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  ame..** + 4 byte
6fd0: 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  s: N.** + 4 byte
6fe0: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
6ff0: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
7000: 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61  .** + 8 bytes: a
7010: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
7020: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
7030: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
7040: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
7050: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
7060: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
7070: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7080: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
7090: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
70a0: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
70b0: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
70c0: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
70d0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
70e0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
70f0: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
7100: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
7110: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
7120: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
7130: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e  nt rc;.  int len
7140: 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75  ; .  int i; .  u
7150: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
7160: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
7170: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7180: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
7190: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
71a0: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
71b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
71c0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
71d0: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
71e0: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
71f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
7200: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
7210: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
7220: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
7230: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
7240: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
7250: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
7260: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
7270: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
7280: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
7290: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
72a0: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
72b0: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
72c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
72d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
72e0: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
72f0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
7300: 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  c ){.    rc = se
7310: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
7320: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
7330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7340: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
7350: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7360: 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a  f += (len+20);..
7370: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
7380: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7390: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
73a0: 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63  ager));.  if( rc
73b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
73c0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
73d0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
73e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
73f0: 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  ster, len);.  if
7400: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7410: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
7420: 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20  put32bits(zBuf, 
7430: 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74  len);.  put32bit
7440: 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75  s(&zBuf[4], cksu
7450: 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42  m);.  memcpy(&zB
7460: 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d  uf[8], aJournalM
7470: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
7480: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
7490: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
74a0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
74b0: 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28   zBuf, 8+sizeof(
74c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
74d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
74e0: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
74f0: 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20  oSync;.  return 
7500: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
7510: 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67   or remove a pag
7520: 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
7530: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61  of all pages tha
7540: 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20  t are in the.** 
7550: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
7560: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67  l..**.** The Pag
7570: 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72  er keeps a separ
7580: 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ate list of page
7590: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
75a0: 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ntly in.** the s
75b0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
75c0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68  .  This helps th
75d0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  e sqlite3PagerSt
75e0: 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  mtCommit().** ro
75f0: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
7600: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
7610: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
7620: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
7630: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
7640: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
7650: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
7660: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
7670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7680: 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
7690: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
76a0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
76b0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
76c0: 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d    if( pPg->inStm
76d0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  t ) return;.  as
76e0: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
76f0: 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Stmt==0 && pPg->
7700: 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a  pNextStmt==0 );.
7710: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
7720: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
7730: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
7740: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e   pPager->pStmt->
7750: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
7760: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
7770: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
7780: 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d  pStmt;.  pPager-
7790: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
77a0: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pPg->inStmt = 1;
77b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
77c0: 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
77d0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
77e0: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50  *pPg){.  if( !pP
77f0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
7800: 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  rn;.  if( pPg->p
7810: 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20  PrevStmt ){.    
7820: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72  assert( pPg->pPr
7830: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7840: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
7850: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
7860: 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  extStmt = pPg->p
7870: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  NextStmt;.  }els
7880: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7890: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d  Pg->pPager->pStm
78a0: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
78b0: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  g->pPager->pStmt
78c0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
78d0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
78e0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20  ->pNextStmt ){. 
78f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7900: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
7910: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
7920: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
7930: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
7940: 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d  ->pPrevStmt;.  }
7950: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
7960: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50  t = 0;.  pPg->pP
7970: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  revStmt = 0;.  p
7980: 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
7990: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
79a0: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
79b0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
79c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
79d0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
79e0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
79f0: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7a00: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7a10: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
7a20: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
7a30: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7a40: 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20  PgHdr *p;.  if( 
7a50: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30  pPager->aHash==0
7a60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7a70: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
7a80: 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  [pgno & (pPager-
7a90: 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68  >nHash-1)];.  wh
7aa0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
7ab0: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
7ac0: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
7ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
7af0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7b00: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
7b10: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
7b20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7b30: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
7b40: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
7b50: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
7b60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
7b70: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7b80: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7b90: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
7ba0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
7bb0: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
7bc0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
7bd0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7be0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
7bf0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
7c00: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
7c10: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
7c20: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
7c30: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
7c40: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
7c50: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
7c60: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
7c70: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20  file. This is a 
7c80: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
7c90: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
7ca0: 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72  ntered.** the er
7cb0: 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  ror-state..*/.st
7cc0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
7cd0: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
7ce0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
7cf0: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ( p->errCode ) r
7d00: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
7d10: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
7d20: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
7d30: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
7d40: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65  ;.  if( p->state
7d50: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
7d60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
7d70: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
7d80: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
7d90: 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ock(p);.  assert
7da0: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
7db0: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  !p->journalOpen 
7dc0: 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65  || (p->exclusive
7dd0: 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61  Mode&&!p->journa
7de0: 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  lOff) );.  asser
7df0: 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  t( p->errCode ||
7e00: 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c   !p->stmtOpen ||
7e10: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
7e20: 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  e );.}.../*.** U
7e30: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
7e40: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
7e50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
7e60: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
7e70: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
7e80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
7e90: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
7ea0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
7eb0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
7ec0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
7ed0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
7ee0: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
7ef0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
7f00: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
7f10: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
7f20: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
7f30: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
7f40: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
7f50: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
7f60: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
7f70: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  g, *pNext;.  if(
7f80: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
7f90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7fa0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
7fb0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
7fc0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
7fd0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
7fe0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
7ff0: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
8000: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
8010: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
8020: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
8030: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
8040: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
8050: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
8060: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
8070: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
8080: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
8090: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
80a0: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
80b0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
80c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
80d0: 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ef = 0;.}../*.**
80e0: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
80f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
8100: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
8110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8120: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
8130: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
8140: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
8150: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
8160: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a  tine releases.**
8170: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
8180: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
8190: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
81a0: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
81b0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
81c0: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
81d0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  closed..**.** TO
81e0: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
81f0: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
8200: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
8210: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8220: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
8230: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
8240: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
8250: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
8260: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
8270: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
8280: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
8290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
82a0: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50  er_unwritelock(P
82b0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
82c0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
82d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
82e0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  K;.  assert( !ME
82f0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
8300: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
8310: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
8320: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8330: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
8340: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
8350: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8360: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8370: 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  && !pPager->excl
8380: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8390: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
83a0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
83b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
83c0: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
83d0: 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  d);.      pPager
83e0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
83f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8400: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
8410: 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
8420: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
8430: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8440: 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
8450: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
8460: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8470: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e     sqlite3OsTrun
8480: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
8490: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
84a0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
84b0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
84c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
84d0: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
84e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
84f0: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
8500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8510: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
8520: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
8530: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8540: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  pen = 0;.      s
8550: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8560: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
8570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8580: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
8590: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
85a0: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
85b0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
85c0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
85d0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
85e0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
85f0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
8600: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
8610: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
8620: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
8630: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
8640: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
8650: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
8660: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
8670: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
8680: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
8690: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
86a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
86b0: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
86c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
86d0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
86e0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
86f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
8700: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
8710: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
8720: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8730: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
8740: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   || pPager->useJ
8750: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
8760: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
8770: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
8780: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8790: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
87a0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
87b0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
87c0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
87d0: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
87e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
87f0: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
8800: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8810: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
8820: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
8830: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8840: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
8850: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
8860: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8870: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8880: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8890: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
88a0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
88b0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
88c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
88d0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
88e0: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
88f0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
8900: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
8910: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
8920: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
8930: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
8940: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
8950: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
8960: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8970: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
8980: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
8990: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
89a0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
89b0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
89c0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
89d0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
89e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
89f0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
8a00: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
8a10: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
8a20: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
8a30: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
8a40: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
8a50: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
8a60: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
8a70: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
8a80: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
8a90: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
8aa0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
8ab0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
8ac0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
8ad0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
8ae0: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
8af0: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
8b00: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
8b10: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
8b20: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
8b30: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
8b40: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
8b50: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
8b60: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
8b70: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
8b80: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
8b90: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
8ba0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
8bb0: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
8bc0: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
8bd0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
8be0: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
8bf0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
8c00: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
8c10: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
8c20: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
8c30: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
8c40: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
8c50: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
8c60: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
8c70: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
8c80: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
8c90: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
8ca0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
8cb0: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
8cc0: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
8cd0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
8ce0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
8cf0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
8d00: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
8d10: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
8d20: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
8d30: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
8d40: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
8d50: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
8d60: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
8d70: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
8d80: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
8d90: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
8da0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
8db0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
8dc0: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
8dd0: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
8de0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
8df0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
8e00: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
8e10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
8e20: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
8e30: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
8e40: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
8e50: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
8e60: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
8e70: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
8e80: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
8e90: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
8ea0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8eb0: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
8ec0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
8ed0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
8ee0: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
8ef0: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
8f00: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
8f10: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
8f20: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
8f30: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
8f40: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
8f50: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
8f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8f70: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
8f80: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
8f90: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
8fa0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
8fc0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
8fd0: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
8fe0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
9010: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
9020: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
9030: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
9040: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
9050: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
9060: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
9070: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
9080: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
9090: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
90a0: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
90b0: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
90c0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
90d0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
90e0: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
90f0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9100: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
9110: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
9120: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
9130: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
9140: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
9150: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
9160: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
9170: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
9180: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
9190: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
91a0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
91b0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
91c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
91d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
91e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
91f0: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
9200: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
9210: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
9220: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
9230: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
9240: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
9250: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
9260: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
9270: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
9280: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
9290: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
92a0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
92b0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
92c0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
92d0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
92e0: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
92f0: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
9300: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
9310: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
9320: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
9330: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
9340: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
9350: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
9360: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
9370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9380: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
9390: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
93a0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
93b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
93c0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
93d0: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
93e0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
93f0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
9400: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9410: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
9420: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
9430: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
9440: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
9450: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
9460: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9470: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
9480: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
9490: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
94a0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
94b0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
94c0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
94d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
94e0: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
94f0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
9500: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
9510: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
9520: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
9530: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
9540: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
9550: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9560: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
9570: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
9580: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
9590: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
95a0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
95b0: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
95c0: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
95d0: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
95e0: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
95f0: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
9600: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
9610: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
9620: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
9630: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
9640: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
9650: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9660: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
9670: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
9680: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
9690: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
96a0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
96b0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
96c0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
96d0: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
96e0: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
96f0: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
9700: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
9710: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
9720: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
9730: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9740: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
9750: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
9760: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
9770: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
9780: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
9790: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
97a0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
97b0: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
97c0: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
97d0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
97e0: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
97f0: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9800: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
9810: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
9820: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
9830: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
9840: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
9850: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
9860: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
9870: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
9880: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
9890: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
98a0: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
98b0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
98c0: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
98d0: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
98e0: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
98f0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9900: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9910: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9920: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9930: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9940: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
9950: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
9960: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
9970: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
9980: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
9990: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
99a0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
99b0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
99c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
99d0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
99e0: 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52  | pPg!=0 );.  TR
99f0: 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE3("PLAYBACK %
9a00: 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
9a10: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
9a20: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
9a30: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
9a40: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70  _EXCLUSIVE && (p
9a50: 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65  Pg==0 || pPg->ne
9a60: 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20  edSync==0) ){.  
9a70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9a80: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
9a90: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
9aa0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9ab0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9ac0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9ad0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
9ae0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
9af0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9b00: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
9b10: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a  .    if( pPg ){.
9b20: 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
9b30: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
9b40: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9b50: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
9b60: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
9b70: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
9b80: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
9b90: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
9ba0: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
9bb0: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
9bc0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
9bd0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
9be0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
9bf0: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
9c00: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
9c10: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
9c20: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
9c30: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
9c40: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
9c50: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
9c60: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
9c70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
9c80: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
9c90: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
9ca0: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
9cb0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
9cc0: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
9cd0: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
9ce0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9cf0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
9d00: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
9d10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9d20: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
9d30: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f  Destructor ){  /
9d40: 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f  *** FIX ME:  Sho
9d50: 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69  uld this be xRei
9d60: 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20  nit? ***/.      
9d70: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
9d80: 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
9d90: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9da0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9db0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9dc0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9dd0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9de0: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9df0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
9e00: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
9e10: 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   3);..    /* If 
9e20: 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
9e30: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
9e40: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
9e50: 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f  .iChangeCount */
9e60: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
9e70: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
9e80: 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d  ->iChangeCount =
9e90: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
9ea0: 70 50 67 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a  pPg, 24);.    }.
9eb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9ec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
9ed0: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
9ee0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
9ef0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9f00: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
9f10: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
9f20: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
9f30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9f40: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
9f50: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
9f60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9f70: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
9f80: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
9f90: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9fa0: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
9fb0: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
9fc0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
9fd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9fe0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
9ff0: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
a000: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
a010: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
a020: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
a030: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
a040: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
a050: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
a060: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
a070: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
a080: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
a090: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
a0a0: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
a0b0: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
a0c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
a0d0: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
a0e0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a0f0: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
a100: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
a110: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
a120: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
a130: 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65  .  OsFile *maste
a140: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
a150: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
a160: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
a170: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
a180: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
a190: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
a1a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a1b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a1c0: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
a1d0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
a1e0: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
a1f0: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
a200: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
a210: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
a220: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
a230: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
a240: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
a250: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
a260: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a270: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61  OpenReadOnly(zMa
a280: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a  ster, &master);.
a290: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a2a0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a2b0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
a2c0: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
a2d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
a2e0: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
a2f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a300: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a310: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a320: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
a330: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
a340: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
a350: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
a360: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
a370: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
a380: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
a390: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a3a0: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
a3b0: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
a3c0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a3d0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
a3e0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
a3f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
a400: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
a410: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
a420: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
a430: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
a440: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a450: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a460: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
a470: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a480: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a490: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
a4a0: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
a4b0: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
a4c0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
a4d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
a4e0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a4f0: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
a500: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
a510: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
a520: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
a530: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
a540: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
a550: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
a560: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
a570: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
a580: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
a590: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
a5a0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
a5b0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
a5c0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
a5d0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
a5e0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
a5f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
a600: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
a610: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
a620: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
a630: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
a640: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a650: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
a660: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
a670: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
a680: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
a690: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
a6a0: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
a6b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
a6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a6d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
a6e0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
a6f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
a700: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
a710: 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26  urnal(journal, &
a720: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
a730: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
a740: 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(&journal);. 
a750: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
a760: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a770: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
a780: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
a790: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
a7a0: 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26   zMasterPtr!=0 &
a7b0: 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
a7c0: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
a7d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a7e0: 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29  Free(zMasterPtr)
a7f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
a800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
a810: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
a820: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
a830: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a840: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
a850: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a860: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a870: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a880: 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74   zJournal += (st
a890: 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  rlen(zJournal)+1
a8a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
a8b0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
a8c0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c  e(zMaster);..del
a8d0: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
a8e0: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
a8f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
a900: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
a910: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
a920: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
a930: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a940: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(&master);.  }.
a950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a960: 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  #if 0./*.** Make
a970: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
a980: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
a990: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
a9a0: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
a9b0: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
a9c0: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
a9d0: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
a9e0: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
a9f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
aa00: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
aa10: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
aa20: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
aa30: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
aa40: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
aa50: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
aa60: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
aa70: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
aa80: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
aa90: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
aaa0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
aab0: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
aac0: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
aad0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
aae0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
aaf0: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
ab00: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
ab10: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
ab20: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
ab30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
ab40: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
ab50: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
ab60: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
ab70: 61 72 20 2a 7a 42 75 66 20 3d 20 70 50 61 67 65  ar *zBuf = pPage
ab80: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
ab90: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
aba0: 72 61 67 65 20 66 6f 72 20 6f 6e 65 20 70 61 67  rage for one pag
abb0: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  e */.    if( !pP
abc0: 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69  g->dirty ) conti
abd0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e  nue;.    if( (in
abe0: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
abf0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
ac00: 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
ac10: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
ac20: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
ac30: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
ac40: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a  (pPg->pgno-1));.
ac50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
ac60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ac70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ac80: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
ac90: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
aca0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
acb0: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28   }.      TRACE3(
acc0: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
acd0: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
ace0: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
acf0: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
ad00: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
ad10: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
ad20: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
ad30: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
ad40: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
ad50: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
ad60: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
ad70: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
ad80: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
ad90: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
ada0: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
adb0: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
adc0: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
add0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
ade0: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
adf0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
ae00: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
ae10: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
ae20: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
ae30: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
ae40: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  eSize);.      }e
ae50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
ae60: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
ae70: 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
ae80: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
ae90: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
aea0: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64   }.    pPg->need
aeb0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
aec0: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  g->dirty = 0;.#i
aed0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
aee0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
aef0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
af00: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
af10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50  .#endif.  }.  pP
af20: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
af30: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
af40: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
af50: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
af60: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
af70: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
af80: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
af90: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  ** indicated..*/
afa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
afb0: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
afc0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
afd0: 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
afe0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
aff0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
b000: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b010: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b020: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
b030: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
b040: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
b050: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
b060: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
b070: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
b080: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
b090: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
b0a0: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
b0b0: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
b0c0: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
b0d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
b0e0: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
b0f0: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
b100: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
b110: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
b120: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
b130: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
b140: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b150: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
b160: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
b170: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
b180: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
b190: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
b1a0: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
b1b0: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
b1c0: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
b1d0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
b1e0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b1f0: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
b200: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b210: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b220: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
b230: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
b240: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
b250: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
b260: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
b270: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
b280: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
b290: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
b2a0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
b2b0: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
b2c0: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
b2d0: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
b2e0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b2f0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
b300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
b310: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
b320: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
b330: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
b340: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
b350: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
b360: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
b370: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
b380: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b390: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
b3a0: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
b3b0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
b3c0: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
b3d0: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
b3e0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
b3f0: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
b400: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
b410: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
b420: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
b430: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
b440: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
b450: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
b460: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
b470: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
b480: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
b490: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
b4a0: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
b4b0: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
b4c0: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
b4d0: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
b4e0: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
b4f0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
b500: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
b510: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
b520: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
b530: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
b540: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
b550: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
b560: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
b570: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
b580: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
b590: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
b5a0: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
b5b0: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
b5c0: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
b5d0: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
b5e0: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
b5f0: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
b600: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
b610: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
b620: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
b630: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
b640: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
b650: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
b660: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b670: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
b680: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
b690: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
b6a0: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
b6b0: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
b6c0: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
b6d0: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
b6e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b6f0: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
b700: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
b710: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
b720: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
b730: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
b740: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
b750: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
b760: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
b770: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
b780: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
b790: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
b7a0: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
b7b0: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
b7c0: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
b7d0: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
b7e0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
b7f0: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
b800: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
b810: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
b820: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
b830: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
b840: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
b850: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
b860: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
b870: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
b880: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
b890: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
b8a0: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
b8b0: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
b8c0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
b8d0: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
b8e0: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
b8f0: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
b900: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
b910: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
b920: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
b930: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
b940: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
b950: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
b960: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
b970: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
b980: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
b990: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
b9a0: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
b9b0: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
b9c0: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
b9d0: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
b9e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
b9f0: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
ba00: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
ba10: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
ba20: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
ba30: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
ba40: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
ba50: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
ba60: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
ba70: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
ba80: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
ba90: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
baa0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
bab0: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
bac0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
bad0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
bae0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
baf0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
bb00: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
bb10: 6f 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  ot){.  i64 szJ; 
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
bb40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
bb50: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
bb60: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
bb70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bb80: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
bb90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
bba0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bbb0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bbc0: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
bbd0: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
bbe0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
bbf0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
bc00: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
bc10: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
bc20: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
bc30: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
bc40: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
bc50: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
bc60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
bc70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
bc80: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
bc90: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
bca0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
bcb0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
bcc0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
bcd0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
bce0: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
bcf0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
bd00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
bd10: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
bd20: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
bd30: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
bd40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
bd50: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
bd60: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
bd70: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
bd80: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
bd90: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
bda0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
bdb0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
bdc0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
bdd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
bde0: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
bdf0: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
be00: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
be10: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
be20: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
be30: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
be40: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
be50: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
be60: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
be70: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
be80: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
be90: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
bea0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
beb0: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
bec0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
bed0: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
bee0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
bef0: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
bf00: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
bf10: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
bf20: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
bf30: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
bf40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bf50: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
bf60: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
bf70: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
bf80: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
bf90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bfa0: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
bfb0: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
bfc0: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
bfd0: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
bfe0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
bff0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
c000: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
c010: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
c020: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
c030: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
c040: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
c050: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
c060: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
c070: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
c080: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
c090: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
c0a0: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
c0b0: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
c0c0: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
c0d0: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
c0e0: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
c0f0: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
c100: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
c110: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
c120: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
c130: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
c140: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
c150: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
c160: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
c170: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
c180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c190: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
c1a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
c1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c1c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c1d0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
c1e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c1f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
c200: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
c210: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
c220: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
c230: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
c240: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
c250: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
c260: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
c270: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
c280: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
c290: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
c2a0: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
c2b0: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
c2c0: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
c2d0: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
c2e0: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
c2f0: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
c300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c310: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
c320: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
c330: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
c340: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
c350: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
c360: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
c370: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
c380: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
c390: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
c3a0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
c3b0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
c3c0: 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
c3d0: 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
c3e0: 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
c3f0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
c400: 65 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ess. In this cas
c410: 65 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  e the rest of th
c420: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
c430: 6f 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a  onsists of.    *
c440: 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70  * journalled cop
c450: 69 65 73 20 6f 66 20 70 61 67 65 73 20 74 68 61  ies of pages tha
c460: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61  t need to be rea
c470: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
c480: 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
c490: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
c4a0: 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20   !isHot ){.     
c4b0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
c4c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c4d0: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
c4e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
c4f0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
c500: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
c510: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
c520: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
c530: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
c540: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
c550: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
c560: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
c570: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c580: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
c590: 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20  XCLUSIVE && .   
c5a0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c5b0: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
c5c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c5d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c5e0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c5f0: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
c600: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
c610: 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg );.      rc =
c620: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
c630: 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
c640: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c650: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c660: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
c670: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
c680: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
c690: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
c6a0: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
c6b0: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
c6c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
c6d0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
c6e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c6f0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
c700: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
c710: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
c720: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
c730: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
c740: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
c750: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c770: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c780: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
c790: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
c7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
c7b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c7c0: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
c7d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
c7e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c7f0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c800: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
c810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
c820: 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
c830: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
c840: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
c850: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c860: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
c870: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
c880: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
c890: 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( zMaster ){.  
c8a0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
c8b0: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
c8c0: 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
c8d0: 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
c8e0: 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65  true,.    ** see
c8f0: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
c900: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
c910: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
c920: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c930: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c940: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
c950: 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73  r_delmaster(zMas
c960: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
c970: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c980: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
c990: 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
c9a0: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
c9b0: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
c9c0: 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
c9d0: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
c9e0: 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
c9f0: 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
ca00: 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52   different PAGER
ca10: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a  _SECTOR_SIZE.  *
ca20: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
ca30: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
ca40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
ca50: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
ca60: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ca70: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
ca80: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
ca90: 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >fd);.  return r
caa0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
cab0: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
cac0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
cad0: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
cae0: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
caf0: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
cb00: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
cb10: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
cb20: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
cb30: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
cb40: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
cb50: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cb60: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
cb70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
cb80: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
cb90: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
cba0: 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
cbb0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
cbc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
cbd0: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
cbe0: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
cbf0: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
cc00: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cc10: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
cc20: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
cc30: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
cc40: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
cc50: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
cc60: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
cc70: 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
cc80: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
cc90: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
cca0: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
ccb0: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
ccc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ccd0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
cce0: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
ccf0: 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
cd00: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
cd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cd20: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
cd30: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd50: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
cd60: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
cd70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
cd80: 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e  alOff;.#ifndef N
cd90: 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69  DEBUG .  {.    i
cda0: 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72  64 os_szJ;.    r
cdb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
cdc0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
cdd0: 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
cde0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cdf0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
ce00: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
ce10: 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
ce20: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
ce30: 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
ce40: 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74   offset just aft
ce50: 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
ce60: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e last journal. 
ce70: 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e   ** page written
ce80: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
ce90: 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
cea0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
ceb0: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
cec0: 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e  tion was written
ced0: 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
cee0: 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
cef0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
cf00: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
cf10: 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
cf20: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
cf30: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
cf40: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
cf50: 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
cf60: 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
cf70: 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
cf80: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
cf90: 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
cfa0: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
cfb0: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
cfc0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
cfd0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
cfe0: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
cff0: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
d000: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
d010: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d  ->stmtSize);.  }
d020: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d030: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
d040: 53 48 41 52 45 44 20 29 3b 0a 20 20 70 50 61 67  SHARED );.  pPag
d050: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
d060: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
d070: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d080: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
d090: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
d0a0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
d0b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d0c0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d0d0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d0e0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
d0f0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
d100: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
d110: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
d120: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
d130: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
d140: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
d150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d160: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
d170: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
d180: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
d190: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d1a0: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
d1b0: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
d1c0: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
d1d0: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
d1e0: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
d1f0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
d200: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
d210: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
d220: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
d230: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
d240: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d250: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d260: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
d270: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d280: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d290: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d2a0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d2b0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d2c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
d2d0: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
d2e0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
d2f0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
d300: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
d310: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
d320: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
d330: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
d340: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
d350: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
d360: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
d370: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
d380: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
d390: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
d3a0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
d3b0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
d3c0: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
d3d0: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
d3e0: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
d3f0: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
d400: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d410: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
d420: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d430: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
d440: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
d450: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d460: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
d470: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
d480: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
d490: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
d4a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d4b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
d4c0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d4d0: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
d4e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
d4f0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
d500: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
d510: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
d520: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
d530: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d540: 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
d550: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d560: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d570: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d580: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d590: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d5a0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
d5b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d5c0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d5d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d5e0: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d5f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d600: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
d610: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
d620: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
d630: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
d640: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
d650: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
d660: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
d670: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
d680: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d690: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d6a0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d6b0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
d6c0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d6d0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d6e0: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
d6f0: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
d700: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d710: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
d720: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
d730: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
d740: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
d750: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d760: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d770: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d780: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d790: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d7a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d7c0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d7d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d7e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d7f0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d800: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
d810: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d820: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
d830: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
d840: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d850: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
d860: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d870: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d880: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
d890: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
d8a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d8b0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
d8c0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
d8d0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
d8e0: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
d8f0: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
d900: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
d910: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
d920: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
d930: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
d940: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
d950: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
d960: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d970: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
d980: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
d990: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
d9a0: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
d9b0: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
d9c0: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
d9d0: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
d9e0: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
d9f0: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
da00: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
da10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
da20: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
da30: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
da40: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
da50: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
da60: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
da70: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
da80: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
da90: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
daa0: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
dab0: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
dac0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
dad0: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
dae0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
daf0: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
db00: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
db10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
db20: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
db30: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
db40: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
db50: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
db60: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
db70: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
db80: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
db90: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
dba0: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
dbb0: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
dbc0: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
dbd0: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
dbe0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dbf0: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
dc00: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
dc10: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
dc20: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
dc30: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
dc40: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
dc50: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
dc60: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
dc70: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
dc80: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
dc90: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
dca0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
dcb0: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
dcc0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
dcd0: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
dce0: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
dcf0: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
dd00: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
dd10: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
dd20: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
dd40: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
dd50: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
dd60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dd70: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
dd80: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
dd90: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
dda0: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
ddb0: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
ddc0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
ddd0: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
dde0: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
ddf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
de00: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
de10: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
de20: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
de30: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
de40: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
de50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
de60: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
de70: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
de80: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
de90: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
dea0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
deb0: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
dec0: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
ded0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
dee0: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
def0: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
df00: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
df10: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
df20: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
df30: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
df40: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
df50: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
df60: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
df70: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
df80: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
df90: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
dfa0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
dfb0: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
dfc0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
dfd0: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
dfe0: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
dff0: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
e000: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
e010: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
e020: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
e030: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e040: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
e050: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
e060: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
e070: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e080: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
e090: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
e0a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
e0b0: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
e0c0: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
e0d0: 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
e0e0: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
e0f0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
e100: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
e110: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
e120: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
e130: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
e140: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
e150: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
e160: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
e170: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
e180: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
e190: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
e1a0: 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20  Opentemp(OsFile 
e1b0: 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e  **pFd){.  int cn
e1c0: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
e1d0: 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51  .  char zFile[SQ
e1e0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
e1f0: 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ZE];..#ifdef SQL
e200: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
e210: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
e220: 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
e230: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
e240: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
e250: 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20  endif.  do{.    
e260: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
e270: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
e280: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
e290: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
e2a0: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
e2b0: 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c  pFd, 1);.  }whil
e2c0: 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d  e( cnt>0 && rc!=
e2d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
e2e0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
e2f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e300: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
e310: 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61  new page cache a
e320: 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
e330: 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63   to the page cac
e340: 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a  he in *ppPager..
e350: 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62  ** The file to b
e360: 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f  e cached need no
e370: 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69  t exist.  The fi
e380: 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  le is not locked
e390: 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69   until.** the fi
e3a0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
e3b0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e  te3PagerGet() an
e3c0: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
e3d0: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
e3e0: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
e3f0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
e400: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
e410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
e420: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
e430: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
e440: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
e450: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
e460: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
e470: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
e480: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
e490: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
e4a0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
e4b0: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
e4c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
e4d0: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
e4e0: 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72  " then all infor
e4f0: 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
e500: 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69  n cache..** It i
e510: 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
e520: 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63  to disk.  This c
e530: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
e540: 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e  plement an.** in
e550: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e560: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e570: 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67  PagerOpen(.  Pag
e580: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
e590: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e5a0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
e5b0: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
e5c0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
e5d0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
e5e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
e5f0: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
e600: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
e610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
e620: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
e630: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
e640: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
e650: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
e660: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
e670: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
e680: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
e690: 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
e6a0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
e6b0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
e6c0: 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d  nameLen;  /* Com
e6d0: 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20  piler is wrong. 
e6e0: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69  This is always i
e6f0: 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
e700: 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c  e use */.  OsFil
e710: 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  e *fd;.  int rc 
e720: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e730: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
e740: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
e750: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
e760: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
e770: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
e780: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
e790: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
e7a0: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
e7b0: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
e7c0: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
e7d0: 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65  )!=0;.  char zTe
e7e0: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
e7f0: 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66  ME_SIZE];.#ifdef
e800: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
e810: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
e820: 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
e830: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
e840: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e850: 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
e860: 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
e870: 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
e880: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e890: 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
e8a0: 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
e8b0: 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
e8c0: 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
e8d0: 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
e8e0: 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
e8f0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
e900: 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
e910: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
e920: 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49  oc can be set. I
e930: 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20  t would be nice 
e940: 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74  to assert.  ** t
e950: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
e960: 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Alloc is non-zer
e970: 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73  o, but alas this
e980: 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73   breaks test cas
e990: 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  es .  ** written
e9a0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70   to invoke the p
e9b0: 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20  ager directly.. 
e9c0: 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
e9d0: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
e9e0: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
e9f0: 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a  assert( pTsd );.
ea00: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
ea10: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c 72  malloc() has alr
ea20: 65 61 64 79 20 66 61 69 6c 65 64 20 72 65 74 75  eady failed retu
ea30: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
ea40: 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a   Before even.  *
ea50: 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 68  * testing for th
ea60: 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65 72  is, set *ppPager
ea70: 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20   to NULL so the 
ea80: 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65  caller knows the
ea90: 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72 75   pager.  ** stru
eaa0: 63 74 75 72 65 20 77 61 73 20 6e 65 76 65 72 20  cture was never 
eab0: 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f  allocated. .  */
eac0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
ead0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
eae0: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
eaf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eb00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
eb10: 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69  emset(&fd, 0, si
eb20: 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a  zeof(fd));..  /*
eb30: 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
eb40: 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75  file and set zFu
eb50: 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f  llPathname to po
eb60: 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65  int at malloc()e
eb70: 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  d .  ** memory c
eb80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
eb90: 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplete filename 
eba0: 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20  (i.e. including 
ebb0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a  the directory)..
ebc0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
ebd0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
ebe0: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
ebf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
ec00: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
ec10: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
ec20: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
ec30: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
ec40: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
ec50: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
ec60: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c  Dup("");.    }el
ec70: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
ec80: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
ec90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
eca0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
ecb0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
ecc0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
ecd0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ece0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
ecf0: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
ed00: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
ed10: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Only);.      }. 
ed20: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ed30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ed40: 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29  gerOpentemp(&fd)
ed50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
ed60: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d  empFileName(zTem
ed70: 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  p);.    zFilenam
ed80: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
ed90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
eda0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
edb0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
edc0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
edd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ede0: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
edf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
ee00: 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
ee10: 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70   structure. As p
ee20: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
ee30: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f  allocation, allo
ee40: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
ee50: 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74  for the full pat
ee60: 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  hs of the file, 
ee70: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f  directory and jo
ee80: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67  urnal .  ** (Pag
ee90: 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61  er.zFilename, Pa
eea0: 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61  ger.zDirectory a
eeb0: 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
eec0: 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  l)..  */.  if( z
eed0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
eee0: 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74      nameLen = st
eef0: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
ef00: 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  me);.    pPager 
ef10: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ef20: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
ef30: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
ef40: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
ef50: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
ef60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
ef70: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
ef80: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
ef90: 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f  allocRaw(SQLITE_
efa0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
efb0: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  E);.    }.  }...
efc0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
efd0: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
efe0: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
eff0: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
f000: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
f010: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
f020: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
f030: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
f040: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
f050: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
f060: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
f070: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
f080: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
f090: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
f0a0: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
f0b0: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
f0c0: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
f0d0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
f0e0: 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
f0f0: 70 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  pace || rc!=SQLI
f100: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
f110: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
f120: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
f130: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f140: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f150: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
f160: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
f170: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
f180: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52  M:rc);.  }..  TR
f190: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
f1a0: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
f1b0: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
f1c0: 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  name);.  IOTRACE
f1d0: 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
f1e0: 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50  , pPager, zFullP
f1f0: 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67  athname)).  pPag
f200: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
f210: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
f220: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
f230: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
f240: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
f250: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
f260: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
f270: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f280: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
f290: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
f2a0: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
f2b0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
f2c0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
f2d0: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
f2e0: 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  name);..  for(i=
f2f0: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
f300: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f310: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
f320: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
f330: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f340: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
f350: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
f360: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
f370: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
f380: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
f390: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
f3a0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f3b0: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
f3c0: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
f3d0: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20  ->fd = fd;.  /* 
f3e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f3f0: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
f400: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
f410: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
f420: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
f430: 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
f440: 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
f450: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
f460: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
f470: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f480: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
f490: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f4a0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
f4b0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f4c0: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
f4d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
f4e0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
f4f0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  AGE_SIZE;.  /* p
f500: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
f510: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f520: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
f530: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f540: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
f550: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f560: 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  MaxPage = 0; */.
f570: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
f580: 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74   = 100;.  assert
f590: 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d  ( PAGER_UNLOCK==
f5a0: 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  0 );.  /* pPager
f5b0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
f5c0: 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
f5d0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f5e0: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f5f0: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
f600: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
f610: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
f620: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
f630: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
f640: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
f650: 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
f660: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
f670: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f680: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
f690: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
f6a0: 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
f6b0: 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a  oSync?0:1);.  /*
f6c0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
f6d0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f6e0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
f6f0: 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
f700: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
f710: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
f720: 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
f730: 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
f740: 0a 20 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65  .  assert(fd||me
f750: 6d 44 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d  mDb);.  if( !mem
f760: 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
f770: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
f780: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
f790: 7a 65 28 66 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ze(fd);.  }.  /*
f7a0: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
f7b0: 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
f7c0: 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
f7d0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
f7e0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
f7f0: 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
f800: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
f810: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f820: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
f830: 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  NT.  pPager->pNe
f840: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
f850: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
f860: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
f870: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
f880: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f890: 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
f8a0: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
f8b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
f8c0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
f8d0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
f8e0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
f8f0: 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
f900: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
f910: 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
f920: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
f930: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
f940: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
f950: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
f960: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
f970: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
f980: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
f990: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
f9a0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
f9b0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
f9c0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
f9d0: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
f9e0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
f9f0: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
fa00: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
fa10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
fa20: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
fa30: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
fa40: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fa50: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
fa60: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
fa70: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
fa80: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f  PagerUnref()..*/
fa90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
faa0: 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28  erSetDestructor(
fab0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
fac0: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50  oid (*xDesc)(DbP
fad0: 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
fae0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
faf0: 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a  r = xDesc;.}../*
fb00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
fb10: 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
fb20: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
fb30: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e  t NULL, the rein
fb40: 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20  itializer.** is 
fb50: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
fb60: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67  content of a pag
fb70: 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65  e in cache is re
fb80: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
fb90: 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20  iginal.** value 
fba0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
fbb0: 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
fbc0: 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68  callback gives h
fbd0: 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65  igher-level code
fbe0: 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  .** an opportuni
fbf0: 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ty to restore th
fc00: 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20  e EXTRA section 
fc10: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
fc20: 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61  e restored.** pa
fc30: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
fc40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fc50: 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  Reiniter(Pager *
fc60: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
fc70: 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c  Reinit)(DbPage*,
fc80: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
fc90: 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
fca0: 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  init;.}../*.** S
fcb0: 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  et the page size
fcc0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
fcd0: 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20  w size.  If the 
fce0: 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
fcf0: 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70  .** size is inap
fd00: 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
fd10: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
fd20: 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65  age size is sele
fd30: 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75  cted.** and retu
fd40: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
fd50: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
fd60: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
fd70: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
fd80: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
fd90: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
fda0: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
fdb0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
fdc0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
fdd0: 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
fde0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
fdf0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  ageSize;.    sql
fe00: 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  ite3ReallocOrFre
fe10: 65 28 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67  e((void **)&pPag
fe20: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70  er->pTmpSpace, p
fe30: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
fe40: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
fe50: 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
fe60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
fe70: 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
fe80: 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
fe90: 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
fea0: 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
feb0: 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
fec0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
fed0: 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
fee0: 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
fef0: 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
ff00: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
ff10: 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
ff20: 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
ff30: 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
ff40: 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
ff50: 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
ff60: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
ff70: 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
ff80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
ff90: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
ffa0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
ffb0: 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
ffc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
ffd0: 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
ffe0: 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
fff0: 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
10000 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73  _io_error(){.  s
10010 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
10020 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20  hit = 0;.}.void 
10030 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
10040 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
10050 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
10060 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10070 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
10080 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10090 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
100a0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
100b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
100c0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
100d0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
100e0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
100f0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c  else.# define cl
10100 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ear_simulated_io
10110 5f 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e  _error().# defin
10120 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
10130 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
10140 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
10150 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10160 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
10170 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
10180 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
10190 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
101a0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
101b0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
101c0 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
101d0 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
101e0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
101f0 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
10200 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
10210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
10220 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
10230 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
10240 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
10250 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
10260 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
10270 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
10280 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
10290 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
102a0 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
102b0 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
102c0 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
102d0 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
102e0 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
102f0 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
10300 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
10310 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
10320 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
10330 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
10340 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
10350 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
10360 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
10370 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
10380 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
10390 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
103a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
103b0 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
103c0 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
103d0 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c  =0 ){.    disabl
103e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
103f0 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
10400 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
10410 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 65  r->fd, 0);.    e
10420 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
10430 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
10440 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
10450 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
10460 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
10470 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
10480 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
10490 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  t, N);.    if( r
104a0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
104b0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
104c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
104d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
104e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
104f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
10500 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
10510 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
10520 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
10530 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
10540 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50   .**.** If the P
10550 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73  ENDING_BYTE lies
10560 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72   on the page dir
10570 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
10580 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
10590 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  le, then conside
105a0 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74  r this page part
105b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f   of the file too
105c0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
105d0 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54  f.** PENDING_BYT
105e0 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28  E is byte 4096 (
105f0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
10600 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68  f page 5) and th
10610 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
10620 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79   file is 4096 by
10630 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e  tes, 5 is return
10640 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e  ed instead of 4.
10650 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
10660 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
10670 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10680 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  i64 n;.  int rc;
10690 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
106a0 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
106b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
106c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
106d0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
106e0 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
106f0 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
10700 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
10710 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
10720 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10730 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
10740 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
10750 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
10760 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
10770 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
10790 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
107a0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
107b0 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
107c0 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
107d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
107e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
107f0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
10800 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
10810 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10820 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
10830 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
10840 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
10850 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
10860 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n++;.  }.  retur
10870 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  n n;.}...#ifndef
10880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
10890 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ORYDB./*.** Clea
108a0 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
108b0 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
108c0 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
108d0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
108e0 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
108f0 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
10900 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
10910 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
10920 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
10930 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
10940 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  0;.}.#else.#defi
10950 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  ne clearHistory(
10960 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
10970 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
10980 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
10990 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
109a0 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55  ager*);../*.** U
109b0 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
109c0 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
109d0 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67  Also set the pag
109e0 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f  e number to 0 to
109f0 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
10a00 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
10a10 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  t part of any ha
10a20 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69  sh chain. This i
10a30 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
10a40 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  se the.** sqlite
10a50 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
10a60 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61   routine can lea
10a70 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  ve a page in the
10a80 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70   .** pNextFree/p
10a90 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68  PrevFree list th
10aa0 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74  at is not a part
10ab0 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61   of any hash-cha
10ac0 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
10ad0 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  id unlinkHashCha
10ae0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
10af0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
10b00 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
10b10 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
10b20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
10b30 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
10b40 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Hash==0 );.    r
10b50 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
10b60 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
10b70 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
10b80 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
10b90 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
10ba0 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
10bb0 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
10bc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10bd0 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67  r->aHash[pPg->pg
10be0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
10bf0 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a  ash-1)]!=pPg );.
10c00 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
10c10 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
10c20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
10c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10c40 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
10c50 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
10c60 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  1);.    pPager->
10c70 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
10c80 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
10c90 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
10ca0 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
10cb0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
10cc0 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a  , pPager));.  }.
10cd0 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
10ce0 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
10cf0 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
10d00 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sh = 0;.}../*.**
10d10 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
10d20 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
10d30 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
10d40 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
10d50 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
10d60 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
10d70 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
10d80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
10d90 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
10da0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
10db0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
10dc0 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74  er;..  /* Keep t
10dd0 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20  he pFirstSynced 
10de0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
10df0 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79   at the first sy
10e00 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20  nchronized page 
10e10 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50  */.  if( pPg==pP
10e20 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10e30 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
10e40 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
10e50 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ree;.    while( 
10e60 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
10e70 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
10e80 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67  Free; }.    pPag
10e90 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
10ea0 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = p;.  }..  /* 
10eb0 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
10ec0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66  freelist */.  if
10ed0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
10ee0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   ){.    pPg->pPr
10ef0 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
10f00 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
10f10 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
10f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10f30 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
10f40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
10f50 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
10f60 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ree;.  }.  if( p
10f70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
10f80 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
10f90 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
10fa0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
10fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
10fc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
10fd0 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
10fe0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
10ff0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11000 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
11010 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
11020 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  vFree = 0;..  /*
11030 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
11040 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
11050 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
11060 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
11070 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  g);.}..#ifndef S
11080 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
11090 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  YDB./*.** This r
110a0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
110b0 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
110c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
110d0 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c  .  Delete.** all
110e0 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
110f0 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
11100 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11110 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
11120 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
11130 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
11140 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
11150 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
11160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
11170 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
11180 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11190 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
111a0 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
111b0 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
111c0 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
111d0 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
111e0 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
111f0 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
11200 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
11210 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
11220 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
11230 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
11240 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
11250 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
11260 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
11270 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
11280 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
11290 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
112a0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
112b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
112c0 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
112d0 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
112e0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
112f0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
11300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
11310 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
11320 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
11330 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
11340 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54  .#define memoryT
11350 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69  runcate(p).#endi
11360 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  f../*.** Try to 
11370 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
11380 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
11390 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
113a0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
113b0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
113c0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
113d0 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
113e0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
113f0 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
11400 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
11410 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
11420 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
11430 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
11440 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
11450 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
11460 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
11470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11480 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11490 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
114a0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
114b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
114c0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
114d0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
114e0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
114f0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
11500 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
11510 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
11520 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
11530 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
11540 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
11550 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11560 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
11570 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
11580 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
11590 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
115a0 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
115b0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
115c0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
115d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
115e0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
115f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
11600 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20   || MEMDB );..  
11610 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
11620 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
11630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11640 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
11650 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
11660 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
11670 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
11680 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
11690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
116a0 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
116b0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
116c0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
116d0 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
116e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
116f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
11700 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
11710 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
11720 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
11730 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
11740 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11760 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
11770 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
11780 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
11790 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
117a0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
117b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
117c0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
117d0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
117e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
117f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
11800 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
11810 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
11820 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
11830 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11840 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
11850 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
11860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11870 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
11880 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
11890 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
118a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
118b0 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
118c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
118d0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
118e0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
118f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
11900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11910 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a    }.  rc = syncJ
11920 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
11930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11940 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11950 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
11960 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
11970 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
11980 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75  abase before tru
11990 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  ncating. */.  rc
119a0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
119b0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
119c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
119d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
119e0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
119f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
11a00 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
11a10 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
11a20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11a30 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
11a40 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
11a50 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
11a60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
11a70 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
11a80 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
11a90 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
11aa0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
11ab0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
11ac0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
11ad0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
11ae0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
11af0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
11b00 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
11b10 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
11b20 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
11b30 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
11b40 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
11b50 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
11b60 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
11b70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
11b80 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
11b90 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
11ba0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
11bb0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
11bc0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
11bd0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
11be0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
11bf0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
11c00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
11c10 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
11c20 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
11c30 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
11c40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11c50 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
11c60 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
11c70 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
11c80 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
11c90 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
11ca0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
11cb0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
11cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
11cd0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
11ce0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
11cf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
11d00 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
11d10 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
11d20 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
11d30 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
11d40 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
11d50 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
11d60 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
11d70 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
11d80 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
11d90 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
11da0 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
11db0 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
11dc0 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
11dd0 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
11de0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
11df0 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
11e00 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
11e10 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20  oc can be set.. 
11e20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
11e30 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
11e40 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
11e50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29  assert( pPager )
11e60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
11e70 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63   && pTsd->nAlloc
11e80 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69   );.#endif..  di
11e90 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
11ea0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70  io_errors();.  p
11eb0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
11ec0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
11ed0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
11ee0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
11ef0 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55  Pager);.  pagerU
11f00 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
11f10 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62  (pPager);.  enab
11f20 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
11f30 65 72 72 6f 72 73 28 29 3b 0a 20 20 54 52 41 43  errors();.  TRAC
11f40 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
11f50 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
11f60 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
11f70 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
11f80 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20 70  er)).  assert( p
11f90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
11fa0 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
11fb0 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
11fc0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
11fd0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
11fe0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
11ff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
12000 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
12010 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
12020 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
12030 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
12040 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
12050 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12060 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
12070 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
12080 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
12090 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54  ger->fd);.  /* T
120a0 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
120b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
120c0 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
120d0 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
120e0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
120f0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
12100 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
12110 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
12120 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
12130 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
12140 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  ANAGEMENT.  /* R
12150 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20  emove the pager 
12160 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20  from the linked 
12170 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 73  list of pagers s
12180 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a  tarting at .  **
12190 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61 67   ThreadData.pPag
121a0 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  er if memory-man
121b0 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
121c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
121d0 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61  Pager==pTsd->pPa
121e0 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d  ger ){.    pTsd-
121f0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
12200 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
12210 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d  {.    Pager *pTm
12220 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20  p;.    for(pTmp 
12230 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20  = pTsd->pPager; 
12240 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61  pTmp->pNext!=pPa
12250 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  ger; pTmp=pTmp->
12260 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d  pNext){}.    pTm
12270 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  p->pNext = pPage
12280 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65  r->pNext;.  }.#e
12290 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65  ndif.  sqliteFre
122a0 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
122b0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
122c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
122d0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
122e0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
122f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12300 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12310 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
12320 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
12330 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
12340 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
12350 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
12360 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
12370 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
12380 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
12390 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
123a0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
123b0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
123c0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
123d0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
123e0 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
123f0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12400 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
12410 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
12420 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
12430 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
12440 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
12450 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
12460 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
12470 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
12480 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
12490 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
124a0 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
124b0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
124c0 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
124d0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
124e0 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
124f0 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
12500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12510 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
12520 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
12530 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
12540 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
12550 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
12560 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
12570 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
12580 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
12590 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
125a0 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
125b0 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
125c0 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
125d0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
125e0 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
125f0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
12600 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
12610 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
12620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12630 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
12640 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
12650 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
12660 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12680 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12690 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
126a0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
126b0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
126c0 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
126d0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
126e0 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
126f0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
12700 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12710 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
12720 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
12730 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
12740 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
12750 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
12760 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
12770 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
12780 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
12790 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
127a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
127b0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
127c0 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
127d0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
127e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
127f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
12800 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
12810 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
12820 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
12830 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
12840 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
12850 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
12860 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12870 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
12880 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
12890 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
128a0 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
128b0 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
128c0 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
128d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
128e0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
128f0 70 50 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66  pPg){.  page_ref
12900 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
12910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12920 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
12930 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
12940 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
12950 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
12960 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
12970 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
12980 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
12990 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
129a0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
129b0 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
129c0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
129d0 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
129e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
129f0 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
12a00 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
12a10 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
12a20 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12a30 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
12a40 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
12a50 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
12a60 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
12a70 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
12a80 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
12a90 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
12aa0 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
12ab0 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
12ac0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
12ad0 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
12ae0 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
12af0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
12b00 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
12b10 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12b20 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
12b30 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
12b40 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
12b50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
12b60 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
12b70 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
12b80 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
12b90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12ba0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
12bb0 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
12bc0 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
12bd0 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
12be0 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
12bf0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
12c00 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
12c10 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
12c20 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
12c30 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
12c40 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
12c50 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
12c60 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
12c70 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
12c80 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
12c90 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
12ca0 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
12cb0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
12cc0 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
12cd0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
12ce0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
12cf0 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
12d00 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
12d10 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
12d20 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
12d30 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
12d40 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
12d50 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
12d60 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
12d70 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
12d80 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12d90 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
12da0 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
12db0 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
12dc0 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
12dd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12de0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
12df0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
12e00 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
12e10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12e20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
12e30 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
12e40 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
12e50 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
12e60 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
12e70 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
12e80 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
12e90 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
12ea0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
12eb0 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
12ec0 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
12ed0 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
12ee0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
12ef0 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
12f00 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
12f10 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
12f20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
12f30 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
12f40 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
12f50 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12f60 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
12f70 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
12f80 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
12f90 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
12fa0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
12fb0 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
12fc0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
12fd0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
12fe0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
12ff0 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
13000 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13010 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
13020 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
13030 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
13040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
13050 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
13060 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
13070 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
13080 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
13090 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
130a0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
130b0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
130c0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
130d0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
130e0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
130f0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
13100 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
13110 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
13120 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13130 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
13140 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
13150 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
13160 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
13170 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
13180 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
13190 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
131a0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
131b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
131c0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
131d0 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
131e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
131f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
13210 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
13220 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20  k(pPager->jfd,. 
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13250 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
13260 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
13270 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69  gic));.        i
13280 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13290 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  c;.        IOTRA
132a0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
132b0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
132c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
132d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
132e0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
132f0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34  JournalMagic), 4
13300 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
13310 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
13320 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
13330 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
13340 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13350 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  rc;..        rc 
13360 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
13370 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
13380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
13390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
133a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
133b0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
133c0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
133d0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
133e0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
133f0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
13400 4e 43 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  NC %d\n", pPager
13410 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  )).      rc = sq
13420 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
13430 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
13440 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20  >full_fsync);.  
13450 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
13460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13470 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13480 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
13490 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
134a0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
134b0 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
134c0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
134d0 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
134e0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
134f0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
13500 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
13510 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
13520 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
13530 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
13540 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
13550 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
13560 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
13570 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
13580 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
13590 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
135a0 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
135b0 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
135c0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
135d0 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
135e0 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
135f0 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
13600 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
13610 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
13620 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
13630 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
13640 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
13650 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
13660 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
13670 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
13680 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
13690 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70  ynced==pPager->p
136a0 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
136b0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
136c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
136d0 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61   two lists of pa
136e0 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  ges connected by
136f0 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70   pDirty and in p
13700 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f  gno order..** Do
13710 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67   not both fixing
13720 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20   the pPrevDirty 
13730 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
13740 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65  tic PgHdr *merge
13750 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
13760 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b  *pA, PgHdr *pB){
13770 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c  .  PgHdr result,
13780 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c   *pTail;.  pTail
13790 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68   = &result;.  wh
137a0 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b  ile( pA && pB ){
137b0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e  .    if( pA->pgn
137c0 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  o<pB->pgno ){.  
137d0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
137e0 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54  y = pA;.      pT
137f0 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  ail = pA;.      
13800 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b  pA = pA->pDirty;
13810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13820 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13830 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69  = pB;.      pTai
13840 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42  l = pB;.      pB
13850 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20   = pB->pDirty;. 
13860 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
13870 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  A ){.    pTail->
13880 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d  pDirty = pA;.  }
13890 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20  else if( pB ){. 
138a0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
138b0 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = pB;.  }else{.
138c0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
138d0 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
138e0 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74  urn result.pDirt
138f0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74  y;.}../*.** Sort
13900 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
13910 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
13920 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20  order by pgno.  
13930 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e  Pages are.** con
13940 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
13950 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20   pointers.  The 
13960 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
13970 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75  ers are.** corru
13980 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72  pted by this sor
13990 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  t..*/.#define N_
139a0 53 4f 52 54 5f 42 55 43 4b 45 54 20 32 35 0a 73  SORT_BUCKET 25.s
139b0 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
139c0 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
139d0 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
139e0 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
139f0 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  ], *p;.  int i;.
13a00 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73    memset(a, 0, s
13a10 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69  izeof(a));.  whi
13a20 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70  le( pIn ){.    p
13a30 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20   = pIn;.    pIn 
13a40 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
13a50 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
13a60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e      for(i=0; i<N
13a70 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20  _SORT_BUCKET-1; 
13a80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
13a90 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[i]==0 ){.     
13aa0 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20     a[i] = p;.   
13ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13ad0 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
13ae0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
13af0 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a        a[i] = 0;.
13b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13b10 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f    if( i==N_SORT_
13b20 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20  BUCKET-1 ){.    
13b30 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70    a[i] = merge_p
13b40 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29  agelist(a[i], p)
13b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20  ;.    }.  }.  p 
13b60 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  = a[0];.  for(i=
13b70 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  1; i<N_SORT_BUCK
13b80 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ET; i++){.    p 
13b90 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
13ba0 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  (p, a[i]);.  }. 
13bb0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
13bc0 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
13bd0 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
13be0 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
13bf0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
13c00 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
13c10 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
13c20 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
13c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
13c40 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
13c50 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
13c60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13c70 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
13c80 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
13c90 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
13ca0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
13cb0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
13cc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
13cd0 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
13ce0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
13cf0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
13d00 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
13d10 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
13d20 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
13d30 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
13d40 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
13d50 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
13d60 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
13d70 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
13d80 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
13d90 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
13da0 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
13db0 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
13dc0 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
13dd0 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
13de0 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
13df0 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
13e00 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
13e10 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
13e20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
13e30 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
13e40 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
13e50 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
13e60 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
13e70 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
13e80 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
13e90 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
13ea0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
13eb0 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
13ec0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
13ed0 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
13ee0 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
13ef0 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
13f00 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
13f10 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
13f20 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
13f30 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
13f40 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
13f50 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
13f60 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
13f70 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
13f80 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
13f90 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
13fa0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
13fb0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
13fc0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
13fd0 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
13fe0 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
13ff0 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
14000 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
14010 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
14020 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
14030 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
14040 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
14050 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
14060 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
14070 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
14080 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
14090 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
140a0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
140b0 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74  rc;.  }..  pList
140c0 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74   = sort_pagelist
140d0 28 70 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65  (pList);.  while
140e0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
140f0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
14100 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rty );.    rc = 
14110 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
14120 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
14130 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
14140 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14150 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
14160 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a  eturn rc;.    /*
14170 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
14180 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
14190 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
141a0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
141b0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
141c0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
141d0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
141e0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
141f0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
14200 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
14210 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
14220 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
14230 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
14240 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
14250 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
14260 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
14270 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
14280 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
14290 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
142a0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
142b0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
142c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
142d0 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
142e0 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41  o, 6);.      TRA
142f0 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
14300 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14310 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14320 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49  ->pgno);.      I
14330 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
14340 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
14350 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20   pList->pgno)). 
14360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14370 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
14380 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
14390 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
143a0 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70       TEST_INCR(p
143b0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
143c0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
143d0 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
143e0 20 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53       TRACE3("NOS
143f0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
14400 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
14410 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
14420 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
14430 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
14440 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73  urn rc;.    pLis
14450 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  t->dirty = 0;.#i
14460 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14470 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
14480 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
14490 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
144a0 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
144b0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
144c0 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
144d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
144e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
144f0 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
14500 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
14510 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
14520 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
14530 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
14540 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
14550 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
14560 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
14570 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
14580 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
14590 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
145a0 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
145b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
145c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72  urn pPager->pDir
145d0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ty;.}../*.** Ret
145e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72  urn TRUE if ther
145f0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
14600 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  al on the given 
14610 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20  pager..** A hot 
14620 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
14630 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
14640 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  played back..**.
14650 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
14660 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
14670 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
14680 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
14690 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
146a0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
146b0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
146c0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
146d0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
146e0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
146f0 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65  name.  Just dele
14700 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
14710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
14720 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
14730 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14740 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  ( !pPager->useJo
14750 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30  urnal ) return 0
14760 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
14770 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
14780 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29  ger->zJournal) )
14790 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
147a0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
147b0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
147c0 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72 6e  er->fd) ) return
147d0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
147e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
147f0 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20  pPager)==0 ){.  
14800 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
14810 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
14820 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  al);.    return 
14830 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14840 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
14850 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69  ./*.** Try to fi
14860 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
14870 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e 20   cache that can 
14880 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a  be recycled. .**
14890 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
148a0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
148b0 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
148c0 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f  _FULL or SQLITE_
148d0 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20  OK. It .** does 
148e0 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61 67  not set the pPag
148f0 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69  er->errCode vari
14900 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
14910 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c  int pager_recycl
14920 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
14930 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48   int syncOk, PgH
14940 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67  dr **ppPg){.  Pg
14950 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50  Hdr *pPg;.  *ppP
14960 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6e  g = 0;..  /* Fin
14970 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
14980 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
14990 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
149a0 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
149b0 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
149c0 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
149d0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
149e0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
149f0 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
14a00 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
14a10 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
14a20 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
14a30 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
14a40 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
14a50 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
14a60 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
14a70 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
14a80 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20  .  ** very slow 
14a90 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
14aa0 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
14ab0 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
14ac0 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63  etimes.  ** it c
14ad0 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
14ae0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d    */.  if( pPg==
14af0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
14b00 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26  rst && syncOk &&
14b10 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e   !MEMDB){.    in
14b20 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
14b30 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
14b40 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
14b50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14b60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
14b70 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
14b80 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
14b90 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
14ba0 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
14bb0 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
14bc0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  he.      ** jour
14bd0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
14be0 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20  s done to avoid 
14bf0 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  ever modifying a
14c00 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14c10 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73  * header that is
14c20 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
14c30 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67   rollback of pag
14c40 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
14c50 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65     ** already be
14c60 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
14c70 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
14c80 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
14c90 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68  s.      ** trash
14ca0 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
14cb0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
14cc0 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  d)..      */.   
14cd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
14ce0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
14cf0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14d00 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
14d10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14d20 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
14d30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
14d40 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
14d50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
14d60 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
14d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
14d90 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
14da0 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rst;.  }.  if( p
14db0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Pg==0 ){.    ret
14dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14dd0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
14de0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
14df0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
14e00 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
14e10 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
14e20 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
14e30 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
14e40 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
14e50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
14e60 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
14e70 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
14e80 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
14e90 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
14ea0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
14eb0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
14ec0 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
14ed0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14f00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
14f10 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
14f20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
14f30 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
14f40 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
14f50 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
14f60 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
14f70 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
14f80 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
14f90 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
14fa0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74    ** sqlite_dont
14fb0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69  _rollback() opti
14fc0 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  mization for the
14fd0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72   rest of this tr
14fe0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
14ff0 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
15000 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
15010 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
15020 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
15030 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  k.  ** might be 
15040 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
15050 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
15060 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
15070 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  n't remember.  *
15080 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61  * that is was ma
15090 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
150a0 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  ack.  This means
150b0 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
150c0 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72  must.  ** be mar
150d0 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
150e0 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20  lback from here 
150f0 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  on out..  */.  i
15100 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
15110 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f  llback ){.    IO
15120 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52  TRACE(("ALWAYS_R
15130 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70  OLLBACK %p\n", p
15140 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67  Pager)).    pPag
15150 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
15160 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 1;.  }..  /
15170 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
15180 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
15190 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
151a0 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f   hash table.  */
151b0 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50  .  unlinkPage(pP
151c0 67 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43 52 28  g);.  TEST_INCR(
151d0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a  pPager->nOvfl);.
151e0 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
151f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15200 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
15210 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15220 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70  lled to free sup
15230 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63  erfluous dynamic
15240 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d  ally allocated m
15250 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79  emory.** held by
15260 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65   the pager syste
15270 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65  m. Memory in use
15280 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70   by any SQLite p
15290 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ager allocated.*
152a0 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  * by the current
152b0 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73   thread may be s
152c0 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a  qliteFree()ed..*
152d0 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65  *.** nReq is the
152e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
152f0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69   of memory requi
15300 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d  red. Once this m
15310 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  uch has.** been 
15320 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75  released, the fu
15330 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
15340 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  A negative value
15350 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a   for nReq means.
15360 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68 20  ** free as much 
15370 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
15380 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  le. The return v
15390 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61  alue is the tota
153a0 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20  l number .** of 
153b0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
153c0 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66  released..*/.#if
153d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
153e0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
153f0 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  ENT.int sqlite3P
15400 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72  agerReleaseMemor
15410 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63  y(int nReq){.  c
15420 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20  onst ThreadData 
15430 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65  *pTsdro = sqlite
15440 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
15450 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65 72 20 2a  nly();.  Pager *
15460 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  p;.  int nReleas
15470 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ed = 0;.  int i;
15480 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68  ..  /* If the th
15490 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  e global mutex i
154a0 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62  s held, this sub
154b0 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20  routine becomes 
154c0 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72  a.  ** o-op; zer
154d0 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  o bytes of memor
154e0 79 20 61 72 65 20 66 72 65 65 64 2e 20 20 54 68  y are freed.  Th
154f0 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20  is is because.  
15500 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** some of the c
15510 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ode invoked by t
15520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
15530 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74   also.  ** try t
15540 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74  o obtain the mut
15550 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ex, resulting in
15560 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a   a deadlock..  *
15570 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  /.  if( sqlite3O
15580 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20  sInMutex(0) ){. 
15590 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
155a0 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74  ..  /* Outermost
155b0 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61   loop runs for a
155c0 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61  t most two itera
155d0 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65  tions. First ite
155e0 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74  ration we.  ** t
155f0 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72  ry to find memor
15600 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  y that can be re
15610 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 63  leased without c
15620 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20  alling fsync(). 
15630 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72  Second.  ** iter
15640 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c  ation (which onl
15650 79 20 72 75 6e 73 20 69 66 20 74 68 65 20 66 69  y runs if the fi
15660 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72  rst failed to fr
15670 65 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66  ee nReq bytes of
15680 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73  .  ** memory) is
15690 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61   permitted to ca
156a0 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73  ll fsync(). This
156b0 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75   is of course mu
156c0 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78  ch more .  ** ex
156d0 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  pensive..  */.  
156e0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69  for(i=0; i<=1; i
156f0 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  ++){..    /* Loo
15700 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  p through all th
15710 65 20 53 51 4c 69 74 65 20 70 61 67 65 72 73 20  e SQLite pagers 
15720 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63 75  opened by the cu
15730 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f  rrent thread. */
15740 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 73 64 72  .    for(p=pTsdr
15750 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20 26 26 20  o->pPager; p && 
15760 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
15770 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d  ased<nReq); p=p-
15780 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50  >pNext){.      P
15790 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
157a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
157b0 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67 65  /* For each page
157c0 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20 61  r, try to free a
157d0 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20  s many pages as 
157e0 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75  possible (withou
157f0 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  t .      ** call
15800 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20 74  ing fsync() if t
15810 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15820 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
15830 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20  e outermost .   
15840 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20     ** loop)..   
15850 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c     */.      whil
15860 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  e( SQLITE_OK==(r
15870 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
15880 65 28 70 2c 20 69 2c 20 26 70 50 67 29 29 20 26  e(p, i, &pPg)) &
15890 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20  & pPg) {.       
158a0 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
158b0 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
158c0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
158d0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
158e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
158f0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
15900 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
15910 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
15920 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20  ed-list .       
15930 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
15940 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
15950 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
15960 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
15970 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65         ** Remove
15980 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
15990 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
159a0 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g..        **.  
159b0 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
159c0 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
159d0 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
159e0 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
159f0 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a  k. It .        *
15a00 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
15a10 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ough..        */
15a20 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
15a30 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  pTmp;.        as
15a40 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
15a50 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
15a60 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
15a70 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
15a80 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29  ( pPg==p->pAll )
15a90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  {.           p->
15aa0 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
15ab0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  tAll;.        }e
15ac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
15ad0 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c  or( pTmp=p->pAll
15ae0 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ; pTmp->pNextAll
15af0 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70  !=pPg; pTmp=pTmp
15b00 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20  ->pNextAll ){}. 
15b10 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70           pTmp->p
15b20 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  NextAll = pPg->p
15b30 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
15b40 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65   }.        nRele
15b50 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c  ased += sqliteAl
15b60 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a 20 20  locSize(pPg);.  
15b70 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
15b80 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  (pPg);.      }..
15b90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15bb0 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
15bc0 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
15bd0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
15be0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
15bf0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
15c00 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63  l in pager_recyc
15c10 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20  le(). The error 
15c20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
15c30 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
15c40 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  ** caller of thi
15c50 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74  s function. Inst
15c60 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67  ead, set the Pag
15c70 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
15c80 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble..        ** 
15c90 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
15ca0 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
15cb0 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
15cc0 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
15cd0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73         ** of a s
15ce0 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
15cf0 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
15d00 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
15d10 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
15d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15d30 61 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66  assert( (rc&0xff
15d40 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
15d50 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  || rc==SQLITE_FU
15d60 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LL );.        as
15d70 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
15d80 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
15d90 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  ;.        pager_
15da0 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20  error(p, rc);.  
15db0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15dc0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
15dd0 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
15de0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
15df0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
15e00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
15e10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15e20 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
15e30 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
15e40 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
15e50 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
15e60 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
15e70 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
15e80 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
15e90 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
15ea0 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
15eb0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
15ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15ed0 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
15ee0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15ef0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15f00 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
15f10 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
15f20 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
15f30 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
15f40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15f50 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
15f60 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
15f70 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
15f80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
15f90 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
15fa0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
15fb0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
15fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
15fe0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
15ff0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
16010 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
16020 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
16030 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  K );.      }.  .
16040 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f        /* If a jo
16050 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
16060 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
16070 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
16080 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
16090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
160a0 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
160b0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
160c0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
160d0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
160e0 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
160f0 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
16100 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
16110 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16120 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16130 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
16140 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
16150 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
16160 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
16170 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
16180 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
16190 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
161a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
161b0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
161c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
161d0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
161e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
161f0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
16200 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
16210 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
16220 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
16230 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
16240 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
16250 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
16260 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
16270 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63   .        ** bac
16280 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  k..        ** . 
16290 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73         ** Becaus
162a0 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
162b0 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
162c0 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
162d0 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  d, the.        *
162e0 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73  * second process
162f0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69   will get to thi
16300 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
16310 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a  ode and fail to.
16320 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69          ** obtai
16330 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
16340 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
16350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16360 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16370 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16380 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
16390 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
163a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
163b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
163c0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
163d0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
163e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
163f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
16400 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
16410 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
16420 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
16430 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20  R_EXCLUSIVE;. . 
16440 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
16450 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
16460 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
16470 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
16480 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   if.        ** w
16490 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
164a0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
164b0 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20   file. .        
164c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
164d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
164e0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
164f0 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
16500 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
16510 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
16520 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
16530 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
16540 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
16550 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  .        ** a wr
16560 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
16570 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
16580 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
16590 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   more.        **
165a0 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
165b0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
165c0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
165d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
165e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
165f0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70  OsOpenReadOnly(p
16600 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
16610 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
16620 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16640 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
16650 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
16660 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16670 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
16690 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
166a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
166b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
166c0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
166d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
166e0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
166f0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
16700 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
16710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16720 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20  Hdr = 0;. .     
16730 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
16740 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
16750 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
16760 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
16770 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20          ** lock 
16780 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
16790 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
167a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
167b0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
167c0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
167d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
167e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
167f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
16800 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
16810 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
16820 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16830 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
16840 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
16850 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
16860 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
16870 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
16880 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
16890 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
168a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
168b0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
168c0 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
168d0 50 61 67 65 31 20 3d 20 70 61 67 65 72 5f 6c 6f  Page1 = pager_lo
168e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
168f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
16900 67 65 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ge1 ){.         
16910 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
16920 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 31 29  (pPager, pPage1)
16930 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
16940 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
16950 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
16960 72 2c 20 31 29 20 29 3b 0a 20 20 20 20 20 20 20  r, 1) );.       
16970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16980 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
16990 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
169a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
169b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 09  ==SQLITE_OK ){..
169c0 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65 2d    /* The change-
169d0 63 6f 75 6e 74 65 72 20 69 73 20 73 74 6f 72 65  counter is store
169e0 64 20 61 74 20 6f 66 66 73 65 74 20 32 34 2e 20  d at offset 24. 
169f0 53 65 65 20 61 6c 73 6f 0a 20 20 20 20 20 20 20  See also.       
16a00 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
16a10 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
16a20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
16a30 20 20 20 20 20 20 20 20 20 75 33 32 20 69 43 68           u32 iCh
16a40 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74 72  angeCount = retr
16a50 69 65 76 65 33 32 62 69 74 73 28 70 50 61 67 65  ieve32bits(pPage
16a60 31 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  1, 24);.        
16a70 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
16a80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16a90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
16aa0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
16ab0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
16ac0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
16ad0 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d 70 50 61  ChangeCount!=pPa
16ae0 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e  ger->iChangeCoun
16af0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16b00 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
16b10 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16b20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  }.          pPag
16b30 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74  er->iChangeCount
16b40 20 3d 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 3b   = iChangeCount;
16b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16b60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
16b70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
16b80 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
16b90 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
16ba0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
16bb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
16bc0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
16bd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16be0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
16bf0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
16c00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
16c10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
16c20 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
16c30 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
16c40 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
16c50 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
16c60 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
16c70 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
16c80 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
16c90 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
16ca0 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
16cb0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f  eased..**.** A _
16cc0 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  get works for an
16cd0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
16ce0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
16cf0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
16d00 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
16d10 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
16d20 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
16d30 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
16d40 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
16d50 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
16d60 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
16d70 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
16d80 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
16d90 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
16da0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
16db0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
16dc0 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
16dd0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
16de0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
16df0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
16e00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
16e10 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
16e20 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
16e30 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
16e40 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
16e50 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
16e60 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
16e70 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
16e80 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
16e90 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
16ea0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
16eb0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
16ec0 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
16ed0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
16ee0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
16ef0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
16f00 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
16f10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
16f20 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
16f30 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
16f40 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
16f50 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
16f60 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
16f70 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
16f80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
16f90 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
16fa0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
16fb0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
16fc0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
16fd0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
16fe0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
16ff0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
17000 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
17010 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
17020 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
17030 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
17040 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
17050 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
17060 2a 20 49 66 20 63 6c 72 46 6c 61 67 20 69 73 20  * If clrFlag is 
17070 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20  false, the page 
17080 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74  contents are act
17090 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
170a0 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46  disk..** If clfF
170b0 6c 61 67 20 69 73 20 74 72 75 65 2c 20 69 74 20  lag is true, it 
170c0 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
170d0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 65 72  s about to be er
170e0 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72  ased and.** rewr
170f0 69 74 74 65 6e 20 77 69 74 68 6f 75 74 20 66 69  itten without fi
17100 72 73 74 20 62 65 69 6e 67 20 72 65 61 64 20 73  rst being read s
17110 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  o there is no po
17120 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20  int it doing.** 
17130 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f  the disk I/O..*/
17140 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
17150 72 41 63 71 75 69 72 65 28 50 61 67 65 72 20 2a  rAcquire(Pager *
17160 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
17170 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  o, DbPage **ppPa
17180 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29  ge, int clrFlag)
17190 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
171a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
171b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
171c0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
171d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
171e0 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
171f0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
17200 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
17210 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
17220 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
17230 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
17240 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
17250 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
17260 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
17270 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
17280 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
17290 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
172a0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
172b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
172c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
172d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
172e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
172f0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
17300 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
17310 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
17320 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
17330 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
17340 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
17350 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
17360 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
17370 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
17380 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
17390 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
173a0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
173b0 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
173c0 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
173d0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
173e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
173f0 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
17400 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
17410 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
17420 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
17430 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
17440 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
17450 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
17460 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17470 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17480 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
17490 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
174a0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
174b0 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
174c0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
174d0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
174e0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
174f0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
17500 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
17510 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
17520 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45     int h;.    TE
17530 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
17540 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20  nMiss);.    if( 
17550 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
17560 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
17570 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
17580 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20 20  0 || MEMDB ||.  
17590 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 70        (pPager->p
175a0 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26  FirstSynced==0 &
175b0 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  & pPager->doNotS
175c0 79 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ync).    ){.    
175d0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
175e0 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  w page */.      
175f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
17600 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
17610 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
17620 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61  r_resize_hash_ta
17630 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20  ble(pPager,.    
17640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
17650 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
17660 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
17670 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
17680 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20  Pager->nHash==0 
17690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
176a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
176b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
176c0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20    }.      pPg = 
176d0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
176e0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
176f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
17720 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
17730 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
17760 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
17770 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
17780 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
17790 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
177a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
177b0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
177c0 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
177d0 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
177e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
177f0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
17800 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
17810 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67  r), 0, sizeof(Pg
17820 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20  History));.     
17830 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
17840 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
17850 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41       pPg->pNextA
17860 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
17870 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  l;.      pPager-
17880 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
17890 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
178a0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ++;.      if( pP
178b0 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67  ager->nPage>pPag
178c0 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a  er->nMaxPage ){.
178d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
178e0 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
178f0 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  ==(pPager->nPage
17900 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  -1) );.        p
17910 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b  Pager->nMaxPage+
17920 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
17930 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
17940 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
17950 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b  Pager, 1, &pPg);
17960 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17980 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
179a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
179b0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
179c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
179d0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
179e0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
179f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17a00 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
17a10 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
17a20 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
17a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
17a40 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
17a50 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
17a60 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
17a70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
17a80 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
17a90 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
17aa0 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
17ab0 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
17ac0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
17ad0 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
17ae0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
17af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
17b00 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
17b10 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
17b20 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
17b30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17b40 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  >aInStmt && (int
17b50 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
17b60 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20  tmtSize.        
17b70 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
17b80 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d  >aInStmt[pgno/8]
17b90 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
17ba0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  )!=0 ){.      pa
17bb0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
17bc0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ist(pPg);.    }e
17bd0 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  lse{.      page_
17be0 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
17bf0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
17c00 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  }.    makeClean(
17c10 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  pPg);.    pPg->n
17c20 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
17c30 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20  INFO(pPg);..    
17c40 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
17c50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17c60 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
17c70 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17c80 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
17c90 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
17ca0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
17cb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17cc0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
17cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
17ce0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
17cf0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
17d00 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ode;.      retur
17d10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
17d20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
17d30 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c   page with data,
17d40 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69   either by readi
17d50 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
17d60 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
17d70 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20  , or by setting 
17d80 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20  the entire page 
17d90 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  to zero..    */.
17da0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
17db0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
17dc0 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20  ager)<(int)pgno 
17dd0 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 20 20 20 20  || MEMDB.       
17de0 20 20 7c 7c 20 28 63 6c 72 46 6c 61 67 20 26 26    || (clrFlag &&
17df0 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
17e00 52 6f 6c 6c 62 61 63 6b 29 20 0a 20 20 20 20 29  Rollback) .    )
17e10 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
17e20 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17e30 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
17e40 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  geSize);.    }el
17e50 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
17e60 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
17e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17e80 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
17e90 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
17ea0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
17eb0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
17ec0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17ed0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17ee0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
17ef0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
17f00 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20  ATA(pPg),.      
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17f30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
17f40 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45   }.      IOTRACE
17f50 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
17f60 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
17f70 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46  .      TRACE3("F
17f80 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
17f90 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17fa0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
17fb0 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50  .      CODEC1(pP
17fc0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
17fd0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
17fe0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
17ff0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18000 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
18010 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
18020 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
18030 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  pgno = 0;.      
18040 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
18050 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
18060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18080 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
18090 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20  er->nRead);.    
180a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
180b0 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
180c0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
180d0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
180e0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
180f0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
18100 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
18110 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
18120 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
18130 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
18140 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
18150 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
18160 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
18170 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18180 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
18190 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
181a0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
181b0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
181c0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
181d0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
181e0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
181f0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
18200 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
18210 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
18220 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
18230 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
18240 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
18250 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
18260 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
18270 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 54   pgno==1);.    T
18280 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
18290 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65  >nHit);.    page
182a0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
182b0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
182c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
182d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
182e0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
182f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
18300 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
18310 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
18320 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
18330 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
18340 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18350 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
18360 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
18370 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
18380 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
18390 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
183a0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
183b0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
183c0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
183d0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
183e0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
183f0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
18400 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
18410 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
18420 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18430 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
18440 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
18450 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
18460 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
18470 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
18480 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
18490 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
184a0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
184b0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
184c0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
184d0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
184e0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
184f0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
18500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
18510 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
18520 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18530 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
18540 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
18550 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67  er->pAll || pPag
18560 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
18570 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
18580 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
18590 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
185a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
185b0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
185c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
185d0 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
185e0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
185f0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
18600 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
18610 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
18620 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
18630 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
18640 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
18650 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
18660 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
18670 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
18680 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
18690 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
186a0 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
186b0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
186c0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
186d0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
186e0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
186f0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
18700 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18710 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
18720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
18730 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
18740 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72  pPg){..  /* Decr
18750 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
18760 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68  nce count for th
18770 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61  is page.  */.  a
18780 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
18790 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  >0 );.  pPg->nRe
187a0 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
187b0 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  Pg);..  CHECK_PA
187c0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
187d0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
187e0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
187f0 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
18800 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
18810 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
18820 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
18830 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
18840 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
18850 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
18860 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
18870 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
18880 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
18890 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
188a0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
188b0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
188c0 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
188d0 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
188e0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
188f0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
18900 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
18910 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
18920 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
18930 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
18940 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
18950 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
18960 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
18970 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
18980 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
18990 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
189a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
189b0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
189c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
189d0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50  ->xDestructor(pP
189e0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
189f0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
18a00 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
18a10 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
18a20 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
18a30 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
18a40 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
18a50 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
18a60 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
18a70 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
18a80 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
18a90 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
18aa0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
18ab0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
18ac0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
18ad0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
18ae0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
18af0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18b10 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
18b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
18b30 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
18b40 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
18b50 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
18b60 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
18b70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
18b80 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
18b90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18ba0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
18bb0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
18bc0 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
18bd0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
18be0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
18bf0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
18c00 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
18c10 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
18c20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
18c30 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
18c40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
18c50 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
18c60 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
18c70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
18c80 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
18c90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18ca0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
18cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
18cc0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
18cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
18ce0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18cf0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
18d00 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
18d10 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
18d20 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
18d30 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
18d40 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
18d50 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
18d60 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
18d70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
18d80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
18d90 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
18da0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
18db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18dc0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
18dd0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
18de0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  &pPager->jfd,.  
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18e10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
18e20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
18e30 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
18e40 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
18e50 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
18e60 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
18e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18e80 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
18e90 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
18ea0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  urnal;.  }.  sql
18eb0 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
18ec0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
18ed0 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
18ee0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53  c);.  sqlite3OsS
18ef0 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
18f00 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  r->fd, pPager->f
18f10 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71  ull_fsync);.  sq
18f20 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
18f30 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  tory(pPager->jfd
18f40 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  , pPager->zDirec
18f50 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d  tory);.  pPager-
18f60 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
18f70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
18f80 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
18f90 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
18fa0 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
18fb0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
18fc0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
18fd0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
18fe0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
18ff0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
19000 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
19010 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
19020 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
19030 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
19040 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
19050 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
19060 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
19070 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
19080 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
19090 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
190a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
190b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
190c0 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
190d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
190e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
190f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
19100 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
19110 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
19120 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
19130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19140 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19150 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
19160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61    return rc;..fa
19170 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
19180 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72  rnal:.  sqliteFr
19190 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
191a0 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
191b0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
191c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
191d0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
191e0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
191f0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
19200 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  e, then we will 
19210 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67 20 74  not be closing t
19220 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
19230 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65 20  file. So delete 
19240 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
19250 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a 75 73   we may have jus
19260 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68 65 72  t created. Other
19270 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  wise,.    ** the
19280 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67 65 74   system will get
19290 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20 68 61   confused, we ha
192a0 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  ve a read-lock o
192b0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 61  n the file and a
192c0 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f  .    ** mysterio
192d0 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  us journal has a
192e0 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 66  ppeared in the f
192f0 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a  ilesystem..    *
19300 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  /.    sqlite3OsD
19310 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
19320 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  ournal);.  }else
19330 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
19340 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
19350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19360 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
19370 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
19380 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
19390 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
193a0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
193b0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
193c0 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
193d0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
193e0 43 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  Commit() is call
193f0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
19400 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
19410 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
19420 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
19430 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
19440 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
19450 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
19460 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
19470 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
19480 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
19490 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
194a0 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
194b0 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
194c0 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
194d0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
194e0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
194f0 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
19500 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
19510 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
19520 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
19530 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
19540 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
19550 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
19560 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
19570 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
19580 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
19590 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
195a0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
195b0 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
195c0 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
195d0 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
195e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
195f0 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
19600 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
19610 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
19620 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
19630 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
19640 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
19650 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
19660 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
19670 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
19680 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
19690 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
196a0 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
196b0 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
196c0 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
196d0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
196e0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
196f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
19700 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
19710 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
19720 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19730 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
19740 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
19750 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
19760 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
19770 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
19780 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
19790 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
197a0 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
197b0 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
197c0 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
197d0 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
197e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
197f0 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
19800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19810 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
19820 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
19830 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
19840 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
19850 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
19860 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
19870 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
19880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19890 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
198a0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
198b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
198c0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
198d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
198e0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
198f0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
19900 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
19910 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
19920 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
19930 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
19940 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
19950 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
19960 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
19970 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
19980 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
19990 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
199a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
199b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
199c0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
199d0 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
199e0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
199f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
19a00 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
19a10 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
19a20 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19a40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19a50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19a70 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
19a80 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
19a90 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  0;.      TRACE2(
19aa0 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
19ab0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19ac0 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  er));.      if( 
19ad0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
19ae0 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
19af0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
19b00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
19b10 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
19b20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
19b30 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  }.  }else if( pP
19b40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
19b50 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n && pPager->jou
19b60 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
19b70 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
19b80 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  s when the pager
19b90 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76   was in exclusiv
19ba0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61  e-access mode la
19bb0 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61  st.    ** time a
19bc0 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29   (read or write)
19bd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
19be0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
19bf0 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62  ncluded.    ** b
19c00 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  y this connectio
19c10 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65  n. Instead of de
19c20 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
19c30 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a  al file it was .
19c40 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e      ** kept open
19c50 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74   and truncated t
19c60 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a  o 0 bytes..    *
19c70 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
19c80 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
19c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19ca0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
19cb0 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
19cc0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
19cd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
19ce0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
19cf0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
19d00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
19d10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
19d20 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
19d30 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
19d40 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
19d50 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->aInJournal ){.
19d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19d70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
19d80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
19d90 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
19da0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
19db0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
19dc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19dd0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
19de0 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
19df0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
19e00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19e10 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
19e20 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
19e30 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
19e40 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
19e50 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
19e60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
19e70 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
19e80 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
19e90 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
19ea0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
19eb0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
19ec0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
19ed0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
19ee0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
19ef0 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
19f00 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
19f10 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
19f20 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
19f30 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
19f40 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
19f50 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
19f60 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
19f70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
19f80 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
19f90 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
19fa0 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
19fb0 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
19fc0 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
19fd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
19fe0 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
19ff0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1a000 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
1a010 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1a020 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
1a030 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1a040 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
1a050 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
1a060 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
1a070 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
1a080 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1a090 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
1a0a0 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1a0b0 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1a0c0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
1a0d0 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1a0e0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
1a0f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
1a100 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
1a110 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
1a120 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1a130 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1a140 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
1a150 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
1a160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
1a170 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
1a180 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
1a190 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
1a1a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1a1b0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1a1c0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1a1d0 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
1a1e0 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
1a1f0 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
1a200 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1a210 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1a220 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
1a230 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
1a240 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
1a250 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1a260 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
1a270 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1a280 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
1a290 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
1a2a0 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
1a2b0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
1a2c0 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
1a2d0 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
1a2e0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1a2f0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1a300 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1a310 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
1a320 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
1a330 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
1a340 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
1a350 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1a360 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
1a370 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
1a380 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
1a390 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
1a3a0 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
1a3b0 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
1a3c0 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
1a3d0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
1a3e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
1a3f0 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
1a400 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1a410 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
1a420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a430 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
1a440 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
1a450 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
1a460 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
1a470 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1a480 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1a490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a4a0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1a4b0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1a4c0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1a4d0 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1a4e0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1a4f0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1a500 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1a510 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a520 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1a530 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1a540 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1a550 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1a560 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
1a570 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
1a580 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
1a590 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1a5a0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
1a5b0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
1a5c0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
1a5d0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
1a5e0 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
1a5f0 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
1a600 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e  rnal && (pPg->in
1a610 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Stmt || pPager->
1a620 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  stmtInUse==0) ){
1a630 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1a640 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d  tyCache = 1;.  }
1a650 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
1a660 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
1a670 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1a680 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
1a690 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
1a6a0 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
1a6b0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
1a6c0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
1a6d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1a6e0 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
1a6f0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
1a700 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
1a710 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1a720 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
1a730 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
1a740 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
1a750 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1a760 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a770 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1a780 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
1a790 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1a7a0 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pPg, 0);.    if(
1a7b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a7c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1a7d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
1a7e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a7f0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1a800 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
1a810 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a820 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
1a830 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
1a840 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
1a850 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
1a860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1a880 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1a890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a8a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
1a8b0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
1a8c0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
1a8d0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1a8e0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
1a8f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1a900 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
1a910 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
1a920 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
1a930 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1a940 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
1a950 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1a960 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
1a970 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
1a980 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a990 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
1a9a0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
1a9b0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
1a9c0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
1a9d0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
1a9e0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
1a9f0 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
1aa00 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
1aa10 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
1aa20 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
1aa30 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
1aa40 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1aa50 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
1aa60 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1aa70 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1aa80 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1aa90 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
1aaa0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1aab0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1aac0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1aad0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1aae0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
1aaf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1ab00 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
1ab10 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
1ab20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ab30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ab40 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1ab50 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1ab60 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
1ab70 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1ab80 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1ab90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1aba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1abb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
1abc0 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
1abd0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1abe0 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
1abf0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
1ac00 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
1ac10 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1ac20 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
1ac30 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1ac40 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
1ac50 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
1ac60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1ac70 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
1ac80 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1ac90 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
1aca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1acb0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
1acc0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1acd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
1ace0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1acf0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1ad00 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1ad10 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
1ad20 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
1ad30 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
1ad40 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
1ad50 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
1ad60 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
1ad70 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
1ad80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
1ad90 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
1ada0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
1adb0 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
1adc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
1add0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
1ade0 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
1adf0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1ae00 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1ae10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ae20 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1ae30 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
1ae40 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  2, szPg);.      
1ae50 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
1ae60 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
1ae70 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1ae80 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
1ae90 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1aea0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73  r->journalOff, s
1aeb0 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20 20 20  zPg)).          
1aec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1aed0 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1aee0 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f        TRACE4("JO
1aef0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1af00 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1af10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1af30 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1af40 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1af50 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
1af60 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09  pEnd = saved;...
1af70 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1af80 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1af90 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1afa0 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1afb0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1afc0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
1afd0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
1afe0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
1aff0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b000 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b020 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b030 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1b040 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1b050 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
1b060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b070 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1b080 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1b090 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1b0a0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1b0b0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1b0c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1b0d0 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1b0e0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1b0f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1b100 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1b110 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1b120 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1b130 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1b140 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1b150 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64           page_ad
1b160 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1b170 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Pg);.          }
1b180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b1a0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1b1b0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1b1c0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1b1d0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1b1e0 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45      TRACE4("APPE
1b1f0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
1b200 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1b220 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1b230 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1b240 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
1b250 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
1b260 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1b270 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1b280 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1b290 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e   }.      pPg->in
1b2a0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1b2b0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
1b2c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1b2d0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
1b2e0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
1b2f0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
1b300 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
1b310 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
1b320 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1b330 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
1b340 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
1b350 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
1b360 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
1b370 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
1b380 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
1b390 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
1b3a0 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
1b3b0 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
1b3c0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
1b3d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1b3e0 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
1b3f0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
1b400 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1b410 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
1b420 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1b430 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1b440 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1b450 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1b460 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1b470 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1b480 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1b490 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1b4a0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1b4b0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1b4c0 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
1b4d0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1b4e0 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1b4f0 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
1b500 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1b510 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1b520 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1b530 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
1b540 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
1b550 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1b560 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52      }.        TR
1b580 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
1b590 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1b5a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b5b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1b5c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b5d0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1b5e0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1b5f0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1b600 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20  no, 7)-4;.      
1b610 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1b620 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1b630 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b640 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1b650 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
1b660 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b670 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54  ze+4);.        T
1b680 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1b690 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1b6a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1b6b0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1b6c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b6e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b6f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b700 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1b710 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  NRec++;.        
1b720 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b730 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
1b740 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1b750 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1b760 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1b770 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a  gno&7);.      }.
1b780 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1b790 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1b7a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1b7b0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1b7c0 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1b7d0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1b7e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1b7f0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1b800 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1b810 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
1b820 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
1b830 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1b840 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1b850 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
1b860 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
1b870 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
1b880 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
1b890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1b8a0 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
1b8b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b8c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1b8d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1b8e0 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
1b8f0 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
1b900 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
1b910 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
1b920 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
1b930 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1b940 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
1b950 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
1b960 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
1b970 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
1b980 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1b990 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
1b9a0 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
1b9b0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
1b9c0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
1b9d0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
1b9e0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
1b9f0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
1ba00 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
1ba10 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1ba20 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
1ba30 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
1ba40 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
1ba50 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1ba60 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
1ba70 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
1ba80 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
1ba90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1baa0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
1bab0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1bac0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
1bad0 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1bae0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1baf0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1bb00 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
1bb10 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
1bb20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
1bb30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1bb40 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26  .  if( !MEMDB &&
1bb50 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
1bb60 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
1bb70 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
1bb80 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1bb90 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
1bba0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1bbb0 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbd0 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
1bbe0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
1bbf0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
1bc00 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20      int nPage;  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1bc30 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
1bc40 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1bc50 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20     int ii;..    
1bc60 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
1bc70 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
1bc80 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
1bc90 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
1bca0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
1bcb0 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
1bcc0 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
1bcd0 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
1bce0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1bcf0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
1bd00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1bd10 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1bd20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1bd30 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
1bd40 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
1bd50 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
1bd60 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
1bd70 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
1bd80 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
1bd90 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
1bda0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
1bdb0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
1bdc0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
1bdd0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1bde0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1bdf0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
1be00 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
1be10 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
1be20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
1be30 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
1be40 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71   nPageCount = sq
1be50 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1be60 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1be70 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
1be80 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1be90 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
1bea0 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
1beb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1bec0 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
1bed0 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
1bee0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1bef0 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
1bf00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1bf10 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1bf20 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
1bf30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
1bf40 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
1bf50 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
1bf60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
1bf70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
1bf80 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
1bf90 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
1bfa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1bfb0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
1bfc0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
1bfd0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1bfe0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->aInJournal || 
1bff0 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
1c000 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e 70   .          pg>p
1c010 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c020 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61  e || !(pPager->a
1c030 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26  InJournal[pg/8]&
1c040 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20  (1<<(pg&7))).   
1c050 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69     ) {.        i
1c060 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
1c070 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1c080 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20            PgHdr 
1c090 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  *pPage;.        
1c0a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c0b0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
1c0c0 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
1c0d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c0e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c0f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1c100 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1c110 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1c120 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1c130 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1c140 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1c150 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
1c160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1c170 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
1c180 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1c190 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
1c1a0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1c1b0 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
1c1c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c1d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1c1e0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
1c1f0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
1c200 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
1c210 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
1c220 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
1c230 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
1c240 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
1c250 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
1c260 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
1c270 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1c280 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
1c290 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
1c2a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1c2b0 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
1c2c0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
1c2d0 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e  Pg->dirty;.}.#en
1c2e0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1c2f0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
1c300 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
1c310 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
1c320 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
1c330 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1c340 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
1c350 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
1c360 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65   sqlite3PagerOve
1c370 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
1c380 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
1c390 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
1c3a0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
1c3b0 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
1c3c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1c3d0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
1c3e0 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  g);.  if( rc==SQ
1c3f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c400 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c410 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
1c420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c430 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
1c440 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  y(sqlite3PagerGe
1c450 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61 74  tData(pPg), pDat
1c460 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
1c470 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
1c480 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c490 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  f(pPg);.  }.  re
1c4a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1c4b0 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
1c4c0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1c4d0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
1c4e0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
1c4f0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
1c500 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
1c510 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67  tion on page "pg
1c520 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20  no" back to the 
1c530 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
1c540 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
1c550 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
1c560 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
1c570 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
1c580 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
1c590 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1c5a0 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
1c5b0 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
1c5c0 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
1c5d0 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
1c5e0 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
1c5f0 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
1c600 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
1c610 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
1c620 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
1c630 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
1c640 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
1c650 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
1c660 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1c670 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
1c680 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1c690 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1c6a0 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1c6b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1c6c0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1c6d0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1c6e0 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1c6f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c700 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1c710 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1c720 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1c730 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1c740 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
1c750 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1c760 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
1c770 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
1c780 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
1c790 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1c7a0 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
1c7b0 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
1c7c0 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
1c7d0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1c7e0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1c7f0 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
1c800 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
1c810 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
1c820 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1c830 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
1c840 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
1c850 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1c860 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
1c870 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
1c880 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
1c890 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
1c8a0 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
1c8b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1c8c0 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
1c8d0 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c  .** the dont_rol
1c8e0 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
1c8f0 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
1c900 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
1c910 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69   contains.** cri
1c920 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
1c930 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
1c940 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c  sure it gets rol
1c950 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
1c960 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74  e.** of the dont
1c970 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  _rollback() call
1c980 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c990 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1c9a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1c9b0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1c9c0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
1c9d0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
1c9e0 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1c9f0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1ca00 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
1ca10 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20  Pg!=0 );  /* We 
1ca20 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74  never call _dont
1ca30 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68  _write unless th
1ca40 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d  e page is in mem
1ca50 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79   */.  pPg->alway
1ca60 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1ca70 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1ca80 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1ca90 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1caa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1cab0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1cac0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1cad0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1cae0 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1caf0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1cb00 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1cb10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1cb20 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1cb30 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1cb40 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1cb50 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1cb60 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1cb70 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1cb80 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1cb90 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1cba0 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1cbb0 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1cbc0 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1cbd0 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1cbe0 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1cbf0 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1cc00 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1cc10 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1cc20 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1cc30 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1cc40 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1cc50 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1cc60 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1cc70 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1cc80 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1cc90 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1cca0 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1ccb0 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1ccc0 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1ccd0 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1cce0 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1ccf0 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1cd00 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1cd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
1cd20 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
1cd30 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1cd40 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  ", pgno, PAGERID
1cd50 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1cd60 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
1cd70 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cd80 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  r, pgno)).      
1cd90 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1cda0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1cdb0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
1cdc0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
1cdd0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cde0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
1cdf0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1ce00 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
1ce10 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
1ce20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
1ce30 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
1ce40 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
1ce50 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
1ce60 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
1ce70 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
1ce80 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
1ce90 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
1cea0 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
1ceb0 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
1cec0 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
1ced0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1cee0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1cef0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1cf00 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1cf10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1cf20 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
1cf30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cf40 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1cf50 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
1cf60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cf70 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
1cf80 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
1cf90 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
1cfa0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1cfb0 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20  back || MEMDB ) 
1cfc0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
1cfd0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1cfe0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1cff0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
1d000 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
1d010 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1d020 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1d030 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1d040 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1d050 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1d060 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
1d070 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1d080 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1d090 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1d0a0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1d0b0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1d0c0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1d0d0 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
1d0e0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1d0f0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
1d100 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
1d110 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
1d120 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1d130 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1d140 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  r));.    IOTRACE
1d150 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64  (("GARBAGE %p %d
1d160 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1d170 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69  ->pgno)).  }.  i
1d180 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1d190 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
1d1a0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
1d1b0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1d1c0 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
1d1d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1d1e0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1d1f0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1d200 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1d210 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d220 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1d230 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1d240 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1d250 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1d260 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
1d270 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1d280 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  (pPg);.  }.}.../
1d290 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
1d2a0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1d2b0 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
1d2c0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1d2d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1d2e0 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
1d2f0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
1d300 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
1d310 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
1d320 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1d330 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
1d340 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
1d350 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
1d360 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1d370 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
1d380 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
1d390 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1d3a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1d3b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1d3c0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
1d3d0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1d3e0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1d3f0 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
1d400 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
1d410 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d420 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
1d430 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
1d440 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1d450 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1d460 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
1d470 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1d480 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1d490 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
1d4a0 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  ){.      clearHi
1d4b0 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
1d4c0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1d4d0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
1d4e0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1d4f0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1d500 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
1d510 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d520 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1d530 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1d540 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1d550 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1d560 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
1d570 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
1d580 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1d590 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
1d5a0 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
1d5b0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
1d5c0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1d5d0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
1d5e0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1d5f0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1d600 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1d610 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
1d620 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
1d630 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d640 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
1d650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1d660 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
1d670 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d680 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1d690 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1d6a0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
1d6b0 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
1d6c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d6d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69    if( pPager->di
1d6e0 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  rtyCache==0 ){. 
1d6f0 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79     /* Exit early
1d700 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20   (without doing 
1d710 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69  the time-consumi
1d720 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  ng sqlite3OsSync
1d730 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a  () calls).    **
1d740 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62   if there have b
1d750 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
1d760 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d770 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
1d780 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
1d790 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Sync==0 );.    r
1d7a0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
1d7b0 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
1d7c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d7d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1d7e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d7f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1d800 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1d810 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  r, 0, 0);.  if( 
1d820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d830 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d840 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
1d850 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1d860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1d870 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
1d880 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
1d890 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
1d8a0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
1d8b0 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
1d8c0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
1d8d0 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
1d8e0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
1d8f0 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
1d900 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
1d910 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1d920 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1d930 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
1d940 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1d950 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
1d960 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
1d970 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53  king protocol (S
1d980 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20  QLITE_PROTOCOL) 
1d990 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
1d9a0 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
1d9b0 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
1d9c0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1d9d0 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
1d9e0 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
1d9f0 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
1da00 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
1da10 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
1da20 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
1da30 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
1da40 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
1da50 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
1da60 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
1da70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1da80 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
1da90 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1daa0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1dab0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41  .  int rc;.  TRA
1dac0 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
1dad0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1dae0 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1daf0 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
1db00 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
1db10 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
1db20 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
1db30 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1db40 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
1db50 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
1db60 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
1db70 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
1db80 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1db90 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
1dba0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
1dbb0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
1dbc0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
1dbd0 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
1dbe0 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
1dbf0 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
1dc00 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
1dc10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1dc20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
1dc30 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1dc40 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1dc50 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
1dc60 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
1dc70 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
1dc80 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
1dc90 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
1dca0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54  Size);.        T
1dcb0 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
1dcc0 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
1dcd0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1dce0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1dcf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dd00 20 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25    TRACE3("PAGE %
1dd10 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64  d is clean on %d
1dd20 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
1dd30 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1dd40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
1dd50 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
1dd60 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
1dd70 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
1dd80 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1dd90 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d       p->inStmt =
1dda0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   0;.      p->pPr
1ddb0 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78  evStmt = p->pNex
1ddc0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
1ddd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
1dde0 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
1ddf0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1de00 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70  ter(p, pPager->p
1de10 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1de20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
1de30 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
1de40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1de50 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
1de60 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1de70 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a  er->origDbSize;.
1de80 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
1de90 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
1dea0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1deb0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
1dec0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1ded0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
1dee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1def0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1df00 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
1df10 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1df20 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
1df30 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1df40 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1df50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1df60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1df70 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1df80 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1df90 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
1dfa0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1dfb0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
1dfc0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1dfd0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
1dfe0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
1dff0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1e000 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1e010 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1e020 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1e030 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
1e040 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1e050 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
1e060 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
1e070 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1e080 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1e090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e0a0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
1e0b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1e0c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1e0d0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
1e0e0 30 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  0);.  }.  pPager
1e0f0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
1e100 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
1e110 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
1e120 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
1e130 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
1e140 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
1e150 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
1e160 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
1e170 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
1e180 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
1e190 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
1e1a0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
1e1b0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1e1c0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
1e1d0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1e1e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e1f0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
1e200 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
1e210 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
1e220 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
1e230 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
1e240 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1e250 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
1e260 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e270 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1e280 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
1e290 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1e2a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
1e2b0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
1e2c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1e2d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
1e2e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1e2f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52  eturn pPager->nR
1e300 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ef;.}..#ifdef SQ
1e310 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
1e320 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e330 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
1e340 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
1e350 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
1e360 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
1e370 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1e380 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
1e390 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
1e3a0 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
1e3b0 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
1e3c0 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
1e3d0 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
1e3e0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1e3f0 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
1e400 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
1e410 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
1e420 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
1e430 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
1e440 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
1e450 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
1e460 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b  ger->nOvfl;.  a[
1e470 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
1e480 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
1e490 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
1e4a0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
1e4b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  if../*.** Set th
1e4c0 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
1e4d0 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
1e4e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1e4f0 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
1e500 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
1e510 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
1e520 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
1e530 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
1e540 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
1e550 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
1e560 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
1e570 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
1e580 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
1e590 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
1e5a0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
1e5b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e5c0 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
1e5d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e5e0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1e5f0 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
1e600 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
1e610 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1e620 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1e630 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e640 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20  >dbSize>=0 );.  
1e650 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
1e660 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
1e670 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1e680 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1e690 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1e6a0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1e6b0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
1e6c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1e6d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e6e0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
1e6f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1e700 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
1e710 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1e720 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1e730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1e740 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1e750 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1e760 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1e770 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1e780 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1e790 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
1e7a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
1e7b0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
1e7c0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1e7d0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
1e7e0 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
1e7f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1e800 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1e810 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
1e820 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1e830 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
1e840 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
1e850 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
1e860 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
1e870 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e880 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70  ->stmtJSize == p
1e890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1e8a0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  f );.#endif.  pP
1e8b0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1e8c0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1e8d0 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
1e8e0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1e8f0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
1e900 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
1e910 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
1e920 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
1e930 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
1e940 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
1e950 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
1e960 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1e970 65 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e  entemp(&pPager->
1e980 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
1e990 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
1e9a0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
1e9b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1e9c0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1e9d0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1e9e0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1e9f0 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
1ea00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ea10 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
1ea20 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
1ea30 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
1ea40 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
1ea50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
1ea60 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1ea70 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
1ea80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ea90 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
1eaa0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1eab0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
1eac0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1ead0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1eae0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1eaf0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
1eb00 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43  *pNext;.    TRAC
1eb10 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
1eb20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1eb30 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1eb40 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
1eb50 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
1eb60 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
1eb70 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
1eb80 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
1eb90 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
1eba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
1ebb0 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  e( pPager->aInSt
1ebc0 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  mt );.      pPag
1ebd0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
1ebe0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1ebf0 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
1ec00 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
1ec10 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
1ec20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
1ec30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ec40 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  Pg->inStmt );.  
1ec50 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
1ec60 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1ec70 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
1ec80 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1ec90 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1eca0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1ecb0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1ecc0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1ecd0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1ece0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
1ecf0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
1ed00 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1ed10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1ed20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1ed30 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1ed40 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1ed50 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
1ed60 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1ed70 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1ed80 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
1ed90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eda0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
1edb0 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
1edc0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1edd0 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
1ede0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1edf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1ee00 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1ee10 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43  nUse ){.    TRAC
1ee20 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
1ee30 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1ee40 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
1ee50 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1ee60 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1ee70 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1ee80 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
1ee90 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74  pPg=pPg->pNextSt
1eea0 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  mt){.        PgH
1eeb0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1eec0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1eed0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1eee0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
1eef0 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
1ef00 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
1ef10 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
1ef20 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
1ef30 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1ef40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
1ef50 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
1ef60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1ef70 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
1ef80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ef90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1efa0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
1efb0 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d  tmtSize;.      m
1efc0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
1efd0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1efe0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1eff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f000 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
1f010 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
1f020 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f030 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
1f040 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
1f050 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1f060 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
1f070 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1f080 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1f090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1f0a0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
1f0b0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
1f0c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1f0d0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1f0e0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
1f0f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f100 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1f110 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
1f120 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f130 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
1f140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1f150 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1f160 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
1f170 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1f180 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1f190 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
1f1a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f1b0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1f1c0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1f1d0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1f1e0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
1f1f0 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
1f200 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f210 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1f220 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
1f230 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1f240 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
1f250 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
1f260 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
1f270 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
1f280 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
1f290 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
1f2a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1f2b0 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
1f2c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1f2d0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
1f2e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
1f2f0 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
1f300 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
1f310 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1f320 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
1f330 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
1f340 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
1f350 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
1f360 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
1f370 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
1f380 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
1f390 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
1f3a0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
1f3b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f3c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f3d0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1f3e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f3f0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1f400 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1f410 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1f420 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1f430 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1f440 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1f450 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f460 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
1f470 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
1f480 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  unter;.  int rc;
1f490 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1f4a0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1f4b0 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
1f4c0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
1f4d0 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
1f4e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1f4f0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
1f500 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
1f510 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f520 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1f530 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
1f540 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f550 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
1f560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f570 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20  return rc;.  .  
1f580 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75    /* Read the cu
1f590 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62  rrent value at b
1f5a0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63  yte 24. */.    c
1f5b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1f5c0 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70  retrieve32bits(p
1f5d0 50 67 48 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20  PgHdr, 24);.  . 
1f5e0 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
1f5f0 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1f600 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1f610 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1f620 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
1f630 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70  counter++;.    p
1f640 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1f650 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
1f660 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e  PgHdr))+24, chan
1f670 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20  ge_counter);.   
1f680 20 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65   pPager->iChange
1f690 43 6f 75 6e 74 20 3d 20 63 68 61 6e 67 65 5f 63  Count = change_c
1f6a0 6f 75 6e 74 65 72 3b 0a 20 20 0a 20 20 20 20 2f  ounter;.  .    /
1f6b0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1f6c0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1f6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1f6e0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
1f6f0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
1f700 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
1f710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f720 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f730 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1f740 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1f750 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1f760 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1f770 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1f780 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1f790 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1f7a0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1f7b0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1f7c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1f7d0 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1f7e0 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1f7f0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1f800 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1f810 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1f820 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1f830 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1f840 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1f850 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1f860 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1f870 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1f880 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1f890 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1f8a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f8b0 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1f8c0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1f8d0 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1f8e0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1f8f0 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1f900 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f910 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1f920 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1f930 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1f940 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1f950 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1f960 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1f970 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1f980 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1f990 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
1f9a0 65 72 53 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  erSync() call..*
1f9b0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1f9c0 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
1f9d0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
1f9e0 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
1f9f0 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
1fa00 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
1fa10 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
1fa20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1fa30 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1fa40 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
1fa50 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
1fa60 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50  char *zMaster, P
1fa70 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69  gno nTrunc){.  i
1fa80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fa90 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41  K;..  TRACE4("DA
1faa0 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
1fab0 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
1fac0 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
1fad0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
1fae0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
1faf0 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20   nTrunc);..  /* 
1fb00 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1fb10 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
1fb20 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
1fb30 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
1fb40 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1fb50 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1fb60 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
1fb70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1fb80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1fb90 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
1fba0 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
1fbb0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1fbc0 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
1fbd0 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
1fbe0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1fbf0 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a  lOpen );..    /*
1fc00 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1fc10 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1fc20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fc30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1fc40 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1fc50 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1fc60 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1fc70 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1fc80 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1fc90 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1fca0 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1fcb0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1fcc0 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1fcd0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1fce0 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1fcf0 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1fd00 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1fd10 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1fd20 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1fd30 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1fd40 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1fd50 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1fd60 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1fd70 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1fd80 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1fd90 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1fda0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1fdb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fdc0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
1fdd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fde0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fdf0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1fe00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1fe10 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1fe20 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1fe30 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1fe40 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1fe50 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
1fe60 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1fe70 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1fe80 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1fe90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1fea0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
1feb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1fec0 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1fed0 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
1fee0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1fef0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
1ff00 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1ff10 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1ff20 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1ff30 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1ff40 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1ff50 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1ff60 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1ff70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1ff80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1ff90 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1ffa0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
1ffb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ffc0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1ffd0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1ffe0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fff0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
20000 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20010 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
20020 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20040 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
20050 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20060 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a       } .      }.
20070 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
20080 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
20090 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
200a0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
200b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
200c0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
200d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
200e0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
200f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20100 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20110 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
20120 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20130 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20140 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21  .    if( nTrunc!
20150 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
20160 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
20170 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
20180 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
20190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
201a0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
201b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
201c0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
201d0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
201e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
201f0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
20200 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
20210 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
20220 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20230 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
20240 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
20250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20260 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20  o sync_exit;..  
20270 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
20280 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
20290 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
202a0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
202b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
202c0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
202d0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  0);.    }.    IO
202e0 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
202f0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
20300 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20310 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
20320 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
20330 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
20340 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20350 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
20360 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
20370 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
20380 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
20390 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
203a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
203b0 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
203c0 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
203d0 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63   by pData to loc
203e0 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
203f0 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  e file. .**.** T
20400 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
20410 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20420 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 70  e current page p
20430 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20  gno. If current 
20440 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20  page.** pgno is 
20450 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74  not already in t
20460 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
20470 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77  nal, it is not w
20480 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a  ritten there by.
20490 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ** by this routi
204a0 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70  ne. The same app
204b0 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  lies to the page
204c0 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74 6f   pData refers to
204d0 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20   on entry to.** 
204e0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
204f0 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
20500 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  o the page refer
20510 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20 72  ed to by pData r
20520 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
20530 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
20540 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
20550 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61 74  d with page pDat
20560 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  a (i.e. data sto
20570 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
20580 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
20590 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
205a0 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
205b0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
205c0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
205d0 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
205e0 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
205f0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
20600 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
20610 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
20620 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
20630 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
20640 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
20650 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
20660 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
20670 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
20680 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
20690 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
206a0 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
206b0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
206c0 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f  n is active)..*/
206d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
206e0 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
206f0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
20700 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
20710 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
20720 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50  d; .  int h;.  P
20730 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
20740 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
20750 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
20760 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20  .  TRACE5("MOVE 
20770 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
20780 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
20790 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
207a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
207b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
207c0 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
207d0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
207e0 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
207f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
20800 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28  o, pgno))..  if(
20810 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
20820 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
20830 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
20840 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
20850 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
20860 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
20870 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65  irty );.    asse
20880 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
20890 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
208a0 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
208b0 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69  m it's hash-chai
208c0 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
208d0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
208e0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
208f0 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
20900 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
20910 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
20920 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
20930 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
20940 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
20950 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
20960 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
20970 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
20980 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
20990 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
209a0 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
209b0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
209c0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
209d0 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d  .  */.  pPgOld =
209e0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
209f0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
20a00 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
20a10 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
20a20 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
20a30 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
20a40 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
20a50 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
20a60 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  PgOld);.    if( 
20a70 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
20a80 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20a90 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72  ( pPgOld->inJour
20aa0 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67  nal );.      pPg
20ab0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
20ac0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
20ad0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
20ae0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20af0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
20b00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e  }.  }..  /* Chan
20b10 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
20b20 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
20b30 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
20b40 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
20b50 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
20b60 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
20b70 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
20b80 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
20b90 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
20ba0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
20bb0 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
20bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
20bd0 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
20be0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
20bf0 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
20c00 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
20c10 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
20c20 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
20c30 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
20c40 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
20c50 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
20c60 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
20c70 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
20c80 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
20c90 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
20ca0 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
20cb0 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
20cc0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
20cd0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
20ce0 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
20cf0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
20d00 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
20d10 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
20d20 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
20d30 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
20d40 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
20d50 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
20d60 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
20d70 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
20d80 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49  .    ** Pager.aI
20d90 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
20da0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
20db0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
20dc0 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
20dd0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
20de0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
20df0 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
20e00 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
20e10 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
20e20 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
20e30 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
20e40 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
20e50 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
20e60 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
20e70 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
20e80 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
20e90 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
20ea0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
20eb0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
20ec0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20ed0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
20ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20ef0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
20f00 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
20f10 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
20f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20f40 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
20f50 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
20f60 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
20f70 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f      pPgHdr->inJo
20f80 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d  urnal = 1;.    m
20f90 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
20fa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
20fb0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
20fc0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
20fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
20fe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
20ff0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
21000 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
21010 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
21020 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
21030 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
21040 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
21050 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
21060 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
21070 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21080 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
21090 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
210a0 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
210b0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
210c0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
210d0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
210e0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
210f0 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
21100 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
21110 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
21120 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
21130 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58  ager?PGHDR_TO_EX
21140 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
21150 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
21160 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
21170 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
21180 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
21190 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
211a0 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
211b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
211c0 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
211d0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
211e0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
211f0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
21200 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
21210 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
21220 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
21230 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
21240 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
21250 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
21260 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
21270 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
21280 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
21290 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
212a0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
212b0 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
212c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
212d0 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
212e0 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
212f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21300 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
21310 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21320 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28  nt eMode){.  if(
21330 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20   eMode>=0 ){.   
21340 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
21350 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
21360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
21370 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
21380 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20  iveMode;.}..#if 
21390 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
213a0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
213b0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
213c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
213d0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
213e0 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
213f0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
21400 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
21410 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
21420 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
21430 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
21440 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
21450 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
21460 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
21470 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
21480 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  kstate(Pager *pP
21490 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
214a0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61  sqlite3OsLockSta
214b0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  te(pPager->fd);.
214c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
214d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
214e0 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
214f0 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
21500 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
21510 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
21520 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21530 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67  PagerRefdump(Pag
21540 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
21550 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
21560 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
21570 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
21580 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
21590 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
215a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
215b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
215c0 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
215d0 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
215e0 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
215f0 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
21600 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
21610 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
21620 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
21630 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
21640 2a 2f 0a                                         */.