/ Hex Artifact Content
Login

Artifact 4dbd6a12eb43f10a3c870a3006a54a7756768455:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 37  : pager.c,v 1.27
0350: 39 20 32 30 30 37 2f 30 31 2f 30 33 20 31 35 3a  9 2007/01/03 15:
0360: 33 34 3a 33 30 20 64 72 68 20 45 78 70 20 24 0a  34:30 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  tf.#define TRACE
0460: 31 28 58 29 20 20 20 20 20 20 20 73 71 6c 69 74  1(X)       sqlit
0470: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 29  e3DebugPrintf(X)
0480: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32 28  .#define TRACE2(
0490: 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33  X,Y)     sqlite3
04a0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29  DebugPrintf(X,Y)
04b0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
04c0: 58 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33  X,Y,Z)   sqlite3
04d0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04e0: 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Z).#define TRACE
04f0: 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74  4(X,Y,Z,W) sqlit
0500: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
0510: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0520: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
0530: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0540: 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23  ntf(X,Y,Z,W,V).#
0550: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
0560: 43 45 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54  CE1(X).#define T
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  ne TRACE3(X,Y,Z)
0590: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
05a0: 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65  X,Y,Z,W).#define
05b0: 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c   TRACE5(X,Y,Z,W,
05c0: 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  V).#endif../*.**
05d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
05e0: 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73  wo macros are us
05f0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 54 52  ed within the TR
0600: 41 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62  ACEX() macros ab
0610: 6f 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20  ove.** to print 
0620: 6f 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70  out file-descrip
0630: 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47  tors. .**.** PAG
0640: 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70  ERID() takes a p
0650: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
0660: 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  r struct as it's
0670: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a   argument. The.*
0680: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  * associated fil
0690: 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e-descriptor is 
06a0: 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41  returned. FILEHA
06b0: 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61  NDLEID() takes a
06c0: 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75  n OsFile.** stru
06d0: 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d  ct as it's argum
06e0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
06f0: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0700: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0710: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0720: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0730: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0740: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0750: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0760: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0770: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0780: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
0790: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07a0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07b0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07c0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
07e0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07f0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0800: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0820: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0830: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0840: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0870: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0880: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0890: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08a0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08d0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
08e0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0910: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0920: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0930: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0940: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0950: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0960: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0970: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
0980: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
0990: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09a0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09c0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09d0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
09e0: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
09f0: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a20: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a30: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a40: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a70: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0a80: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0a90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0aa0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ab0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ac0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0ad0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0af0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b00: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b10: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b20: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b50: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b60: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b70: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0b80: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0ba0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bb0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0bc0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0bf0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c00: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c10: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c20: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c30: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c40: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c60: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c70: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0c80: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cb0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0cc0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cd0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0cf0: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d00: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d10: 72 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20  remove the.**   
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
0d40: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
0d50: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e        committed.
0d80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0d90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0da0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0db0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0dc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  a.** sqlite3page
0dd0: 72 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20  r_get() occurs, 
0de0: 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69  the state transi
0df0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53  tions to PAGER_S
0e00: 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20  HARED..** After 
0e10: 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62  all pages have b
0e20: 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69  een released usi
0e30: 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75  ng sqlite_page_u
0e40: 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73  nref(),.** the s
0e50: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e60: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55   back to PAGER_U
0e70: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0e80: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73  t time.** that s
0e90: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
0ea0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  e() is called, t
0eb0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0ec0: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52  ions to.** PAGER
0ed0: 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74  _RESERVED.  (Not
0ee0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61  e that sqlite_pa
0ef0: 67 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f  ge_write() can o
0f00: 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64  nly be.** called
0f10: 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   on an outstandi
0f20: 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65  ng page which me
0f30: 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
0f40: 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e  er must.** be in
0f50: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65   PAGER_SHARED be
0f60: 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69  fore it transiti
0f70: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53  ons to PAGER_RES
0f80: 45 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74  ERVED.).** The t
0f90: 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47  ransition to PAG
0fa0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63  ER_EXCLUSIVE occ
0fb0: 75 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20  urs when before 
0fc0: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
0fd0: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
0fe0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41  atabase file.  A
0ff0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70  fter an sqlite3p
1000: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a  ager_rollback().
1010: 2a 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67  ** or sqlite_pag
1020: 65 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65  er_commit(), the
1030: 20 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b   state goes back
1040: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1050: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1060: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
1080: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
1090: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
10a0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
10b0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
10c0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
10d0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
10e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
10f0: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1100: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1110: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1120: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1130: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1140: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1150: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1160: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1170: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
1180: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
1190: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
11a0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
11b0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
11c0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
11d0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
11e0: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
11f0: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1200: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1210: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1220: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1230: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1240: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1250: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1260: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1270: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
1280: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
1290: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
12a0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
12b0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
12c0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
12d0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
12e0: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
12f0: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1300: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1310: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1320: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1330: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1340: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1350: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1360: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1370: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
1380: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
1390: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
13a0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
13b0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
13c0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
13d0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
13e0: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
13f0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1400: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1420: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1430: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1440: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1450: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1460: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1470: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
1480: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
1490: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
14a0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
14b0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
14c0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
14d0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
14e0: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
14f0: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1500: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1510: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1520: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1530: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1540: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1550: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1560: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1570: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
1580: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
1590: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
15a0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
15b0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
15c0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
15d0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
15e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
15f0: 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20  ite() on a page 
1600: 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a  prior to making.
1610: 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ** any modificat
1620: 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67  ions to that pag
1630: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  e.  The first ti
1640: 6d 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  me sqlite3pager_
1650: 77 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61  write().** is ca
1660: 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  lled, the origin
1670: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
1680: 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1690: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
16a0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67  * journal and Pg
16b0: 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e  Hdr.inJournal an
16c0: 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  d PgHdr.needSync
16d0: 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72   are set.  Later
16e0: 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f  , once.** the jo
16f0: 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d  urnal page has m
1700: 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20  ade it onto the 
1710: 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67  disk surface, Pg
1720: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20  Hdr.needSync.** 
1730: 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65  is cleared.  The
1740: 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63   modified page c
1750: 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  annot be written
1760: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f   back into the o
1770: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1780: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  ase file until t
1790: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73  he journal pages
17a0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
17b0: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65   to disk and the
17c0: 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79  .** PgHdr.needSy
17d0: 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  nc has been clea
17e0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  red..**.** The P
17f0: 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20  gHdr.dirty flag 
1800: 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69  is set when sqli
1810: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
1820: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
1830: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
1840: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
1850: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
1860: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1870: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1880: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79  base file..*/.ty
1890: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
18a0: 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74  dr PgHdr;.struct
18b0: 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72   PgHdr {.  Pager
18c0: 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18e0: 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20   pager to which 
18f0: 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67  this page belong
1900: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
1910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1920: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1930: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
1940: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1950: 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70  r *pNextHash, *p
1960: 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61  PrevHash;  /* Ha
1970: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
1980: 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e  in for PgHdr.pgn
1990: 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  o */.  PgHdr *pN
19a0: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
19b0: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
19c0: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
19d0: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
19e0: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20  Hdr *pNextAll;  
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a00: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
1a10: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
1a20: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
1a30: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
1a40: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1a50: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1a60: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72  l */.  u8 inJour
1a70: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1a80: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1a90: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
1aa0: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
1ab0: 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20    u8 inStmt;    
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74   /* TRUE if in t
1ae0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
1af0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
1b00: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b20: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
1b30: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
1b40: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
1b50: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
1b70: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
1b80: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
1b90: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
1ba0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
1bb0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
1bc0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
1bd0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1be0: 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52  /.  short int nR
1bf0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1c00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c10: 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61  users of this pa
1c20: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
1c30: 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72  Dirty, *pPrevDir
1c40: 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20  ty;    /* Dirty 
1c50: 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  pages */.  u32 n
1c60: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1c80: 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66  fer space */.#if
1c90: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1ca0: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1cb0: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1cc0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cd0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1ce0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cf0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1d00: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1d10: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d20: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d30: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d40: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d50: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d60: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d80: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d90: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1da0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1db0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1dc0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1dd0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1de0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1df0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1e00: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1e10: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e20: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e30: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e40: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e50: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e60: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e70: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e80: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e90: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1ea0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1eb0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ec0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1ed0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ee0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ef0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1f00: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1f10: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f20: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f30: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f40: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f50: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f60: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f70: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f80: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f90: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1fa0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1fb0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fc0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fd0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fe0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1ff0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
2000: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
2010: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2020: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2030: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2040: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2050: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2060: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2070: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2080: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2090: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
20a0: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
20b0: 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66  DEC1(P,D,N,X) if
20c0: 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29  ( P->xCodec!=0 )
20d0: 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  { P->xCodec(P->p
20e0: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b  CodecArg,D,N,X);
20f0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45   }.# define CODE
2100: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
2110: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d  ar*)(P->xCodec!=
2120: 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  0?P->xCodec(P->p
2130: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a  CodecArg,D,N,X):
2140: 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  D)).#else.# defi
2150: 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c  ne CODEC1(P,D,N,
2160: 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23  X) /* NO-OP */.#
2170: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
2180: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
2190: 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  D).#endif../*.**
21a0: 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74   Convert a point
21b0: 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e  er to a PgHdr in
21c0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
21d0: 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20  its data.** and 
21e0: 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23  back again..*/.#
21f0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
2200: 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a  DATA(P)  ((void*
2210: 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66  )(&(P)[1])).#def
2220: 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  ine DATA_TO_PGHD
2230: 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a  R(D)  (&((PgHdr*
2240: 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69  )(D))[-1]).#defi
2250: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  ne PGHDR_TO_EXTR
2260: 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26  A(G,P) ((void*)&
2270: 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d  ((char*)(&(G)[1]
2280: 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65  ))[(P)->pageSize
2290: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
22a0: 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20  _TO_HIST(P,PGR) 
22b0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   \.            (
22c0: 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63  (PgHistory*)&((c
22d0: 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b  har*)(&(P)[1]))[
22e0: 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b  (PGR)->pageSize+
22f0: 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a  (PGR)->nExtra]).
2300: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
2310: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
2320: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2330: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2340: 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e  re..**.** Pager.
2350: 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73  errCode may be s
2360: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45  et to SQLITE_IOE
2370: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
2380: 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  PT, SQLITE_PROTO
2390: 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  COL.** or SQLITE
23a0: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
23b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
23c0: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
23d0: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
23e0: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
23f0: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
2400: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
2410: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
2420: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
2430: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
2440: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
2450: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
2460: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
2470: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
2480: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
2490: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
24a0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
24b0: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
24c0: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
24d0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  t the sqlite3pag
24e0: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c  er_get() and sql
24f0: 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
2500: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
2510: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2520: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2530: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
2540: 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f   {.  u8 journalO
2550: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2570: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
2580: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
2590: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
25a0: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
25b0: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
25c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
25d0: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
25e0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
25f0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
2600: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2610: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
2620: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
2630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2640: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2650: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2660: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
2670: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2680: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
26a0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
26b0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
26c0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
26d0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
26e0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
26f0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2700: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2710: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2720: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2730: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2740: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2750: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2790: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
27a0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27b0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
27c0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
27d0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
27e0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c  ness */.  u8 ful
27f0: 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20  l_fsync;        
2800: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46        /* Use F_F
2810: 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76  ULLFSYNC when av
2820: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20  ailable */.  u8 
2830: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
2850: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
2860: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2870: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
2880: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2890: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
28a0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
28b0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
28c0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
28d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
28e0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
28f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2900: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2910: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2920: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2930: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2940: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2950: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2970: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2980: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2990: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
29a0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
29b0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
29c0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
29d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
29e0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a00: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2a10: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2a20: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a40: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2a50: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2a60: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74  to jrnl */.  int
2a70: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a90: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2aa0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2ab0: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ad0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2ae0: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2af0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2b10: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2b20: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
2b30: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2b60: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2b70: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2b80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
2bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2bd0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2bf0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2c00: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2c10: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2c20: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c40: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2c50: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2c60: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2c70: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2c80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2c90: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
2ca0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
2cc0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2d20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2d30: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ges */.  int nMa
2d40: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2d50: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74       /* High wat
2d60: 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65  er mark of nPage
2d70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2da0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2db0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2df0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2e00: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2e10: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2e20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2e30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2e40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2e50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e60: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e90: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2ea0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
2eb0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ed0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ee0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ef0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2f30: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2f40: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2f50: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2f60: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2f70: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c  */.  OsFile *fd,
2f80: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
2f90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fa0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
2fb0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
2fc0: 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b  .  OsFile *stfd;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ff0: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
3000: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
3010: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
3020: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
3030: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
3040: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
3050: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
3060: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
3070: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
3080: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
30a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
30b0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
30c0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
30d0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
30e0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
3100: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
3110: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
3130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3140: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3150: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
3160: 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20   *pDirty;       
3170: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3180: 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
3190: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
31a0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
31b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
31c0: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
31d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
31e0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
31f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3200: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3210: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3220: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3230: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3250: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
3260: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
3270: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
3280: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
32a0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
32b0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
32c0: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
32d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
32e0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
32f0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3300: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3310: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3320: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3330: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3340: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3360: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
3370: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
3380: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
3390: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
33a0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
33b0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
33c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
33d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
33e0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
33f0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3400: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
3410: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
3420: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3430: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
3440: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
3450: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
3460: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
3470: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
3480: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
3490: 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  /.  void *(*xCod
34a0: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
34b0: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
34c0: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
34d0: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
34e0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3500: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
3510: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 69   xCodec() */.  i
3520: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
3530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3540: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
3550: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
3560: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3580: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
3590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
35a0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
35b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
35c0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
35d0: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
3600: 70 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74  pagers in this t
3610: 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  hread */.#endif.
3620: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  };../*.** If SQL
3630: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
3640: 6e 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ned then increme
3650: 6e 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  nt the variable 
3660: 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20  given in.** the 
3670: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64  argument.*/.#ifd
3680: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
3690: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
36a0: 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a  R(x)  x++.#else.
36b0: 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e  # define TEST_IN
36c0: 43 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(x).#endif../*
36d0: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
36e0: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
36f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3700: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
3710: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
3720: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
3730: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
3740: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
3750: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
3760: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3770: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
3780: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
3790: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
37a0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
37b0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
37c0: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
37d0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
37e0: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
37f0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3800: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
3810: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
3820: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
3830: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
3840: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
3850: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
3860: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3870: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
3880: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3890: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
38a0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
38b0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
38c0: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
38d0: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
38e0: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
38f0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3900: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
3910: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
3920: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
3930: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
3940: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3950: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
3960: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3970: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
3980: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
3990: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
39a0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
39b0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
39c0: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
39d0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
39e0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
39f0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3a00: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
3a10: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
3a20: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
3a30: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
3a40: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
3a50: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
3a60: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3a70: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3a80: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3a90: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3aa0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3ab0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3ac0: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3ad0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3ae0: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3af0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3b00: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
3b10: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
3b20: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3b30: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3b40: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3b50: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3b60: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3b70: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3b80: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3b90: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3ba0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3bb0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3bc0: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3bd0: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3be0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3bf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
3c00: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
3c10: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
3c20: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
3c30: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
3c40: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3c50: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3c60: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3c70: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3c80: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
3c90: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
3ca0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
3cb0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3cc0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3cd0: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3ce0: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
3cf0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
3d00: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
3d10: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
3d20: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
3d30: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
3d40: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
3d50: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
3d60: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
3d70: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
3d80: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
3d90: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
3da0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
3db0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
3dc0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
3dd0: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
3de0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
3df0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
3e00: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
3e10: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
3e20: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
3e30: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
3e40: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
3e50: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
3e60: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
3e70: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
3e80: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
3e90: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
3ea0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
3eb0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
3ec0: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
3ed0: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
3ee0: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
3ef0: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
3f00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
3f10: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
3f20: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
3f30: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
3f40: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
3f50: 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  /*.** The defaul
3f60: 74 20 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b  t size of a disk
3f70: 20 73 65 63 74 6f 72 0a 2a 2f 0a 23 69 66 6e 64   sector.*/.#ifnd
3f80: 65 66 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  ef PAGER_SECTOR_
3f90: 53 49 5a 45 0a 23 20 64 65 66 69 6e 65 20 50 41  SIZE.# define PA
3fa0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  GER_SECTOR_SIZE 
3fb0: 35 31 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  512.#endif../*.*
3fc0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41  * Page number PA
3fd0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e  GER_MJ_PGNO is n
3fe0: 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20  ever used in an 
3ff0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
4000: 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76  (it is.** reserv
4010: 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61  ed for working a
4020: 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f  round a windows/
4030: 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62  posix incompatib
4040: 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a  ility). It is.**
4050: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75   used in the jou
4060: 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20  rnal to signify 
4070: 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64  that the remaind
4080: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
4090: 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65  l file .** is de
40a0: 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67  voted to storing
40b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
40c0: 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61  l name - there a
40d0: 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73  re no more pages
40e0: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b   to.** roll back
40f0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66  . See comments f
4100: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  or function writ
4110: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
4120: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
4130: 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45  ./* #define PAGE
4140: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
4150: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4160: 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23  >pageSize)) */.#
4170: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4180: 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e  PGNO(x) ((PENDIN
4190: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
41a0: 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a  eSize))+1)../*.*
41b0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
41c0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
41d0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
41e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
41f0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
4200: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  647../*.** Enabl
4210: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4220: 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20  t tracking (for 
4230: 64 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a  debugging) here:
4240: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4250: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67  E_TEST.  int pag
4260: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
4270: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
4280: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
4290: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
42a0: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
42b0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
42c0: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
42d0: 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  nable ) return;.
42e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
42f0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
4300: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
4310: 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a  =%p nRef=%d\n",.
4320: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
4330: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4340: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
4350: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
4360: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
4370: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
4380: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
4390: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
43a0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
43b0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
43c0: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
43d0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
43e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
43f0: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4400: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4410: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4420: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4430: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4440: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
4450: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
4460: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
4470: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
4480: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
4490: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
44a0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
44b0: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
44c0: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
44d0: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
44e0: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
44f0: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4500: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4510: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4520: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4530: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4540: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
4550: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
4560: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
4570: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
4580: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
4590: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
45a0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
45b0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
45c0: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
45d0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
45e0: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
45f0: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4600: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4610: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4620: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4630: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4640: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
4650: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
4660: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
4670: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
4680: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
4690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
46a0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
46b0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
46c0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
46d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
46e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
46f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4700: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4710: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4720: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4730: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4740: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4750: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
4760: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
4770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4780: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
4790: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
47a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
47b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
47c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
47d0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
47e0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
47f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4800: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4810: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4820: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4830: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4840: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4850: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4860: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4870: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4880: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4890: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
48a0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
48b0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
48c0: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
48d0: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
48e0: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
48f0: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4900: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4910: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4920: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4930: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4940: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4950: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4960: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4970: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4980: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4990: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
49a0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
49b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
49c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
49d0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
49e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
49f0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4a00: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4a10: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4a20: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4a30: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4a40: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4a50: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4a60: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4a70: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4a80: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4a90: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4aa0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4ab0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4ac0: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4ad0: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4ae0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4af0: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4b00: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4b10: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4b20: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4b30: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4b40: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4b50: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4b60: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4b70: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4b80: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4b90: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4ba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4bb0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4bc0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4bd0: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4be0: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4bf0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4c00: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4c10: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4c20: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4c30: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4c40: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4c50: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4c60: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4c70: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4c80: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4c90: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4ca0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4cb0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4cc0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4cd0: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4ce0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4cf0: 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
4d00: 45 5f 50 52 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74  E_PROTOCOL,.** t
4d10: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
4d20: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c   persistent. All
4d30: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
4d40: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
4d50: 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65  ger.** will imme
4d60: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
4d70: 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f  he same error co
4d80: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
4d90: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
4da0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
4db0: 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
4dc0: 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
4dd0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
4de0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
4df0: 55 4c 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ULL || pPager->e
4e00: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
4e10: 4b 20 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20  K );.  if( .    
4e20: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
4e30: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4e40: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
4e50: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
4e60: 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63 32 3d  RUPT ||.    rc2=
4e70: 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  =SQLITE_PROTOCOL
4e80: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
4e90: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
4ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4eb0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4ec0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4ed0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4ee0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4ef0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4f00: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4f10: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4f20: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4f30: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4f50: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4f60: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4f70: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4f80: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4f90: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4fa0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4fb0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4fc0: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4fd0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4fe0: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4ff0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
5000: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
5010: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
5020: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
5030: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
5040: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
5050: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
5060: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
5070: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
5080: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
5090: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
50a0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
50b0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
50c0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
50d0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
50e0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
50f0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
5100: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
5110: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
5120: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
5130: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
5140: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
5150: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
5160: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
5170: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
5180: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
5190: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
51a0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
51b0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
51c0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
51d0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
51e0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
51f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
5200: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
5210: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
5220: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5230: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5240: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
5250: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
5260: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
5270: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5280: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5290: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
52a0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
52b0: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
52c0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
52d0: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
52e0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
52f0: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
5300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
5310: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5320: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
5330: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5340: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
5350: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5360: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5370: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5380: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
5390: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
53a0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
53b0: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
53c0: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
53d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
53e0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
53f0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
5400: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
5410: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
5420: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
5430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5440: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
5450: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
5460: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
5470: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
5480: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5490: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
54a0: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
54b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
54c0: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
54d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
54e0: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
54f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5510: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5520: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
5530: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5540: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5550: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5560: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5570: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5590: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
55a0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
55b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
55c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
55d0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
55e0: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
55f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5600: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
5610: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
5620: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
5630: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5640: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5650: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5660: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5670: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5680: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
5690: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
56a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
56b0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
56c0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
56d0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
56e0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
56f0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
5700: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
5710: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5720: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
5730: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5740: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5750: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5760: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5770: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5780: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
5790: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
57a0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
57b0: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
57c0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
57d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
57e0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
57f0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
5800: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
5810: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
5820: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
5830: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5840: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5850: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5860: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5870: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5880: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5890: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
58a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
58b0: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
58c0: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
58d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
58e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
58f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5900: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5910: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
5920: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
5930: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5940: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5950: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5960: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5970: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5980: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
5990: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
59a0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
59b0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
59c0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
59d0: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
59e0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
5a30: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5a50: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5a70: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
5a90: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
5aa0: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
5ab0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5ac0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5ad0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
5ae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5af0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
5b00: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
5b10: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
5b20: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
5b30: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5b40: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5b50: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5b60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5b70: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5b80: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
5b90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
5ba0: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
5bb0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5bc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5bd0: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
5be0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5bf0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
5c00: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
5c10: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
5c20: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
5c30: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5c40: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5c50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
5c60: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
5c70: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
5c80: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
5c90: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
5ca0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
5cb0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
5cc0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5cd0: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
5ce0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
5cf0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
5d00: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
5d10: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
5d20: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
5d30: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
5d40: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
5d50: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
5d60: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
5d70: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
5d80: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
5d90: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
5da0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
5db0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
5dc0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
5dd0: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
5de0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
5df0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
5e00: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
5e10: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
5e20: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5e30: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
5e40: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5e50: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5e60: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5e70: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5e80: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
5e90: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5ea0: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20 20  lMagic)+16];..  
5eb0: 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  int rc = seekJou
5ec0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
5ed0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5ee0: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
5ef0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
5f00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5f10: 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  f;.  if( pPager-
5f20: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
5f30: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
5f40: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
5f50: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20  r->journalHdr;. 
5f60: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
5f70: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
5f80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5f90: 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a  );..  /* FIX ME:
5fa0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73   .  **.  ** Poss
5fb0: 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72  ibly for a pager
5fc0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
5fd0: 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
5fe0: 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e  l magic should n
5ff0: 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ot.  ** be writt
6000: 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73  en until nRec is
6010: 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61   filled in as pa
6020: 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a  rt of next syncJ
6030: 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a  ournal(). .  **.
6040: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61    ** Actually ma
6050: 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  ybe the whole jo
6060: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f  urnal header sho
6070: 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75  uld be delayed u
6080: 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70  ntil that.  ** p
6090: 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75  oint. Think abou
60a0: 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d  t this..  */.  m
60b0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
60c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
60d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
60e0: 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e  ic));.  /* The n
60f0: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
6100: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
6110: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
6120: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6130: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6140: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
6150: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
6160: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
6170: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
6180: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
6190: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
61a0: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
61b0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
61c0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
61d0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
61e0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
61f0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6200: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
6210: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6220: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
6230: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6240: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6250: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6260: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
6270: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
6280: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
6290: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
62a0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
62b0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
62c0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
62d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
62e0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
62f0: 72 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 73  rSize);.  rc = s
6300: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6310: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
6320: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
6330: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6340: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6350: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6360: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
6370: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
6380: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
6390: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
63a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
63b0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
63c0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
63d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
63e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
63f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6400: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
6410: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
6420: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6430: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6440: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6450: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6460: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6470: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6480: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6490: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
64a0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
64b0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
64c0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
64d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
64e0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
64f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6500: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
6510: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
6520: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6530: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6540: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6550: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6560: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6570: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6580: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6590: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
65a0: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
65b0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
65c0: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
65d0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
65e0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
65f0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
6600: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
6610: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
6620: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
6630: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6640: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6650: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6660: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6670: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6680: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6690: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
66a0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
66b0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
66c0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
66d0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
66e0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
66f0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
6700: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
6710: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
6720: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6730: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6740: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6750: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6760: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6770: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6780: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6790: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
67a0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
67b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
67c0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
67d0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
67e0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
67f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
6800: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
6810: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
6820: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6830: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6840: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6850: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6860: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6870: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6880: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6890: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
68a0: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
68b0: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
68c0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
68d0: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
68e0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
68f0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
6900: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
6910: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6920: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
6930: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6940: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6950: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6960: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6970: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6980: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6990: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
69a0: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
69b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
69c0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
69d0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
69e0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
69f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a00: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6a10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6a20: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6a30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a40: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6a50: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6a60: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6a70: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6a80: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6a90: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6aa0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6ab0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6ac0: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6ad0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
6ae0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
6af0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
6b00: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
6b10: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
6b20: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6b30: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6b40: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6b50: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6b60: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6b70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6b80: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6b90: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6ba0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
6bb0: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
6bc0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6bd0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6be0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
6bf0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
6c00: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6c10: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6c20: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
6c30: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6c40: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6c50: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6c60: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6c70: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6c80: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6c90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6ca0: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6cb0: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6cc0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6cd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6ce0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6cf0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6d00: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6d10: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6d20: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6d30: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6d40: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6d50: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6d60: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6d70: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6d80: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6d90: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6da0: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6db0: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6dc0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6dd0: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6de0: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6df0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6e00: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6e10: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6e20: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
6e30: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
6e40: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
6e50: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
6e60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e70: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
6e80: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
6e90: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
6ea0: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
6eb0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
6ec0: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
6ed0: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
6ee0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
6ef0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
6f00: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
6f10: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
6f20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6f30: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6f40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
6f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
6f60: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
6f70: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
6f80: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
6f90: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
6fa0: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
6fb0: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
6fc0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
6fd0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6fe0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
6ff0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
7000: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
7010: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
7020: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
7030: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
7040: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
7050: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
7060: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
7070: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
7080: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
7090: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
70a0: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
70b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
70c0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
70d0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
70e0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
70f0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
7100: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
7110: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
7120: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
7130: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
7140: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
7150: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
7160: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7170: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7180: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
7190: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
71a0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
71b0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
71c0: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
71d0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
71e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
71f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7200: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
7210: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7220: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
7230: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7240: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7250: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7260: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
7270: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
7280: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
7290: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
72a0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
72b0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
72c0: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
72d0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
72e0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
72f0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
7300: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
7310: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
7320: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
7330: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7340: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7350: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7360: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
7370: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7380: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7390: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
73a0: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
73b0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
73c0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
73d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
73e0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
73f0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
7400: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
7410: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7420: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
7430: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
7440: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
7450: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
7460: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
7470: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7480: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7490: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
74a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
74b0: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
74c0: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
74d0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
74e0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
74f0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7500: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7510: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
7520: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
7530: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
7540: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
7550: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7560: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
7570: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7580: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7590: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
75a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
75b0: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
75c0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
75d0: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
75e0: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
75f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
7600: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
7610: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
7620: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
7630: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7640: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
7650: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
7660: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7670: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7680: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7690: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
76a0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
76b0: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
76c0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
76d0: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
76e0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
76f0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7700: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7710: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
7720: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
7730: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
7740: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
7750: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7760: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
7770: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7780: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7790: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
77a0: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
77b0: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
77c0: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
77d0: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
77e0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
77f0: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7800: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7810: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7820: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
7830: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7840: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7850: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7860: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7870: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7880: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  *p;.  if( pPager
7890: 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74  ->aHash==0 ) ret
78a0: 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61  urn 0;.  p = pPa
78b0: 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20  ger->aHash[pgno 
78c0: 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
78d0: 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  -1)];.  while( p
78e0: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
78f0: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7900: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
7910: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7920: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
7930: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
7940: 0a 2a 2a 20 4f 6e 63 65 20 61 6c 6c 20 6c 6f 63  .** Once all loc
7950: 6b 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6d  ks have been rem
7960: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
7970: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 6f 74 68  tabase file, oth
7980: 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 65 73 20  er.** processes 
7990: 6f 72 20 74 68 72 65 61 64 73 20 6d 69 67 68 74  or threads might
79a0: 20 63 68 61 6e 67 65 20 74 68 65 20 66 69 6c 65   change the file
79b0: 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
79c0: 61 6c 6c 20 6f 66 0a 2a 2a 20 6f 75 72 20 69 6e  all of.** our in
79d0: 74 65 72 6e 61 6c 20 63 61 63 68 65 20 69 73 20  ternal cache is 
79e0: 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
79f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
7a00: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
7a10: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
7a20: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c  MEMDB ){.    sql
7a30: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
7a40: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
7a50: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
7a60: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a  bSize = -1;.  }.
7a70: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7a80: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7a90: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  }.../*.** Unlock
7aa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
7ab0: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
7ac0: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
7ad0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
7ae0: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
7af0: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
7b00: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
7b10: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
7b20: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
7b30: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
7b40: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7b50: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
7b60: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
7b70: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
7b80: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
7b90: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
7ba0: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
7bb0: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
7bc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7bd0: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
7be0: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Next;.  if( pPag
7bf0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
7c00: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d  turn;.  for(pPg=
7c10: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
7c20: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
7c30: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
7c40: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
7c50: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
7c60: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69   }.  pPager->pFi
7c70: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
7c80: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
7c90: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
7ca0: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
7cb0: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
7cc0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
7cd0: 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  0;.  sqliteFree(
7ce0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
7cf0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
7d00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
7d10: 48 61 73 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  Hash = 0;.  if( 
7d20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
7d30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
7d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
7d50: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
7d60: 72 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  r);.  }.  pager_
7d70: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
7d80: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
7d90: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
7da0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7db0: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
7dc0: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
7dd0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
7de0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
7df0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7e00: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
7e10: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
7e20: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
7e30: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
7e40: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a  tine releases.**
7e50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
7e60: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
7e70: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
7e80: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
7e90: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
7ea0: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
7eb0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  closed..**.** TO
7ec0: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
7ed0: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
7ee0: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
7ef0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
7f00: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
7f10: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
7f20: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
7f30: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
7f40: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
7f50: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
7f60: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
7f70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
7f80: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50  er_unwritelock(P
7f90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7fa0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
7fb0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
7fc0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
7fd0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
7fe0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
7ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8000: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
8010: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
8020: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
8030: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
8040: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
8050: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
8060: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
8070: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
8080: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
8090: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
80a0: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
80b0: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
80c0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
80d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
80e0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
80f0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
8100: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
8110: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
8120: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
8130: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
8140: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8150: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
8160: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8170: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8180: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
8190: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
81a0: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
81b0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
81c0: 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65  dSync = 0;.#ifde
81d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
81e0: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
81f0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
8200: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
8210: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
8220: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
8230: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
8240: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
8250: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
8260: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
8270: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8280: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
8290: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
82a0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
82b0: 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
82c0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->useJournal==0 
82d0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
82e0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
82f0: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
8300: 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72  _LOCK);.  pPager
8310: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
8320: 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72  SHARED;.  pPager
8330: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
8340: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
8350: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
8360: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
8370: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
8380: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
8390: 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 50  er->pFirst;.  pP
83a0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
83b0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
83d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
83e0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
83f0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
8400: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
8410: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
8420: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
8430: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
8440: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
8450: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
8460: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
8470: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
8480: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
8490: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
84a0: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
84b0: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
84c0: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
84d0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
84e0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
84f0: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
8500: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
8510: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
8520: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
8530: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
8540: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
8550: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
8560: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
8570: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
8580: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
8590: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
85a0: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
85b0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
85c0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
85d0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
85e0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
85f0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
8600: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
8610: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
8620: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
8630: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
8640: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
8650: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
8660: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
8670: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
8680: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
8690: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
86a0: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
86b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
86c0: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
86d0: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
86e0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
86f0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
8700: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
8710: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
8720: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
8730: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
8740: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
8750: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
8760: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
8770: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
8780: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
8790: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
87a0: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
87b0: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
87c0: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
87d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
87e0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
87f0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
8800: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
8810: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
8820: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
8830: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
8840: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
8850: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
8860: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
8870: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
8880: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8890: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  cksum;.}../* For
88a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
88b0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
88c0: 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a  makeClean(PgHdr*
88d0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  );../*.** Read a
88e0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
88f0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
8900: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
8910: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
8920: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
8930: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
8940: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
8950: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
8960: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
8970: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
8980: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
8990: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
89a0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
89b0: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
89c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
89d0: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
89e0: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
89f0: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
8a00: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
8a10: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
8a20: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
8a30: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
8a40: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
8a50: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
8a80: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
8a90: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
8aa0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
8ab0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
8ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
8ad0: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
8ae0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
8b10: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
8b20: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44  cking */.  u8 aD
8b30: 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ata[SQLITE_MAX_P
8b40: 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54  AGE_SIZE];  /* T
8b50: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
8b60: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
8b70: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
8b80: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
8b90: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
8ba0: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
8bb0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8bc0: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
8bd0: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
8be0: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
8bf0: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
8c00: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
8c10: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
8c20: 3e 73 74 66 64 29 20 29 3b 0a 0a 0a 20 20 72 63  >stfd) );...  rc
8c30: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
8c40: 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  d, &pgno);.  if(
8c50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8c60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
8c70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8c80: 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50  (jfd, &aData, pP
8c90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8ca0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8cb0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8cc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
8cd0: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
8ce0: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
8cf0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
8d00: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
8d10: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
8d20: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
8d30: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
8d40: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
8d50: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
8d60: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
8d70: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8d80: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
8d90: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
8da0: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
8db0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
8dc0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
8dd0: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
8de0: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
8df0: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
8e00: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
8e10: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
8e20: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
8e30: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
8e40: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
8e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8e60: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
8e70: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
8e80: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
8e90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8ea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8eb0: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
8ec0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
8ed0: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
8ee0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
8ef0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
8f00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8f10: 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70   += 4;.    if( p
8f20: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
8f30: 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  r, aData)!=cksum
8f40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8f50: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8f60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
8f70: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
8f80: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
8f90: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
8fa0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
8fb0: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
8fc0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
8fd0: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
8fe0: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
8ff0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
9000: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
9010: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
9020: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
9030: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
9040: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
9050: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
9060: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
9070: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
9080: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
9090: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
90a0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
90b0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
90c0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
90d0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
90e0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
90f0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9100: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
9110: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
9120: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
9130: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
9140: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
9150: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
9160: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
9170: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
9180: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
9190: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
91a0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
91b0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
91c0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
91d0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
91e0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
91f0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9200: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
9210: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
9220: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
9230: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
9240: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
9250: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
9260: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
9270: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
9280: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
9290: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
92a0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
92b0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20  contents are in 
92c0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
92d0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
92e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
92f0: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f   full ROLLBACK o
9300: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
9310: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72  statement.  ** r
9320: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c  ollback the full
9330: 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e   ROLLBACK will n
9340: 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70  ot restore the p
9350: 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  age to its origi
9360: 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  nal.  ** content
9370: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
9380: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65  s must be met be
9390: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
93a0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
93b0: 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  * files. (1) the
93c0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
93d0: 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  e locked.  (2) w
93e0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
93f0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61  original.  ** pa
9400: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e  ge content is in
9410: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
9420: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
9430: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
9440: 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f   in.  ** cache o
9450: 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72  r else it is mar
9460: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
9470: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
9480: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
9490: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
94a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
94b0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
94c0: 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20  USIVE || pPg!=0 
94d0: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41  );.  TRACE3("PLA
94e0: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
94f0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
9500: 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ger), pgno);.  i
9510: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9520: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9530: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
9540: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
9550: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
9560: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
9570: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
9580: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
9590: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
95a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
95b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
95c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
95d0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
95e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
95f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9600: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b  pPg ){.      mak
9610: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
9620: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
9630: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
9640: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
9650: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
9660: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
9670: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
9680: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
9690: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
96a0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
96b0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
96c0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
96d0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
96e0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
96f0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
9700: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
9710: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
9720: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
9730: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
9740: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
9750: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 70  .    ** sqlite3p
9760: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e  ager_rollback().
9770: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
9780: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
9790: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
97a0: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
97b0: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
97c0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
97d0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
97e0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
97f0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9800: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
9810: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9820: 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20  or ){  /*** FIX 
9830: 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73  ME:  Should this
9840: 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a   be xReinit? ***
9850: 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
9860: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
9870: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9880: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ize);.    }.#ifd
9890: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
98a0: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
98b0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
98c0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
98d0: 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43 31  endif.    CODEC1
98e0: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
98f0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
9900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9910: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
9920: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
9930: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
9940: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9950: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
9960: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
9970: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
9980: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9990: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
99a0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
99b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
99c0: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
99d0: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
99e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
99f0: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
9a00: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
9a10: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  s..**.** The mas
9a20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9a30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
9a40: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  mes of all child
9a50: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f   journals..** To
9a60: 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65   tell if a maste
9a70: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
9a80: 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20   deleted, check 
9a90: 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  to each of the.*
9aa0: 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20  * children.  If 
9ab0: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65  all children are
9ac0: 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20   either missing 
9ad0: 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20  or do not refer 
9ae0: 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e  to.** a differen
9af0: 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
9b00: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74  , then this mast
9b10: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
9b20: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  e deleted..*/.st
9b30: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
9b40: 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63  elmaster(const c
9b50: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
9b60: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
9b70: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
9b80: 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72    OsFile *master
9b90: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d   = 0;.  char *zM
9ba0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
9bb0: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
9bc0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9bd0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
9be0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
9bf0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
9c00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9c10: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
9c20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9c30: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
9c40: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
9c50: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
9c60: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
9c70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
9c80: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
9c90: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
9ca0: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
9cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9cc0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73  penReadOnly(zMas
9cd0: 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20  ter, &master);. 
9ce0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9cf0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9d00: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
9d10: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63  r_open = 1;.  rc
9d20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
9d30: 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d  Size(master, &nM
9d40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9d50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9d60: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9d70: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
9d80: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
9d90: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
9da0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
9db0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
9dc0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
9dd0: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
9de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
9df0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
9e00: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
9e10: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
9e20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
9e30: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
9e40: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
9e50: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
9e60: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
9e70: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (nMasterJournal)
9e80: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
9e90: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
9ea0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9eb0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
9ec0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9ed0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
9ee0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73  qlite3OsRead(mas
9ef0: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
9f00: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
9f10: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
9f20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
9f30: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9f40: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
9f50: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
9f60: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
9f70: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
9f80: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
9f90: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
9fa0: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
9fb0: 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29  Exists(zJournal)
9fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
9fd0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
9fe0: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
9ff0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a000: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
a010: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
a020: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
a030: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
a040: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
a050: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
a060: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
a070: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
a080: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
a090: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a0a0: 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e     OsFile *journ
a0b0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
a0c0: 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20  int c;..        
a0d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
a0e0: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72  enReadOnly(zJour
a0f0: 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a  nal, &journal);.
a100: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a110: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a120: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
a130: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
a140: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
a150: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
a160: 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a  rnal(journal, &z
a170: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
a180: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a190: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
a1a0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a1b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a1c0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a1d0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a1e0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
a1f0: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
a200: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
a210: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
a220: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
a230: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
a240: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
a250: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
a260: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
a270: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
a280: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a290: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
a2a0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
a2b0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
a2c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a2d0: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
a2e0: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
a2f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
a300: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a310: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a320: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a330: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a340: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a350: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a360: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a370: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a380: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a390: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a3a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a3b0: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
a3c0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a3d0: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
a3e0: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
a3f0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
a400: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a410: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a420: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a430: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a440: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a450: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a460: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a470: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a480: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a490: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a4a0: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a4b0: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a4c0: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a4d0: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a4e0: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a4f0: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a500: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a510: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a520: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a530: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a540: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a550: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a560: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a570: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a580: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a590: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a5a0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a5b0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
a5c0: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
a5d0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
a5e0: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
a5f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a600: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
a610: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
a620: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
a630: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
a640: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
a650: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
a660: 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
a670: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
a680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a690: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a6a0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a6b0: 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
a6c0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a6d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
a6e0: 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20 70  E3("REFETCH %d p
a6f0: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
a700: 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
a710: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
a720: 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
a730: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
a740: 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67  r, zBuf, pPg->pg
a750: 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73  no, 2);.    }els
a760: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
a770: 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d  zBuf, 0, pPager-
a780: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a790: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
a7a0: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
a7b0: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
a7c0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
a7d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
a7e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
a7f0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a800: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
a810: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
a820: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
a830: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
a840: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a850: 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
a860: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
a870: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
a880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
a890: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
a8a0: 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
a8b0: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
a8c0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
a8d0: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65     }.    pPg->ne
a8e0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
a8f0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
a900: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
a910: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
a920: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
a930: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
a940: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
a950: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
a960: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
a970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
a980: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
a990: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
a9a0: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
a9b0: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
a9c0: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  dicated..*/.stat
a9d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
a9e0: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
a9f0: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
aa00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
aa10: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
aa20: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 72  EXCLUSIVE );.  r
aa30: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54  eturn sqlite3OsT
aa40: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
aa50: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
aa60: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
aa70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
aa80: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
aa90: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
aaa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
aab0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
aac0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
aad0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
aae0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
aaf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
ab00: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
ab10: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
ab20: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
ab30: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
ab40: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
ab50: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
ab60: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
ab70: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
ab80: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
ab90: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
aba0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
abb0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
abc0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
abd0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
abe0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
abf0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
ac00: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
ac10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
ac20: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
ac30: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
ac40: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ac50: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
ac60: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
ac70: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
ac80: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
ac90: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
aca0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
acb0: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
acc0: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
acd0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
ace0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
acf0: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
ad00: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
ad10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ad20: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
ad30: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
ad40: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
ad50: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
ad60: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
ad70: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
ad80: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
ad90: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
ada0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
adb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
adc0: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
add0: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
ade0: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
adf0: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
ae00: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
ae10: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
ae20: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
ae30: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
ae40: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
ae50: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
ae60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
ae70: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
ae80: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
ae90: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
aea0: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
aeb0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
aec0: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
aed0: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
aee0: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
aef0: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
af00: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
af10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
af20: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
af30: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
af40: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
af50: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
af60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
af70: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
af80: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
af90: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
afa0: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
afb0: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
afc0: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
afd0: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
afe0: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
aff0: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
b000: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
b010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
b020: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
b030: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
b040: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
b050: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
b060: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
b070: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
b080: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
b090: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
b0a0: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
b0b0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
b0c0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
b0d0: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
b0e0: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
b0f0: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
b100: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
b110: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
b120: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
b130: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
b140: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
b150: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
b160: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
b170: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
b180: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
b190: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
b1a0: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
b1b0: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
b1c0: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
b1d0: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
b1e0: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
b1f0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
b200: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
b210: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
b220: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
b230: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
b240: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
b250: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
b260: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
b270: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
b280: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
b290: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
b2a0: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
b2b0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
b2c0: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
b2d0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
b2e0: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
b2f0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
b300: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
b310: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
b320: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
b330: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
b340: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
b350: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
b360: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
b370: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
b380: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
b390: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
b3a0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
b3b0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
b3c0: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
b3d0: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
b3e0: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
b3f0: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
b400: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
b410: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
b420: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
b430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
b440: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
b450: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
b460: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
b470: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
b480: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
b490: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
b4a0: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
b4b0: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
b4c0: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
b4d0: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
b4e0: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
b4f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
b500: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
b510: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
b520: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
b530: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
b560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
b570: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
b580: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
b590: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b5a0: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
b5b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
b5c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
b5d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b5e0: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
b5f0: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
b600: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
b610: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
b620: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
b630: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
b640: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
b650: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
b660: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
b670: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
b680: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
b690: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b6a0: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
b6b0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
b6c0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
b6d0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
b6e0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
b6f0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
b700: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
b710: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
b720: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
b730: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
b740: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
b750: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
b760: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b770: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
b780: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
b790: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
b7a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b7b0: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
b7c0: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
b7d0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
b7e0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
b7f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
b800: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
b810: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
b820: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
b830: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
b840: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
b850: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
b860: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
b870: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
b880: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
b890: 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
b8a0: 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b  >jfd, &zMaster);
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
b8c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
b8d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b8e0: 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26  K || (zMaster &&
b8f0: 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
b900: 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20  xists(zMaster)) 
b910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
b920: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
b930: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
b940: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b950: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
b960: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
b970: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
b980: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  }.  sqlite3OsSee
b990: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  k(pPager->jfd, 0
b9a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
b9b0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  rnalOff = 0;..  
b9c0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
b9d0: 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
b9e0: 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72  hen the readJour
b9f0: 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65  nalHdr() call re
ba00: 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54  turns.  ** SQLIT
ba10: 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
ba20: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
ba30: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
ba40: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
ba50: 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
ba60: 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
ba70: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
ba80: 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
ba90: 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
baa0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
bab0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
bac0: 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
bad0: 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
bae0: 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
baf0: 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
bb00: 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
bb10: 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
bb20: 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
bb30: 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
bb40: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
bb50: 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
bb60: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
bb70: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
bb80: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
bb90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
bba0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
bbb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bbc0: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
bbd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
bbe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bbf0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
bc00: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
bc10: 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
bc20: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
bc30: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
bc40: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
bc50: 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
bc60: 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
bc70: 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
bc80: 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
bc90: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
bca0: 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
bcb0: 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
bcc0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
bcd0: 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
bce0: 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
bcf0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
bd00: 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
bd10: 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
bd20: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
bd30: 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
bd40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bd50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
bd60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
bd70: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
bd80: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
bd90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
bda0: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
bdb0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
bdc0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
bdd0: 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
bde0: 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
bdf0: 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
be00: 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
be10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
be20: 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e  k to it's origin
be30: 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
be40: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
be50: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
be60: 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20 20 20  LUSIVE && .     
be70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
be80: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
be90: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
bea0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
beb0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
bec0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
bed0: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67  origDbSize==mxPg
bee0: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
bef0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
bf00: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
bf10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bf20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bf30: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
bf40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
bf50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
bf60: 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
bf70: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
bf80: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
bf90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
bfa0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
bfb0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
bfc0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
bfd0: 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
bfe0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
bff0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
c000: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
c010: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
c020: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c030: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
c040: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
c050: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
c060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c070: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
c080: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
c090: 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
c0a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
c0b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
c0c0: 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
c0d0: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
c0e0: 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  hot journal, the
c0f0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
c100: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70           ** is p
c110: 72 6f 62 61 62 6c 79 20 6e 6f 74 20 72 65 63 6f  robably not reco
c120: 76 65 72 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  verable.  Return
c130: 20 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20   CORRUPT..      
c140: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
c150: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
c160: 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
c170: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c180: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
c190: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
c1a0: 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
c1b0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
c1c0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
c1d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c1e0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
c1f0: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
c200: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
c210: 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( zMaster ){.  
c220: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
c230: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
c240: 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
c250: 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
c260: 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65  true,.    ** see
c270: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
c280: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
c290: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
c2a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c2b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c2c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
c2d0: 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73  r_delmaster(zMas
c2e0: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
c2f0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c300: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
c310: 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
c320: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
c330: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
c340: 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
c350: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
c360: 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
c370: 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
c380: 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52   different PAGER
c390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a  _SECTOR_SIZE.  *
c3a0: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
c3b0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
c3c0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
c3d0: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
c3e0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c3f0: 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f  ze = PAGER_SECTO
c400: 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  R_SIZE;.  return
c410: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
c420: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
c430: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
c440: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
c450: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
c460: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
c470: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
c480: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
c490: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
c4a0: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
c4b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
c4c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c4d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
c4e0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
c4f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
c500: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
c510: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
c520: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
c530: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
c540: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
c550: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
c560: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c570: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c580: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
c590: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
c5a0: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
c5b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c5c0: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
c5d0: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
c5e0: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
c5f0: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
c600: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
c610: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
c620: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
c630: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
c640: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
c650: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
c660: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
c670: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
c680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c690: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
c6a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c6c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c6d0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
c6e0: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
c6f0: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
c700: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
c710: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
c720: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
c730: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
c740: 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
c750: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c760: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
c770: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
c780: 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
c790: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
c7a0: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
c7b0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c7c0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
c7d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20  eader written.  
c7e0: 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ** this statemen
c7f0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  t transaction, o
c800: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
c810: 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
c820: 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
c830: 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
c840: 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
c850: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
c860: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c870: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
c880: 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
c890: 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
c8a0: 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
c8b0: 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
c8c0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
c8d0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
c8e0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
c8f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
c900: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
c910: 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
c920: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
c930: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
c940: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  tmtSize);.  }.  
c950: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c960: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
c970: 52 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  RED );.  pPager-
c980: 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
c990: 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f  ->stmtSize;..  /
c9a0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
c9b0: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
c9c0: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
c9d0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
c9e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c9f0: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
ca00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ca10: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  pen );.  sqlite3
ca20: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
ca30: 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20  tfd, 0);.  nRec 
ca40: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
ca50: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
ca60: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
ca70: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
ca80: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
ca90: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
caa0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
cab0: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
cac0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cad0: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
cae0: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
caf0: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
cb00: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
cb10: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
cb20: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
cb30: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
cb40: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
cb50: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
cb60: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
cb70: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
cb80: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
cb90: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
cba0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
cbb0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
cbc0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cbd0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
cbe0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cbf0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
cc00: 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
cc10: 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
cc20: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
cc30: 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
cc40: 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
cc50: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
cc60: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
cc70: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
cc80: 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
cc90: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
cca0: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
ccb0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
ccc0: 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
ccd0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
cce0: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
ccf0: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
cd00: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
cd10: 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
cd20: 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
cd30: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
cd40: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
cd50: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
cd60: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
cd70: 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
cd80: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
cd90: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
cda0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
cdb0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
cdc0: 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
cdd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cde0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
cdf0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
ce00: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
ce10: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
ce20: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
ce30: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ce40: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
ce50: 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28  Cksum;.  assert(
ce60: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
ce70: 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d  pPager)<(pPager-
ce80: 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a  >pageSize+8) );.
ce90: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
cea0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28  >journalOff <= (
ceb0: 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e  hdrOff-(pPager->
cec0: 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a  pageSize+8)) ){.
ced0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
cee0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
cef0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
cf00: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
cf10: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
cf20: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
cf30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cf40: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
cf50: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
cf60: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
cf70: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
cf80: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
cf90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
cfa0: 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
cfb0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
cfc0: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
cfd0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
cfe0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
cff0: 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
d000: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d010: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
d020: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d030: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
d040: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
d050: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
d060: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
d070: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
d080: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
d090: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
d0a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
d0b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
d0c0: 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20  i=nJRec-1; i>=0 
d0d0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d0e0: 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d  alOff < szJ; i--
d0f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
d100: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d110: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
d120: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
d130: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
d140: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
d150: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d160: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d170: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
d190: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d1a0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
d1b0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
d1c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d1d0: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
d1e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
d1f0: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
d200: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
d210: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
d220: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d230: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
d240: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
d250: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
d260: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
d270: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
d280: 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68  e3pager_set_cach
d290: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
d2a0: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
d2b0: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
d2c0: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
d2d0: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
d2e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d2f0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
d300: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
d310: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
d320: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
d330: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
d340: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
d350: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
d360: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
d370: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
d380: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
d390: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
d3a0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
d3b0: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
d3c0: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
d3d0: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
d3e0: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
d3f0: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
d400: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
d410: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
d420: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
d430: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
d440: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
d450: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
d460: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
d470: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
d480: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
d490: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
d4a0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
d4b0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
d4c0: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
d4d0: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
d4e0: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
d4f0: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
d500: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
d510: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
d520: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
d530: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
d540: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
d550: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
d560: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d570: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
d580: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
d590: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
d5a0: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
d5b0: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
d5c0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
d5d0: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
d5e0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
d5f0: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
d600: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
d610: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
d620: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
d630: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
d640: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
d650: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
d660: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
d670: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
d680: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
d690: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
d6a0: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
d6c0: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
d6d0: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
d6e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d6f0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
d700: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
d710: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
d720: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
d730: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
d740: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
d750: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
d760: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
d770: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
d780: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
d790: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
d7a0: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
d7b0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
d7c0: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
d7d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
d7e0: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
d7f0: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
d800: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
d810: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d820: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
d830: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
d840: 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79  pager_set_safety
d850: 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  _level(Pager *pP
d860: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
d870: 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
d880: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
d890: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
d8a0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
d8b0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
d8c0: 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
d8d0: 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
d8e0: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
d8f0: 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66  ->full_fsync = f
d900: 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28  ull_fsync;.  if(
d910: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
d920: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
d930: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
d940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
d950: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
d960: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
d970: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
d980: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
d990: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
d9a0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
d9b0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
d9c0: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
d9d0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
d9e0: 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
d9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
da00: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
da10: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
da20: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
da30: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
da40: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
da50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
da60: 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a  file into zFile.
da70: 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62  ** (zFile must b
da80: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
da90: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
daa0: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
dab0: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
dac0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
dad0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
dae0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
daf0: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
db00: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
db10: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
db20: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
db30: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
db40: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
db50: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
db60: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
db70: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70  tic int sqlite3p
db80: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68  ager_opentemp(ch
db90: 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c  ar *zFile, OsFil
dba0: 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  e **pFd){.  int 
dbb0: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
dbc0: 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
dbd0: 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
dbe0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
dbf0: 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
dc00: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
dc10: 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
dc20: 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74  if.  do{.    cnt
dc30: 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  --;.    sqlite3O
dc40: 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46  sTempFileName(zF
dc50: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ile);.    rc = s
dc60: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
dc70: 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64  usive(zFile, pFd
dc80: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
dc90: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
dca0: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
dcb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
dcc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
dcd0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
dce0: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
dcf0: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
dd00: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
dd10: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
dd20: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
dd30: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
dd40: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
dd50: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
dd60: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
dd70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
dd80: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
dd90: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
dda0: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
ddb0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
ddc0: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
ddd0: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
dde0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
ddf0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
de00: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
de10: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
de20: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
de30: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
de40: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
de50: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
de60: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
de70: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
de80: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
de90: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dea0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
deb0: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
dec0: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
ded0: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
dee0: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
def0: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
df00: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
df10: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
df20: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
df30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
df40: 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67  ager_open(.  Pag
df50: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
df60: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
df70: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
df80: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
df90: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
dfa0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
dfb0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
dfc0: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
dfd0: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
dfe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
dff0: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
e000: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
e010: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
e020: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
e030: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
e040: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
e050: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
e060: 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
e070: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
e080: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
e090: 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d  nameLen;  /* Com
e0a0: 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20  piler is wrong. 
e0b0: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69  This is always i
e0c0: 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
e0d0: 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c  e use */.  OsFil
e0e0: 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  e *fd;.  int rc 
e0f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e100: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
e110: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
e120: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
e130: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
e140: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
e150: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
e160: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
e170: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
e180: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
e190: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
e1a0: 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65  )!=0;.  char zTe
e1b0: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
e1c0: 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66  ME_SIZE];.#ifdef
e1d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
e1e0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
e1f0: 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
e200: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
e210: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e220: 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
e230: 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
e240: 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
e250: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e260: 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
e270: 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
e280: 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
e290: 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
e2a0: 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
e2b0: 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
e2c0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
e2d0: 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
e2e0: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
e2f0: 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49  oc can be set. I
e300: 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20  t would be nice 
e310: 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74  to assert.  ** t
e320: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
e330: 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Alloc is non-zer
e340: 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73  o, but alas this
e350: 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73   breaks test cas
e360: 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  es .  ** written
e370: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70   to invoke the p
e380: 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20  ager directly.. 
e390: 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
e3a0: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
e3b0: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
e3c0: 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a  assert( pTsd );.
e3d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
e3e0: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c 72  malloc() has alr
e3f0: 65 61 64 79 20 66 61 69 6c 65 64 20 72 65 74 75  eady failed retu
e400: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
e410: 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a   Before even.  *
e420: 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 68  * testing for th
e430: 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65 72  is, set *ppPager
e440: 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20   to NULL so the 
e450: 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65  caller knows the
e460: 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72 75   pager.  ** stru
e470: 63 74 75 72 65 20 77 61 73 20 6e 65 76 65 72 20  cture was never 
e480: 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f  allocated. .  */
e490: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
e4a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
e4b0: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
e4c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e4d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
e4e0: 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69  emset(&fd, 0, si
e4f0: 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a  zeof(fd));..  /*
e500: 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
e510: 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75  file and set zFu
e520: 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f  llPathname to po
e530: 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65  int at malloc()e
e540: 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  d .  ** memory c
e550: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
e560: 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplete filename 
e570: 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20  (i.e. including 
e580: 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a  the directory)..
e590: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
e5a0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
e5b0: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
e5c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e5d0: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
e5e0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
e5f0: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
e600: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
e610: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
e620: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
e630: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c  Dup("");.    }el
e640: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
e650: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
e660: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
e670: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
e680: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
e690: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
e6a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e6b0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
e6c0: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
e6d0: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
e6e0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Only);.      }. 
e6f0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
e700: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
e710: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
e720: 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46  mp, &fd);.    zF
e730: 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b  ilename = zTemp;
e740: 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61  .    zFullPathna
e750: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
e760: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
e770: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
e780: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e790: 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d        tempFile =
e7a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
e7b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
e7c0: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
e7d0: 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65  . As part of the
e7e0: 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   same allocation
e7f0: 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  , allocate.  ** 
e800: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75  space for the fu
e810: 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20  ll paths of the 
e820: 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20  file, directory 
e830: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  and journal .  *
e840: 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  * (Pager.zFilena
e850: 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63  me, Pager.zDirec
e860: 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a  tory and Pager.z
e870: 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20  Journal)..  */. 
e880: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
e890: 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65  me ){.    nameLe
e8a0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
e8b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70  Pathname);.    p
e8c0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Pager = sqliteMa
e8d0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50  lloc( sizeof(*pP
e8e0: 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a  ager) + nameLen*
e8f0: 33 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a 0a 20  3 + 30 );.  }.. 
e900: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
e910: 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
e920: 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
e930: 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
e940: 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69  memory .  ** poi
e950: 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c  nted to by zFull
e960: 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74  Pathname, free t
e970: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e980: 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
e990: 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e   .  ** file. Sin
e9a0: 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
e9b0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
e9c0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
e9d0: 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
e9e0: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
e9f0: 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
ea00: 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
ea10: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c  zFullPathname ||
ea20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ea30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
ea40: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
ea50: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
ea60: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  athname);.    sq
ea70: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
ea80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
ea90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
eaa0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
eab0: 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22 4f    }..  TRACE3("O
eac0: 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
ead0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20  LEHANDLEID(fd), 
eae0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
eaf0: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
eb00: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
eb10: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
eb20: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
eb30: 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
eb40: 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  me[nameLen+1];. 
eb50: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
eb60: 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
eb70: 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b  rectory[nameLen+
eb80: 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  1];.  strcpy(pPa
eb90: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
eba0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
ebb0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
ebc0: 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75  >zDirectory, zFu
ebd0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20  llPathname);..  
ebe0: 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
ebf0: 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
ec00: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
ec10: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
ec20: 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
ec30: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
ec40: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61   0;.  strcpy(pPa
ec50: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
ec60: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ec70: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
ec80: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
ec90: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
eca0: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
ecb0: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
ecc0: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
ecd0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
ece0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
ecf0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
ed00: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
ed10: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
ed20: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
ed30: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
ed40: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
ed50: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
ed60: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
ed70: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
ed80: 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
ed90: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
eda0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
edb0: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
edc0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
edd0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
ede0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
edf0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
ee00: 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
ee10: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
ee20: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
ee30: 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
ee40: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
ee50: 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20  ger->nMaxPage = 
ee60: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
ee70: 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
ee80: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e  assert( PAGER_UN
ee90: 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20  LOCK==0 );.  /* 
eea0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
eeb0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
eec0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
eed0: 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
eee0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
eef0: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
ef00: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
ef10: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
ef20: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
ef30: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
ef40: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
ef50: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
ef60: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
ef70: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
ef80: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
ef90: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
efa0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
efb0: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
efc0: 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
efd0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
efe0: 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
eff0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
f000: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
f010: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
f020: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
f030: 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d  xtra);.  pPager-
f040: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
f050: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
f060: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
f070: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
f080: 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
f090: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
f0a0: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
f0b0: 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
f0c0: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
f0d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f0e0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
f0f0: 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72  AGEMENT.  pPager
f100: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e  ->pNext = pTsd->
f110: 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e  pPager;.  pTsd->
f120: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
f130: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
f140: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f150: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
f160: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
f170: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
f180: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73  te3pager_set_bus
f190: 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
f1a0: 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
f1b0: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
f1c0: 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
f1d0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
f1e0: 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
f1f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
f200: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
f210: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
f220: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
f230: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
f240: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
f250: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
f260: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
f270: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
f280: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
f290: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
f2a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
f2b0: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
f2c0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
f2d0: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
f2e0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
f2f0: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
f300: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61  result sqlite3pa
f310: 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a  ger_close().  .*
f320: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
f330: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
f340: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
f350: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
f360: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
f370: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
f380: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
f390: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e  *xDesc)(void*,in
f3a0: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
f3b0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
f3c0: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
f3d0: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
f3e0: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
f3f0: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
f400: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
f410: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
f420: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
f430: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
f440: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
f450: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
f460: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
f470: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
f480: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
f490: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
f4a0: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
f4b0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
f4c0: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
f4d0: 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
f4e0: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
f4f0: 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
f500: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f510: 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69  3pager_set_reini
f520: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
f530: 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
f540: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  t)(void*,int)){.
f550: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f560: 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
f570: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f580: 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75  page size.  Retu
f590: 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e  rn the new size.
f5a0: 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74    If the suggest
f5b0: 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a   new page.** siz
f5c0: 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61  e is inappropria
f5d0: 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
f5e0: 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
f5f0: 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a  e is selected.**
f600: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a   and returned..*
f610: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
f620: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
f630: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
f640: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
f650: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
f660: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
f670: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
f680: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
f690: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
f6a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
f6b0: 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
f6c0: 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
f6d0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f6e0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
f6f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
f700: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
f710: 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
f720: 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
f730: 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
f740: 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
f750: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
f760: 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
f770: 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
f780: 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
f790: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
f7a0: 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
f7b0: 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
f7c0: 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
f7d0: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
f7e0: 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
f7f0: 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
f800: 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
f810: 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
f820: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
f830: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
f840: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
f850: 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
f860: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
f870: 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72  _cnt;.void clear
f880: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f890: 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33  ror(){.  sqlite3
f8a0: 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20  _io_error_hit = 
f8b0: 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c  0;.}.void disabl
f8c0: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
f8d0: 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
f8e0: 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
f8f0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f900: 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
f910: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
f920: 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
f930: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f940: 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
f950: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
f960: 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
f970: 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
f980: 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69   define clear_si
f990: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f9a0: 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  ().# define disa
f9b0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f9c0: 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
f9d0: 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
f9e0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
f9f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
fa00: 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
fa10: 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
fa20: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
fa30: 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
fa40: 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
fa50: 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
fa60: 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
fa70: 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
fa80: 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
fa90: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
faa0: 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
fab0: 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
fac0: 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
fad0: 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
fae0: 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
faf0: 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
fb00: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
fb10: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
fb20: 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
fb30: 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
fb40: 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
fb50: 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
fb60: 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
fb70: 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
fb80: 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
fb90: 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
fba0: 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
fbb0: 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
fbc0: 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
fbd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fbe0: 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65 68  pager_read_fileh
fbf0: 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
fc00: 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
fc10: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
fc20: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fc30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
fc40: 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
fc50: 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
fc60: 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
fc70: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fc80: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
fc90: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
fca0: 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c  d, 0);.    enabl
fcb0: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
fcc0: 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 72 63 20  rrors();.    rc 
fcd0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
fce0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
fcf0: 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  t, N);.    if( r
fd00: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
fd10: 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
fd20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fd30: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
fd40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fd50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
fd60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
fd70: 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
fd80: 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
fd90: 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
fda0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50   .**.** If the P
fdb0: 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73  ENDING_BYTE lies
fdc0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72   on the page dir
fdd0: 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
fde0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
fdf0: 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  le, then conside
fe00: 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74  r this page part
fe10: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f   of the file too
fe20: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
fe30: 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54  f.** PENDING_BYT
fe40: 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28  E is byte 4096 (
fe50: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
fe60: 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68  f page 5) and th
fe70: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
fe80: 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79   file is 4096 by
fe90: 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e  tes, 5 is return
fea0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e  ed instead of 4.
feb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
fec0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
fed0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
fee0: 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63   i64 n;.  int rc
fef0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ff00: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
ff10: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
ff20: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67   ){.    n = pPag
ff30: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20  er->dbSize;.  } 
ff40: 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20 28  else {.    if( (
ff50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
ff60: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
ff70: 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f  d, &n))!=SQLITE_
ff80: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
ff90: 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
ffa0: 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
ffb0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
ffc0: 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
ffd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
ffe0: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
fff0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
10000 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
10010 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
10020 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
10030 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
10040 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10050 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  dbSize = n;.    
10060 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28  }.  }.  if( n==(
10070 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
10080 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
10090 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
100a0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
100b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
100c0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
100d0 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
100e0 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
100f0 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
10100 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
10110 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
10120 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
10130 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
10140 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
10150 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
10160 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
10170 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
10180 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
10190 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
101a0 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
101b0 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
101c0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
101d0 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
101e0 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
101f0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
10200 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
10210 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
10220 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
10230 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
10240 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
10250 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
10260 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
10270 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
10280 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76  sqlite3pager_mov
10290 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
102a0 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
102b0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
102c0 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
102d0 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
102e0 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
102f0 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
10300 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
10310 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
10320 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
10330 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
10340 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
10350 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
10360 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
10370 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
10380 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
10390 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
103a0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
103b0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
103c0 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
103d0 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
103e0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
103f0 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sh ){.    assert
10400 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
10410 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
10420 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d  ger->nHash-1)]!=
10430 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
10440 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
10450 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
10460 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
10470 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d      int h = pPg-
10480 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
10490 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70  >nHash-1);.    p
104a0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
104b0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
104c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
104d0 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69  B ){.    clearHi
104e0 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
104f0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
10500 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67  );.  }.  pPg->pg
10510 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
10520 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
10530 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
10540 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
10550 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
10560 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
10570 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
10580 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
10590 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
105a0 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
105b0 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
105c0 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
105d0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
105e0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
105f0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
10600 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74   Keep the pFirst
10610 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70  Synced pointer p
10620 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66  ointing at the f
10630 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65  irst synchronize
10640 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  d page */.  if( 
10650 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
10660 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
10670 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
10680 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
10690 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
106a0 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
106b0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
106c0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
106d0 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
106e0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
106f0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
10700 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  */.  if( pPg->pP
10710 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70  revFree ){.    p
10720 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
10730 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
10740 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c  pNextFree;.  }el
10750 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
10760 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
10770 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
10780 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
10790 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a  >pNextFree;.  }.
107a0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
107b0 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
107c0 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
107d0 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
107e0 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  evFree;.  }else{
107f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
10800 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
10810 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
10820 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
10830 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67  vFree;.  }.  pPg
10840 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
10850 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
10860 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
10870 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
10880 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c  h table */.  unl
10890 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
108a0 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69  ger, pPg);.}..#i
108b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
108c0 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
108d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
108e0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
108f0 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
10900 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65  atabase.  Delete
10910 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68  .** all pages wh
10920 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
10930 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
10940 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
10950 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
10960 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
10970 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
10980 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
10990 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
109a0 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
109b0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
109c0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
109d0 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
109e0 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
109f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
10a00 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
10a10 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
10a20 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
10a30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
10a40 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
10a50 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
10a60 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
10a70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10a80 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
10a90 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
10aa0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
10ab0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
10ac0 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
10ad0 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
10ae0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
10af0 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
10b00 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
10b10 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
10b20 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ;.      makeClea
10b30 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  n(pPg);.      sq
10b40 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
10b50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
10b60 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
10b70 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
10b80 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
10b90 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10ba0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
10bb0 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
10bc0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
10bd0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
10be0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
10bf0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
10c00 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
10c10 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
10c20 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
10c30 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
10c40 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
10c50 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
10c60 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
10c70 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
10c80 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
10c90 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
10ca0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
10cb0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
10cc0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
10cd0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
10ce0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
10cf0 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
10d00 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
10d10 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
10d20 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
10d30 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
10d40 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
10d50 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
10d60 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
10d70 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
10d80 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
10d90 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
10da0 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
10db0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
10dc0 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
10dd0 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
10de0 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
10df0 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
10e00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10e10 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
10e20 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
10e30 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
10e40 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
10e50 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
10e60 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
10e70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
10e80 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
10e90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10ea0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
10eb0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
10ec0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
10ed0 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
10ee0 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
10ef0 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
10f00 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
10f10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10f20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
10f30 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
10f40 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  type;.    }.  }.
10f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10f60 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
10f70 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
10f80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
10f90 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
10fa0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
10fb0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
10fc0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
10fd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
10fe0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
10ff0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
11000 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20  ED || MEMDB );. 
11010 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
11020 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
11030 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
11040 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
11050 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
11060 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
11070 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
11080 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
11090 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
110a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
110b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
110c0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
110d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
110e0 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  age;.    memoryT
110f0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
11100 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11110 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
11120 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
11130 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
11140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11160 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78  ..  /* Get an ex
11170 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
11180 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
11190 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20  ore truncating. 
111a0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
111b0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
111c0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
111d0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
111e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
111f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11200 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
11210 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
11220 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
11230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11240 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
11250 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
11260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11270 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
11280 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
11290 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
112a0 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
112b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
112c0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
112d0 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
112e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
112f0 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
11300 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
11310 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
11320 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
11330 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
11340 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
11350 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
11360 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
11370 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
11380 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
11390 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
113a0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
113b0 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
113c0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
113d0 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
113e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
113f0 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
11400 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
11410 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
11420 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
11430 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
11440 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
11450 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
11460 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
11470 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
11480 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
11490 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
114a0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
114b0 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
114c0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
114d0 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
114e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
114f0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
11500 2a 70 4e 65 78 74 3b 0a 23 69 66 64 65 66 20 53  *pNext;.#ifdef S
11510 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
11520 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
11530 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63   /* A malloc() c
11540 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71  annot fail in sq
11550 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
11560 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ) as one or more
11570 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20   calls to .  ** 
11580 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61  malloc() must ha
11590 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
115a0 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72  made by this thr
115b0 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65  ead before it ge
115c0 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ts.  ** to this 
115d0 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e  point. This mean
115e0 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  s the ThreadData
115f0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
11600 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64  allocated alread
11610 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54  y.  ** so that T
11620 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
11630 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a   can be set..  *
11640 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  /.  ThreadData *
11650 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68  pTsd = sqlite3Th
11660 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73  readData();.  as
11670 73 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a  sert( pPager );.
11680 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26    assert( pTsd &
11690 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29  & pTsd->nAlloc )
116a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  ;.#endif..  swit
116b0 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ch( pPager->stat
116c0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
116d0 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20  GER_RESERVED:.  
116e0 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e    case PAGER_SYN
116f0 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50  CED: .    case P
11700 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20  AGER_EXCLUSIVE: 
11710 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 69 67  {.      /* We ig
11720 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f  nore any IO erro
11730 72 73 20 74 68 61 74 20 6f 63 63 75 72 20 64 75  rs that occur du
11740 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
11750 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61  k.      ** opera
11760 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62 6c 65  tion. So disable
11770 20 49 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c 61   IO error simula
11780 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 65 73  tion so that tes
11790 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 77 6f  ting.      ** wo
117a0 72 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 2e  rks more easily.
117b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
117c0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
117d0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
117e0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
117f0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
11800 72 29 3b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65  r);.      enable
11810 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11820 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 70 61  rors();.      pa
11830 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
11840 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
11850 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
11860 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
11870 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
11880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11890 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  }.    case PAGER
118a0 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20  _SHARED: {.     
118b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
118c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 62 72 65  ager);.      bre
118d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
118e0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
118f0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
11900 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11910 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67   }.  }.  for(pPg
11920 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
11930 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
11940 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11950 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
11960 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
11970 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
11980 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
11990 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
119a0 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
119b0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
119c0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
119d0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
119e0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
119f0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
11a00 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20  endif.    pNext 
11a10 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
11a20 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11a30 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43  pPg);.  }.  TRAC
11a40 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
11a50 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
11a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11a70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
11a80 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
11a90 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
11aa0 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
11ab0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
11ac0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
11ad0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11ae0 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
11af0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
11b00 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
11b10 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
11b20 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
11b30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11b40 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
11b50 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
11b60 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
11b70 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
11b80 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
11b90 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
11ba0 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
11bb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
11bc0 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
11bd0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11be0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
11bf0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
11c00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11c10 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
11c20 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
11c30 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
11c40 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
11c50 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
11c60 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54  rting at .  ** T
11c70 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72  hreadData.pPager
11c80 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
11c90 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
11ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
11cb0 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65  ger==pTsd->pPage
11cc0 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70  r ){.    pTsd->p
11cd0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  Pager = pPager->
11ce0 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
11cf0 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b      Pager *pTmp;
11d00 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20  .    for(pTmp = 
11d10 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54  pTsd->pPager; pT
11d20 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65  mp->pNext!=pPage
11d30 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  r; pTmp=pTmp->pN
11d40 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d  ext){}.    pTmp-
11d50 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
11d60 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64  >pNext;.  }.#end
11d70 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  if.  sqliteFree(
11d80 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
11d90 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
11da0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
11db0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11dc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
11dd0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
11de0 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
11df0 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
11e00 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  e3pager_pagenumb
11e10 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  er(void *pData){
11e20 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41  .  PgHdr *p = DA
11e30 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
11e40 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  a);.  return p->
11e50 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pgno;.}../*.** T
11e60 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75  he page_ref() fu
11e70 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74  nction increment
11e80 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
11e90 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
11ea0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  ..** If the page
11eb0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
11ec0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
11ed0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
11ee0 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
11ef0 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
11f00 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
11f10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74  .**.** For non-t
11f20 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
11f30 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63  e_ref() is a mac
11f40 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70  ro that calls _p
11f50 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c  age_ref().** onl
11f60 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72  ine of the refer
11f70 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
11f80 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79  ro.  For test sy
11f90 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
11fa0 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66  ).** is a real f
11fb0 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  unction so that 
11fc0 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b  we can set break
11fd0 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65  points and trace
11fe0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
11ff0 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67  oid _page_ref(Pg
12000 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
12010 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
12020 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
12030 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
12040 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
12050 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
12060 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e    if( pPg==pPg->
12070 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12080 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  nced ){.      Pg
12090 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
120a0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77  extFree;.      w
120b0 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
120c0 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
120d0 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
120e0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
120f0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
12100 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
12110 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
12120 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
12130 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
12140 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
12150 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
12160 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
12170 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
12180 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
12190 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
121a0 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
121b0 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
121c0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
121d0 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
121e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
121f0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73  Pg->pPager->pLas
12200 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
12210 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ee;.    }.    pP
12220 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
12230 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
12240 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
12250 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  pPg);.}.#ifdef S
12260 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74  QLITE_DEBUG.  st
12270 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
12280 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
12290 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
122a0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70  f==0 ){.      _p
122b0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
122c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
122d0 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Pg->nRef++;.    
122e0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
122f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
12300 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65  # define page_re
12310 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65  f(P)   ((P)->nRe
12320 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50  f==0?_page_ref(P
12330 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65  ):(void)(P)->nRe
12340 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  f++).#endif../*.
12350 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
12360 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12370 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
12380 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
12390 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
123a0 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
123b0 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
123c0 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  e3pager_ref(void
123d0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
123e0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
123f0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
12400 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
12410 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12420 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
12430 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
12440 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12450 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
12460 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
12470 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
12480 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
12490 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
124a0 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
124b0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
124c0 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
124d0 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
124e0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
124f0 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
12500 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
12510 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
12520 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
12530 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
12540 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
12550 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
12560 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
12570 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
12580 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
12590 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
125a0 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
125b0 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
125c0 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
125d0 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
125e0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
125f0 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
12600 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
12610 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
12620 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
12630 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
12640 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
12650 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
12660 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
12670 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
12680 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
12690 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
126a0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
126b0 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
126c0 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
126d0 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
126e0 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
126f0 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
12700 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
12710 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
12720 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
12730 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
12740 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
12750 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
12760 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
12770 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
12780 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
12790 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
127a0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
127b0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
127c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
127d0 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
127e0 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
127f0 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
12800 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
12810 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
12820 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
12830 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12840 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
12850 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12860 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  ;..  /* Sync the
12870 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
12880 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61  modifying the ma
12890 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  in database.  **
128a0 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65   (assuming there
128b0 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e   is a journal an
128c0 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  d it needs to be
128d0 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20   synced.).  */. 
128e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
128f0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
12900 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
12910 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  le ){.      asse
12920 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
12930 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
12940 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
12950 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
12960 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
12970 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
12980 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
12990 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
129a0 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
129b0 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
129c0 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
129d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
129e0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
129f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
12a00 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
12a10 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
12a20 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
12a30 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
12a40 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
12a50 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
12a60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
12a70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12a80 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20     i64 jSz;.    
12a90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12aa0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
12ab0 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
12ac0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
12ad0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12b00 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d  ==jSz );.      }
12b10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
12b20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
12b30 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
12b40 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
12b50 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
12b60 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
12b70 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
12b80 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
12b90 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
12ba0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
12bb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
12bc0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
12bd0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
12be0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
12bf0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
12c00 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
12c10 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
12c20 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a  back. .        *
12c30 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
12c40 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
12c50 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  {.          TRAC
12c60 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
12c70 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
12c80 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
12c90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12ca0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
12cb0 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
12cc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
12cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
12cf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
12d00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  (pPager->jfd,.  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
12d30 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
12d40 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
12d50 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ic));.        if
12d60 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12d70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
12d80 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
12d90 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
12da0 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
12db0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12dc0 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
12dd0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
12de0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
12e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
12e10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12e20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
12e30 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
12e40 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
12e50 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
12e60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12e70 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
12e80 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
12e90 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  sync);.      if(
12ea0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
12eb0 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
12ec0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
12ed0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
12ee0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
12ef0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
12f00 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
12f10 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
12f20 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
12f30 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
12f40 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
12f50 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
12f60 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
12f70 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
12f80 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
12f90 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
12fa0 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
12fb0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
12fc0 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
12fd0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
12fe0 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
12ff0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
13000 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
13010 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
13020 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
13030 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
13040 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
13050 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
13060 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
13070 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
13080 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
13090 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
130a0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
130b0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
130c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
130d0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
130e0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
130f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13110 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
13120 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
13130 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
13140 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
13150 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
13160 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
13170 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
13180 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
13190 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
131a0 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
131b0 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
131c0 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
131d0 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
131e0 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
131f0 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
13200 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
13210 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
13220 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
13230 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
13240 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
13250 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
13260 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
13270 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
13280 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
13290 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
132a0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
132b0 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
132c0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
132d0 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
132e0 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
132f0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
13310 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
13320 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
13330 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
13340 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
13350 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
13360 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
13370 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
13380 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
13390 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
133a0 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
133b0 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
133c0 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
133d0 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
133e0 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
133f0 43 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20 50  CKET 25.static P
13400 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
13410 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
13420 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
13430 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a  RT_BUCKET], *p;.
13440 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65    int i;.  memse
13450 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  t(a, 0, sizeof(a
13460 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  ));.  while( pIn
13470 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b   ){.    p = pIn;
13480 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44  .    pIn = p->pD
13490 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
134a0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  rty = 0;.    for
134b0 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=0; i<N_SORT_B
134c0 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20  UCKET-1; i++){. 
134d0 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30       if( a[i]==0
134e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d   ){.        a[i]
134f0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72   = p;.        br
13500 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
13510 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65  {.        p = me
13520 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
13530 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61  ], p);.        a
13540 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
13550 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13560 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  ==N_SORT_BUCKET-
13570 31 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20  1 ){.      a[i] 
13580 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
13590 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d  (a[i], p);.    }
135a0 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b  .  }.  p = a[0];
135b0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f  .  for(i=1; i<N_
135c0 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b  SORT_BUCKET; i++
135d0 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65  ){.    p = merge
135e0 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69  _pagelist(p, a[i
135f0 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
13600 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
13610 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
13620 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
13630 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
13640 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
13650 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
13660 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
13670 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13680 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74   file and mark t
13690 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c  hem all.** as cl
136a0 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ean..*/.static i
136b0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
136c0 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
136d0 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
136e0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
136f0 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
13700 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
13710 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
13720 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
13730 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
13740 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
13750 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
13760 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
13770 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
13780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13790 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
137a0 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
137b0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
137c0 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
137d0 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
137e0 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
137f0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
13800 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
13810 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
13820 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
13830 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
13840 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
13850 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
13860 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
13870 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
13880 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
13890 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
138a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
138b0 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
138c0 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
138d0 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
138e0 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
138f0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
13900 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
13910 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
13920 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
13930 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
13940 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
13950 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
13960 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
13970 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
13980 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
13990 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
139a0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
139b0 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
139c0 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
139d0 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
139e0 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
139f0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
13a00 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
13a10 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
13a20 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
13a30 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
13a40 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
13a50 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
13a60 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
13a70 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
13a80 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
13a90 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
13aa0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
13ab0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
13ac0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
13ad0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
13ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13b00 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
13b10 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
13b20 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
13b30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13b40 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
13b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13b60 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
13b70 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d  d, (pList->pgno-
13b80 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
13b90 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
13ba0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13bb0 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  c;.    /* If the
13bc0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
13bd0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
13be0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
13bf0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
13c00 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
13c10 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
13c20 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65 72  ans sqlite3pager
13c30 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  _truncate() was 
13c40 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
13c50 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
13c60 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
13c70 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
13c80 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
13c90 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
13ca0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
13cb0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
13cc0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
13cd0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
13ce0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ize ){.      cha
13cf0 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
13d00 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  2(pPager, PGHDR_
13d10 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
13d20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
13d30 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53  .      TRACE3("S
13d40 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
13d50 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13d60 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
13d70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13d80 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
13d90 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
13da0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13db0 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e  );.      TEST_IN
13dc0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
13dd0 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
13de0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
13df0 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  e{.      TRACE3(
13e00 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
13e10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
13e20 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
13e30 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
13e40 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
13e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13e60 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
13e70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13e80 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
13e90 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
13ea0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
13eb0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
13ec0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
13ed0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
13ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ef0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
13f00 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
13f10 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
13f20 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
13f30 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
13f40 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
13f50 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
13f60 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
13f70 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
13f80 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
13f90 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
13fa0 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
13fb0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
13fc0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
13fd0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
13fe0 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
13ff0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14000 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
14010 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
14020 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
14030 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
14040 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
14050 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
14060 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
14070 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
14080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14090 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
140a0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
140b0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
140c0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
140d0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
140e0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
140f0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
14100 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
14110 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
14120 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
14130 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
14140 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14150 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
14160 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
14170 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
14180 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
14190 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
141a0 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  l) ) return 0;. 
141b0 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68   if( sqlite3OsCh
141c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
141d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65  pPager->fd) ) re
141e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
141f0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
14200 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20  ount(pPager)==0 
14210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
14220 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
14230 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65  Journal);.    re
14240 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
14250 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
14260 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
14270 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
14280 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
14290 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64   can be recycled
142a0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  . .**.** This ro
142b0 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e  utine may return
142c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
142d0 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51  QLITE_FULL or SQ
142e0 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20  LITE_OK. It .** 
142f0 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65  does not set the
14300 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
14310 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
14320 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72  atic int pager_r
14330 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50  ecycle(Pager *pP
14340 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b  ager, int syncOk
14350 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
14360 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
14370 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f   *ppPg = 0;..  /
14380 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
14390 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
143a0 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
143b0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
143c0 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f  ** require us to
143d0 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f   do an fsync() o
143e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20  n the journal.. 
143f0 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67   */.  pPg = pPag
14400 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
14410 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  ;..  /* If we co
14420 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
14430 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
14440 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
14450 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  nc().  ** on the
14460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
14470 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75  en fsync the jou
14480 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
14490 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20   is a.  ** very 
144a0 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20  slow operation, 
144b0 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20  so we work hard 
144c0 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75  to avoid it.  Bu
144d0 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a  t sometimes.  **
144e0 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c   it can't be hel
144f0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
14500 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pPg==0 && pPager
14510 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e 63  ->pFirst && sync
14520 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20  Ok && !MEMDB){. 
14530 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63     int rc = sync
14540 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
14550 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
14560 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
14570 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
14580 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
14590 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
145a0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
145b0 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20  de, write a new 
145c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
145d0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
145e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
145f0 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61  his is done to a
14600 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79  void ever modify
14610 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  ing a journal.  
14620 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68      ** header th
14630 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  at is involved i
14640 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f  n the rollback o
14650 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14660 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  e.      ** alrea
14670 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
14680 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14690 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61  (in case the hea
146a0 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  der is.      ** 
146b0 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65  trashed when the
146c0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
146d0 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a  pdated)..      *
146e0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
146f0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
14700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14710 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29  journalOff > 0 )
14720 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
14730 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
14740 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
14750 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
14760 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
14780 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
14790 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  st;.  }.  if( pP
147a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
147b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
147c0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  }..  assert( pPg
147d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
147e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
147f0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
14800 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
14810 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  dirty..  */.  if
14820 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
14830 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
14840 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
14850 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
14860 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
14870 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
14880 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
14890 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
148a0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
148b0 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
148c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
148d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
148e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
148f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
14900 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
14910 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
14920 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
14930 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
14940 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
14950 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
14960 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
14970 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
14980 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
14990 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
149a0 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
149b0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
149c0 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
149d0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
149e0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
149f0 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
14a00 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
14a10 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
14a20 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
14a30 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
14a40 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
14a50 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
14a60 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
14a70 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
14a80 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
14a90 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
14aa0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
14ab0 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
14ac0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
14ad0 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
14ae0 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
14af0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
14b00 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 50 61  lback ){.    pPa
14b10 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
14b20 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ack = 1;.  }..  
14b30 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
14b40 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
14b50 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
14b60 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a  e hash table.  *
14b70 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70  /.  unlinkPage(p
14b80 50 67 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43 52  Pg);.  TEST_INCR
14b90 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b  (pPager->nOvfl);
14ba0 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
14bb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14bc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
14bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14be0 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
14bf0 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
14c00 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
14c10 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
14c20 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
14c30 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
14c40 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
14c50 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
14c60 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
14c70 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
14c80 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a  sqliteFree()ed..
14c90 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
14ca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14cb0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
14cc0 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
14cd0 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
14ce0 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
14cf0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
14d00 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
14d10 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73  e for nReq means
14d20 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68  .** free as much
14d30 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
14d40 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ble. The return 
14d50 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
14d60 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
14d70 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
14d80 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69   released..*/.#i
14d90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14da0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
14db0 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  MENT.int sqlite3
14dc0 70 61 67 65 72 5f 72 65 6c 65 61 73 65 5f 6d 65  pager_release_me
14dd0 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
14de0 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61    const ThreadDa
14df0 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c  ta *pTsdro = sql
14e00 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
14e10 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65  adOnly();.  Page
14e20 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c  r *p;.  int nRel
14e30 65 61 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74  eased = 0;.  int
14e40 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   i;..  /* If the
14e50 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
14e60 78 20 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20  x is held, this 
14e70 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d  subroutine becom
14e80 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20  es a.  ** o-op; 
14e90 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65  zero bytes of me
14ea0 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e 20  mory are freed. 
14eb0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
14ec0 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  .  ** some of th
14ed0 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62  e code invoked b
14ee0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
14ef0 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72  may also.  ** tr
14f00 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  y to obtain the 
14f10 6d 75 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67  mutex, resulting
14f20 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a   in a deadlock..
14f30 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
14f40 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29  e3OsInMutex(0) )
14f50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
14f60 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d    }..  /* Outerm
14f70 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f  ost loop runs fo
14f80 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74  r at most two it
14f90 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20  erations. First 
14fa0 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a  iteration we.  *
14fb0 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65  * try to find me
14fc0 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  mory that can be
14fd0 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75   released withou
14fe0 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  t calling fsync(
14ff0 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69  ). Second.  ** i
15000 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20  teration (which 
15010 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65  only runs if the
15020 20 66 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f   first failed to
15030 20 66 72 65 65 20 6e 52 65 71 20 62 79 74 65 73   free nReq bytes
15040 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29   of.  ** memory)
15050 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
15060 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54   call fsync(). T
15070 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65  his is of course
15080 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a   much more .  **
15090 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f   expensive..  */
150a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31  .  for(i=0; i<=1
150b0 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20  ; i++){..    /* 
150c0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
150d0 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 67 65   the SQLite page
150e0 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  rs opened by the
150f0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
15100 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54   */.    for(p=pT
15110 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20  sdro->pPager; p 
15120 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52  && (nReq<0 || nR
15130 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70  eleased<nReq); p
15140 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
15150 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
15160 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
15170 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70     /* For each p
15180 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65  ager, try to fre
15190 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20  e as many pages 
151a0 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74  as possible (wit
151b0 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63  hout .      ** c
151c0 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69  alling fsync() i
151d0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
151e0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
151f0 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a   the outermost .
15200 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a        ** loop)..
15210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77        */.      w
15220 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
15230 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63  =(rc = pager_rec
15240 79 63 6c 65 28 70 2c 20 69 2c 20 26 70 50 67 29  ycle(p, i, &pPg)
15250 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20  ) && pPg) {.    
15260 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75      /* We've fou
15270 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65  nd a page to fre
15280 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
15290 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
152a0 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  en .        ** r
152b0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
152c0 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
152d0 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
152e0 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
152f0 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79      ** (pFirstSy
15300 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69  nced). It is sti
15310 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61  ll in the all pa
15320 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e  ges (pAll) list.
15330 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d   .        ** Rem
15340 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73  ove it from this
15350 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65   list before fre
15360 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a  eing..        **
15370 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f  .        ** Todo
15380 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65  : Check the Page
15390 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20  r.pStmt list to 
153a0 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69  make sure this i
153b0 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20  s Ok. It .      
153c0 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73    ** probably is
153d0 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20   though..       
153e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64   */.        PgHd
153f0 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20  r *pTmp;.       
15400 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
15410 20 20 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d          page_rem
15420 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
15430 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  st(pPg);.       
15440 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c   if( pPg==p->pAl
15450 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
15460 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  p->pAll = pPg->p
15470 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
15480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15490 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70    for( pTmp=p->p
154a0 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  All; pTmp->pNext
154b0 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70  All!=pPg; pTmp=p
154c0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b  Tmp->pNextAll ){
154d0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d 70  }.          pTmp
154e0 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67  ->pNextAll = pPg
154f0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
15500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52      }.        nR
15510 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74  eleased += sqlit
15520 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b  eAllocSize(pPg);
15530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
15540 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
15550 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
15560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15570 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
15580 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
15590 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
155a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
155b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75   .        ** jou
155c0 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65  rnal in pager_re
155d0 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72  cycle(). The err
155e0 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  or is not return
155f0 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ed to the .     
15600 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20     ** caller of 
15610 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
15620 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20  nstead, set the 
15630 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
15640 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  riable..        
15650 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c  ** The error wil
15660 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
15670 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73   the user (or us
15680 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65  ers, in the case
15690 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20   .        ** of 
156a0 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63  a shared pager c
156b0 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67  ache) of the pag
156c0 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
156d0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a   error occured..
156e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
156f0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 26 30     assert( (rc&0
15700 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
15710 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  RR || rc==SQLITE
15720 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  _FULL );.       
15730 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
15740 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
15750 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  D );.        pag
15760 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b  er_error(p, rc);
15770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15780 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65   }..  return nRe
15790 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  leased;.}.#endif
157a0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
157b0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
157c0 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63  ENT */../*.** Ac
157d0 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
157e0 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
157f0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
15800 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
15810 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
15820 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
15830 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
15840 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
15850 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
15860 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
15870 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
15880 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
15890 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
158a0 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
158b0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
158c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
158d0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
158e0 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
158f0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
15900 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
15910 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
15920 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
15930 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
15940 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
15950 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
15960 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
15970 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
15980 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
15990 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
159a0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
159b0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
159c0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
159d0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
159e0 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
159f0 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
15a00 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
15a10 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
15a20 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
15a30 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
15a40 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
15a50 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
15a60 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
15a70 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
15a80 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
15a90 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
15aa0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
15ab0 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
15ac0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
15ad0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
15ae0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
15af0 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
15b00 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
15b10 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
15b20 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
15b30 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
15b40 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
15b50 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
15b60 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
15b70 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
15b80 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
15b90 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
15ba0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
15bb0 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
15bc0 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
15bd0 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
15be0 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
15bf0 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
15c00 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
15c10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15c20 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
15c30 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
15c40 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
15c50 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
15c60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
15c70 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
15c80 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
15c90 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
15ca0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
15cb0 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
15cc0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
15cd0 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
15ce0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
15cf0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
15d00 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
15d10 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
15d20 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
15d30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
15d40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15d50 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
15d60 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
15d70 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
15d80 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
15d90 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
15da0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
15db0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
15dc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
15dd0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
15de0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
15df0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
15e00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
15e10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
15e20 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
15e30 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
15e40 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
15e50 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
15e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
15e70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
15e80 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
15e90 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21  MDB ){.    if( !
15ea0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
15eb0 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ck ){.      rc =
15ec0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
15ed0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
15ee0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
15ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15f00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
15f10 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
15f20 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
15f30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
15f40 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
15f50 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
15f60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
15f70 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
15f80 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
15f90 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
15fa0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
15fb0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
15fc0 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
15fd0 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f 74  /.    if( hasHot
15fe0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20  Journal(pPager) 
15ff0 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ){.       /* Get
16000 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
16010 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16020 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
16030 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
16040 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
16050 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
16060 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
16070 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
16080 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a   to the.       *
16090 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
160a0 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
160b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
160c0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
160d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
160e0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
160f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
16100 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
16110 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  t the.       ** 
16120 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
16130 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
16140 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
16150 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
16160 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e  .       ** back.
16170 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  .       ** .    
16180 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
16190 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
161a0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
161b0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
161c0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63  he.       ** sec
161d0 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
161e0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
161f0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
16200 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
16210 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73    ** obtain it's
16220 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
16230 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16240 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
16250 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
16260 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
16270 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
16280 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
16290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
162a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
162b0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
162c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 72  ger);.         r
162d0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
162e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
162f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
16300 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
16310 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
16320 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .       /* Open 
16330 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
16340 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52  reading only.  R
16350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
16360 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77  Y if.       ** w
16370 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
16380 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
16390 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a   file. .       *
163a0 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  *.       ** The 
163b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
163c0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
163d0 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20   locked itself. 
163e0 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a   The.       ** j
163f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
16400 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73  ever open unless
16410 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
16420 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20  se file holds.  
16430 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
16440 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
16450 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
16460 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
16470 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e.       ** proc
16480 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
16490 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
164a0 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
164b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
164c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
164d0 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e  eadOnly(pPager->
164e0 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
164f0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
16500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16510 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 61  K ){.         pa
16520 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
16530 72 29 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  r);.         ret
16540 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
16550 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
16560 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16570 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
16580 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16590 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
165a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
165b0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
165c0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
165d0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
165e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
165f0 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Hdr = 0;..      
16600 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
16610 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
16620 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
16630 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
16640 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
16650 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
16660 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
16670 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
16680 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
16690 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69  Pager);.       i
166a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
166b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
166c0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
166d0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
166e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
166f0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
16700 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
16710 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
16720 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
16730 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16740 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  er, pgno);.    i
16750 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
16760 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
16770 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
16780 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
16790 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
167a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
167b0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
167c0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
167d0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
167e0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
167f0 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
16800 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
16810 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28  >nMiss);.    if(
16820 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
16830 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
16840 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
16850 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  =0 || MEMDB ){. 
16860 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
16870 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20   new page */.   
16880 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
16890 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48  Page>=pPager->nH
168a0 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ash ){.        p
168b0 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
168c0 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20  _table(pPager,. 
168d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
168e0 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35  ->nHash<256 ? 25
168f0 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  6 : pPager->nHas
16900 68 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  h*2);.        if
16910 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
16920 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
16940 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
16950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
16960 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
16970 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
16980 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
16990 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169b0 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
169c0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
169d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
169f0 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
16a00 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
16a10 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
16a20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16a30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
16a40 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
16a50 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pPg, 0, sizeof
16a60 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69  (*pPg));.      i
16a70 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16a80 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
16a90 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
16aa0 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
16ab0 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
16ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
16ad0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
16ae0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
16af0 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
16b00 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67  pAll;.      pPag
16b10 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
16b20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
16b30 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
16b40 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70   pPager->nPage>p
16b50 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
16b60 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16b70 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  t( pPager->nMaxP
16b80 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50  age==(pPager->nP
16b90 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  age-1) );.      
16ba0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61    pPager->nMaxPa
16bb0 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge++;.      }.  
16bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16bd0 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
16be0 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  e(pPager, 1, &pP
16bf0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
16c00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16c10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16c30 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20 20  assert(pPg) ;.  
16c40 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
16c50 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
16c60 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
16c70 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
16c80 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
16c90 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
16ca0 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
16cb0 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
16cc0 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
16cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16ce0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
16cf0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
16d00 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
16d10 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
16d20 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
16d30 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
16d40 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
16d50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16d60 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
16d70 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
16d80 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
16d90 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
16da0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
16db0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
16dc0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a  Pager->stmtSize.
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
16de0 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
16df0 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
16e00 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a  pgno&7)))!=0 ){.
16e10 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
16e20 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
16e30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16e40 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
16e50 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
16e60 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61  g);.    }.    ma
16e70 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
16e80 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
16e90 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
16ea0 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  );..    pPager->
16eb0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
16ec0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
16ed0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16ee0 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
16ef0 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
16f00 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
16f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16f20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
16f30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16f40 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
16f50 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
16f60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67  .      rc = pPag
16f70 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
16f80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16f90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75    }..    /* Popu
16fa0 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77 69  late the page wi
16fb0 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72 20  th data, either 
16fc0 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  by reading from 
16fd0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
16fe0 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20   ** file, or by 
16ff0 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69  setting the enti
17000 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e  re page to zero.
17010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17020 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
17030 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c 28  ecount(pPager)<(
17040 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
17050 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  B ){.      memse
17060 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
17070 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
17080 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
170a0 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
170b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
170c0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
170d0 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
170e0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
170f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
17100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17110 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
17120 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
17130 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
17140 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20  O_DATA(pPg),.   
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
17170 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17180 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
17190 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
171a0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
171b0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
171c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
171d0 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C1(pPager, PGHDR
171e0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
171f0 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
17200 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17210 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
17220 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
17230 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
17240 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
17250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
17260 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
17270 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
17280 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17290 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
172a0 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52         TEST_INCR
172b0 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
172c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
172d0 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
172e0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
172f0 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
17300 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  .    h = pgno & 
17310 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
17320 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17330 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  gno!=0 );.    pP
17340 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
17350 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
17360 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
17370 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
17380 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
17390 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
173a0 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
173b0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
173c0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
173d0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
173e0 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
173f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17400 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
17410 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
17420 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
17430 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
17440 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
17450 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
17460 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
17470 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53  ache. */.    TES
17480 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
17490 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72  Hit);.    page_r
174a0 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
174b0 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
174c0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
174d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
174e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
174f0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
17500 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
17510 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
17520 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
17530 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
17540 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
17550 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
17560 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
17570 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17580 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
17590 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
175a0 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
175b0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
175c0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
175d0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
175e0 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
175f0 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
17600 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
17610 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
17620 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
17630 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
17640 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
17650 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
17660 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
17670 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
17680 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
17690 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
176a0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
176b0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
176c0 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
176d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
176e0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
176f0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
17700 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
17710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
17720 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
17730 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
17740 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
17750 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
17760 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17770 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
17780 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
17790 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
177a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
177b0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
177c0 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
177d0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
177e0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
177f0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
17800 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
17810 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
17820 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
17830 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
17840 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
17850 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
17860 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
17870 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
17880 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
17890 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
178a0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
178b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
178c0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
178d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
178e0 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44  r_unref(void *pD
178f0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
17900 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  Pg;..  /* Decrem
17910 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
17920 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
17930 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67   page.  */.  pPg
17940 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
17950 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
17960 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
17970 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
17980 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
17990 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
179a0 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
179b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
179c0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
179d0 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
179e0 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
179f0 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
17a00 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
17a10 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
17a20 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
17a30 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
17a40 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ger;.    pPager 
17a50 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
17a60 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
17a70 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  e = 0;.    pPg->
17a80 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67  pPrevFree = pPag
17a90 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70  er->pLast;.    p
17aa0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
17ab0 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
17ac0 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
17ad0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
17ae0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
17af0 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pPg;.    }else{.
17b00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
17b10 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  irst = pPg;.    
17b20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
17b30 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  eedSync==0 && pP
17b40 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17b50 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ed==0 ){.      p
17b60 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17b70 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ced = pPg;.    }
17b80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17b90 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
17ba0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
17bb0 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c  estructor(pData,
17bc0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17bd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
17be0 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
17bf0 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
17c00 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
17c10 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
17c20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17c30 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
17c40 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
17c50 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
17c60 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
17c70 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17c80 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
17c90 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61  EMDB ){.      pa
17ca0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
17ce0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
17cf0 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
17d00 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
17d10 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
17d20 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
17d30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17d40 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
17d50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17d60 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
17d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
17d80 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
17d90 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17da0 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
17db0 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
17dc0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
17dd0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
17de0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
17df0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
17e00 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
17e10 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
17e20 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
17e30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
17e40 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
17e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
17e60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
17e70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
17e80 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
17e90 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
17ea0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17eb0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
17ec0 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
17ed0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
17ee0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17ef0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
17f00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
17f10 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
17f20 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17f30 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
17f40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17f50 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
17f60 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
17f70 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
17f80 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
17f90 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
17fa0 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
17fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
17fe0 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
17ff0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
18000 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
18010 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
18020 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
18030 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
18040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
18050 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
18060 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
18070 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
18080 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  lSync(pPager->jf
18090 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
180a0 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  fsync);.  sqlite
180b0 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70  3OsSetFullSync(p
180c0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
180d0 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
180e0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
180f0 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
18100 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44  >jfd, pPager->zD
18110 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61  irectory);.  pPa
18120 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18130 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
18140 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
18150 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
18160 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
18170 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
18180 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
18190 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
181a0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
181b0 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
181c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
181d0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
181e0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
181f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
18200 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
18210 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
18220 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
18230 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
18240 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
18250 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
18260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
18280 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70  ger_stmt_begin(p
18290 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
182a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
182b0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
182c0 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
182d0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
182e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
182f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18300 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18310 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
18320 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18330 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
18340 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
18350 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
18360 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
18370 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18380 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  al = 0;.  if( rc
18390 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
183a0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
183b0 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20   was a malloc() 
183c0 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65  failure, then we
183d0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f   will not be clo
183e0 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20  sing the pager. 
183f0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64     ** file. So d
18400 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61  elete any journa
18410 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61  l file we may ha
18420 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e  ve just created.
18430 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
18440 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77 69  ** the system wi
18450 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c  ll get confused,
18460 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64 2d   we have a read-
18470 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
18480 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79   and a.    ** my
18490 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  sterious journal
184a0 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69 6e   has appeared in
184b0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e   the filesystem.
184c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
184d0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
184e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
184f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 67 65   }else{.    page
18500 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
18510 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18520 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
18530 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
18540 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18550 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
18560 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
18570 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
18580 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
18590 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
185a0 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
185b0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
185c0 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
185d0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  _rollback() is c
185e0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
185f0 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
18600 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
18610 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
18620 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
18630 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
18640 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
18650 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
18660 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rst parameter to
18670 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18680 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
18690 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74  y open page of t
186a0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
186b0 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68  ile.  Nothing ch
186c0 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20  anges about the 
186d0 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65  page - it is use
186e0 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61  d merely to.** a
186f0 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72  cquire a pointer
18700 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
18710 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70  ructure and as p
18720 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20  roof that there 
18730 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20  is.** already a 
18740 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
18750 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
18760 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
18770 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
18780 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
18790 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72  n bytes to reser
187a0 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74  ve for a.** mast
187b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  er journal file-
187c0 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72  name at the star
187d0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
187e0 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61   when it is crea
187f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ted..**.** A jou
18800 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
18810 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
18820 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
18830 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72  ile.  For tempor
18840 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68  ary.** files, th
18850 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
18860 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18870 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
18880 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61  there is an.** a
18890 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
188a0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
188b0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
188c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
188d0 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f  eady reserved fo
188e0 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20  r writing, this 
188f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18900 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46  op..**.** If exF
18910 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20  lag is true, go 
18920 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e  ahead and get an
18930 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
18940 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  on the file.** i
18950 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65  mmediately inste
18960 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e  ad of waiting un
18970 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c  til we try to fl
18980 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
18990 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73  The.** exFlag is
189a0 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72   ignored if a tr
189b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
189c0 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  eady active..*/.
189d0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
189e0 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61  _begin(void *pDa
189f0 74 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b  ta, int exFlag){
18a00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
18a10 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
18a20 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
18a30 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
18a40 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
18a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
18a60 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
18a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
18a80 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
18a90 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
18aa0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18ab0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
18ac0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
18ad0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18ae0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d  ==0 );.    if( M
18af0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
18b00 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
18b10 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
18b20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
18b30 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
18b40 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
18b50 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
18b60 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
18b70 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
18b80 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
18b90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ba0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
18bb0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
18bc0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
18bd0 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
18be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
18bf0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
18c00 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
18c10 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
18c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18c30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18c50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18c60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
18c70 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
18c80 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32   0;.      TRACE2
18c90 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
18ca0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18cb0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
18cc0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
18cd0 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
18ce0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
18cf0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
18d00 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
18d10 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
18d20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18d30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
18d40 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20  e a page dirty. 
18d50 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66   Set its dirty f
18d60 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74  lag and add it t
18d70 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70  o the dirty.** p
18d80 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
18d90 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72  tic void makeDir
18da0 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ty(PgHdr *pPg){.
18db0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
18dc0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
18dd0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
18de0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
18df0 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
18e00 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
18e10 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20  ager->pDirty;.  
18e20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44    if( pPager->pD
18e30 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
18e40 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50  ager->pDirty->pP
18e50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  revDirty = pPg;.
18e60 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
18e70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20  PrevDirty = 0;. 
18e80 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
18e90 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  y = pPg;.  }.}..
18ea0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
18eb0 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20  e clean.  Clear 
18ec0 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e  its dirty bit an
18ed0 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  d remove it from
18ee0 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
18ef0 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
18f00 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
18f10 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  n(PgHdr *pPg){. 
18f20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
18f30 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  ){.    pPg->dirt
18f40 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
18f50 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  Pg->pDirty ){.  
18f60 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d      pPg->pDirty-
18f70 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
18f80 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20  g->pPrevDirty;. 
18f90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
18fa0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a  ->pPrevDirty ){.
18fb0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
18fc0 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20  Dirty->pDirty = 
18fd0 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
18fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
18ff0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74  g->pPager->pDirt
19000 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
19010 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
19020 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
19030 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
19040 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
19050 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
19060 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
19070 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
19080 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
19090 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
190a0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
190b0 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
190c0 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
190d0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
190e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
190f0 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
19100 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
19110 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
19120 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56  cquires a RESERV
19130 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
19140 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
19150 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
19160 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
19170 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
19180 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
19190 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
191a0 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
191b0 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
191c0 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
191d0 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
191e0 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
191f0 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
19200 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
19210 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
19220 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
19230 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19240 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
19250 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
19260 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
19270 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
19280 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
19290 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
192a0 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
192b0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
192c0 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
192d0 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
192e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
192f0 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
19300 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
19310 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
19320 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70  it() or sqlite3p
19330 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
19340 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
19350 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
19360 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
19370 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
19380 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
19390 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
193a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
193b0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
193c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
193d0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
193e0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
193f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19400 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
19410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
19420 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
19430 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
19440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19450 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
19460 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
19470 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
19480 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
19490 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
194a0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
194b0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
194c0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
194d0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
194e0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
194f0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
19500 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
19510 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
19520 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
19530 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74  al && (pPg->inSt
19540 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  mt || pPager->st
19550 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
19560 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
19570 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  Cache = 1;.  }el
19580 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
19590 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
195a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
195b0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
195c0 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
195d0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
195e0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
195f0 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
19600 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
19610 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
19620 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
19630 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
19640 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
19650 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
19660 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
19670 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
19680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
19690 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
196a0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
196b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
196c0 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70  te3pager_begin(p
196d0 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66  Data, 0);.    if
196e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
196f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19700 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
19710 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
19720 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
19730 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
19740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19750 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
19760 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
19770 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
19780 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
19790 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
197a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
197b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
197c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
197d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
197e0 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
197f0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
19800 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
19810 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
19820 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
19830 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
19840 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
19850 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
19860 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
19870 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
19880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19890 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
198a0 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
198b0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
198c0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
198d0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
198e0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
198f0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
19900 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
19910 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
19920 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
19930 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
19940 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
19950 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
19960 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
19970 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
19980 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69  {.          PgHi
19990 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
199a0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
199b0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
199c0 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55       TRACE3("JOU
199d0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
199e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
199f0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
19a00 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19a10 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d  t( pHist->pOrig=
19a20 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
19a30 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73  pHist->pOrig = s
19a40 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
19a50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19a60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
19a70 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
19a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
19a90 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69  mcpy(pHist->pOri
19aa0 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  g, PGHDR_TO_DATA
19ab0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
19ac0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
19ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
19ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
19af0 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b  32 cksum, saved;
19b00 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
19b10 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a  *pData2, *pEnd;.
19b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
19b30 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
19b40 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
19b50 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
19b60 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
19b70 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
19b80 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
19b90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
19ba0 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
19bb0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
19bc0 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
19bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19be0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
19bf0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
19c00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   );.          pD
19c10 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
19c20 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
19c30 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
19c40 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
19c50 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
19c60 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
19c70 20 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d            pEnd =
19c80 20 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72   pData2 + pPager
19c90 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
19ca0 20 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20        pData2 -= 
19cb0 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  4;.          sav
19cc0 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64  ed = *(u32*)pEnd
19cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33  ;.          put3
19ce0 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75  2bits(pEnd, cksu
19cf0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  m);.          sz
19d00 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg = pPager->pag
19d10 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20  eSize+8;.       
19d20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61     put32bits(pDa
19d30 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ta2, pPg->pgno);
19d40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
19d50 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
19d60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
19d70 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20  a2, szPg);.     
19d80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
19d90 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b  rnalOff += szPg;
19da0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
19db0 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
19dc0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
19dd0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19de0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
19df0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
19e00 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
19e10 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  c);.          *(
19e20 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
19e30 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
19e40 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
19e50 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
19e60 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
19e70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
19e80 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
19e90 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
19ea0 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
19eb0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
19ec0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
19ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19ee0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19ef0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
19f00 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
19f10 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
19f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19f30 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19f40 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
19f50 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19f60 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
19f70 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
19f80 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
19f90 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
19fa0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
19fb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19fc0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
19fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19fe0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
19ff0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1a000 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1a010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ;.            pa
1a020 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1a030 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
1a040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a060 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1a070 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
1a080 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
1a090 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1a0a0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28  .        TRACE4(
1a0b0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1a0c0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1a0d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a0e0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1a0f0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1a100 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1a110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a120 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1a130 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1a140 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1a150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1a160 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1a170 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1a180 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
1a190 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
1a1a0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
1a1b0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
1a1c0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
1a1d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1a1e0 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
1a1f0 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
1a200 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
1a210 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1a220 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
1a230 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
1a240 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
1a250 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
1a260 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
1a270 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
1a280 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
1a290 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a2a0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
1a2b0 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
1a2c0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1a2d0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
1a2e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a2f0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1a300 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1a310 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a320 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1a330 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1a340 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1a350 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1a360 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1a370 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a380 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
1a390 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1a3a0 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
1a3b0 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1a3c0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1a3d0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1a3e0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1a3f0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
1a400 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
1a410 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1a420 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1a430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a440 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
1a450 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1a460 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a470 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1a480 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
1a490 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1a4a0 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1a4b0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1a4c0 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1a4d0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1a4e0 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1a4f0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1a500 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1a510 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1a520 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1a530 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
1a540 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
1a550 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1a560 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1a570 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1a580 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1a590 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1a5b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1a5c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1a5d0 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1a5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a5f0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1a600 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
1a610 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1a620 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a630 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a640 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f     }.      page_
1a650 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1a660 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1a670 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1a680 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1a690 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1a6a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a6b0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1a6c0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1a6d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
1a6e0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
1a6f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1a700 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
1a710 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1a720 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1a730 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
1a740 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a750 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1a760 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1a770 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a780 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1a790 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
1a7a0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
1a7b0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
1a7c0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
1a7d0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ** to sqlite3pag
1a7e0 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
1a7f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1a800 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1a810 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1a820 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1a830 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1a840 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1a850 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
1a860 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a  writeable(void *
1a870 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
1a880 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
1a890 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
1a8a0 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
1a8b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
1a8c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a8d0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70  VACUUM./*.** Rep
1a8e0 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
1a8f0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
1a900 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
1a910 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
1a920 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
1a930 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1a940 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50  ager_overwrite(P
1a950 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1a960 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
1a970 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Data){.  void *p
1a980 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
1a990 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1a9a0 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1a9b0 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
1a9c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a9d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1a9e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1a9f0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  te(pPage);.    i
1aa00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aa10 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1aa20 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70  (pPage, pData, p
1aa30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1aa40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1aa50 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1aa60 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
1aa70 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1aa80 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1aa90 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1aaa0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1aab0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
1aac0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
1aad0 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
1aae0 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
1aaf0 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
1ab00 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
1ab10 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
1ab20 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
1ab30 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
1ab40 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
1ab50 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
1ab60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
1ab70 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
1ab80 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
1ab90 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
1aba0 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
1abb0 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
1abc0 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
1abd0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
1abe0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
1abf0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
1ac00 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
1ac10 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
1ac20 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
1ac30 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1ac40 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
1ac50 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1ac60 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1ac70 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1ac80 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1ac90 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1aca0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1acb0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1acc0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1acd0 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1ace0 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1acf0 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1ad00 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1ad10 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
1ad20 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
1ad30 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
1ad40 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
1ad50 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
1ad60 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
1ad70 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
1ad80 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
1ad90 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
1ada0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
1adb0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1adc0 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
1add0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1ade0 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
1adf0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
1ae00 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
1ae10 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
1ae20 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
1ae30 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
1ae40 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1ae50 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
1ae60 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
1ae70 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
1ae80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ae90 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
1aea0 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
1aeb0 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
1aec0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
1aed0 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
1aee0 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
1aef0 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
1af00 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1af10 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
1af20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
1af30 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
1af40 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
1af50 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
1af60 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
1af70 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
1af80 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
1af90 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1afa0 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74   if( MEMDB ) ret
1afb0 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
1afc0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1afd0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
1afe0 72 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f  rt( pPg!=0 );  /
1aff0 2a 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20  * We never call 
1b000 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65  _dont_write unle
1b010 73 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69  ss the page is i
1b020 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e  n mem */.  pPg->
1b030 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1b040 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   1;.  if( pPg->d
1b050 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
1b060 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1b070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b080 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1b090 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1b0a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b0b0 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
1b0c0 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
1b0d0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
1b0e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1b0f0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1b100 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1b110 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1b120 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1b130 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1b140 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1b150 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1b160 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1b170 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1b180 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1b190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b1a0 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1b1b0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1b1c0 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1b1d0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1b1e0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1b1f0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1b200 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1b210 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1b220 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1b230 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1b240 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1b250 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1b260 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1b270 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1b280 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1b290 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1b2a0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1b2b0 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1b2c0 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1b2d0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1b2e0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1b2f0 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1b300 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1b310 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
1b320 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1b330 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
1b340 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
1b350 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1b360 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1b370 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1b380 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1b390 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
1b3a0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1b3b0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1b3c0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1b3d0 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1b3e0 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1b3f0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1b400 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1b410 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1b420 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1b430 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1b440 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1b450 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1b460 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1b470 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1b480 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rnal..*/.void sq
1b490 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
1b4a0 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  rollback(void *p
1b4b0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1b4c0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
1b4d0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
1b4e0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1b4f0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73  g->pPager;..  as
1b500 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1b510 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1b520 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  VED );.  if( pPa
1b530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b540 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1b550 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
1b560 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
1b570 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1b580 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74  k || MEMDB ) ret
1b590 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d  urn;.  if( !pPg-
1b5a0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
1b5b0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1b5c0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1b5d0 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
1b5e0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1b5f0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
1b600 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b610 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
1b620 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1b630 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  7);.    pPg->inJ
1b640 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1b650 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1b660 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70  InUse ){.      p
1b670 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1b680 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1b690 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1b6a0 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
1b6b0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1b6c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
1b6d0 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
1b6e0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
1b6f0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
1b700 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b720 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
1b730 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
1b740 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1b750 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1b760 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1b770 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1b780 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1b790 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1b7a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
1b7b0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1b7c0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
1b7d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1b7e0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1b7f0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1b800 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1b810 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1b820 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f    }.}.../*.** Co
1b830 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
1b840 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b850 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1b860 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
1b870 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
1b880 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
1b890 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
1b8a0 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
1b8b0 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
1b8c0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1b8d0 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
1b8e0 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
1b8f0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
1b900 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
1b910 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
1b920 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b930 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
1b940 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
1b950 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1b960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
1b970 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1b980 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1b990 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
1b9a0 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
1b9b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1b9c0 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43  .  }.  TRACE2("C
1b9d0 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
1b9e0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b9f0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1ba00 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
1ba10 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1ba20 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
1ba30 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
1ba40 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
1ba50 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1ba60 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20  g, pPager));.   
1ba70 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1ba80 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
1ba90 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
1baa0 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
1bab0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
1bac0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1bad0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
1bae0 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
1baf0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1bb00 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  g = pPg->pDirty;
1bb10 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1bb20 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23  r->pDirty = 0;.#
1bb30 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1bb40 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1bb50 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
1bb60 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
1bb70 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
1bb80 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1bb90 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1bba0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
1bbb0 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
1bbc0 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
1bbd0 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
1bbe0 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
1bbf0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
1bc00 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
1bc10 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65  #endif.    pPage
1bc20 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
1bc30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1bc40 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1bc50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bc60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1bc70 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1bc80 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  he==0 ){.    /* 
1bc90 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68  Exit early (with
1bca0 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69  out doing the ti
1bcb0 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c  me-consuming sql
1bcc0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c  ite3OsSync() cal
1bcd0 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ls).    ** if th
1bce0 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
1bcf0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1bd00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1bd10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1bd20 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d  ager->needSync==
1bd30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 );.    rc = pa
1bd40 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1bd50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
1bd60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1bd70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1bd80 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
1bd90 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1bda0 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c  _sync(pPager, 0,
1bdb0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1bdc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bdd0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1bde0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1bdf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1be00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1be10 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
1be20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
1be30 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
1be40 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
1be50 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
1be60 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
1be70 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
1be80 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
1be90 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
1bea0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
1beb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bec0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
1bed0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
1bee0 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
1bef0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
1bf00 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
1bf10 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
1bf20 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
1bf30 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
1bf40 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
1bf50 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
1bf60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1bf70 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
1bf80 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
1bf90 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
1bfa0 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
1bfb0 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
1bfc0 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
1bfd0 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
1bfe0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
1bff0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
1c000 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
1c010 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1c020 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1c030 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
1c040 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1c050 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
1c060 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
1c070 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c080 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1c090 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1c0a0 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
1c0b0 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
1c0c0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1c0d0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1c0e0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1c0f0 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
1c100 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
1c110 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
1c120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1c130 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1c140 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1c150 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
1c160 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c170 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1c180 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1c190 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
1c1a0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
1c1b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
1c1c0 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
1c1d0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1c1e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1c1f0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1c200 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1c210 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1c220 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
1c230 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c240 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
1c250 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
1c260 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
1c270 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1c280 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
1c290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52  else{.        TR
1c2a0 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
1c2b0 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
1c2c0 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1c2d0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1c2e0 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
1c2f0 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
1c300 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
1c310 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
1c320 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1c330 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a   p->inStmt = 0;.
1c340 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74        p->pPrevSt
1c350 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d  mt = p->pNextStm
1c360 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1c370 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1c380 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
1c390 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1c3a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1c3b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1c3c0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
1c3d0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
1c3e0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
1c3f0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1c400 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1c410 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
1c420 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d  rigDbSize;.    m
1c430 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
1c440 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1c450 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1c460 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1c470 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1c480 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1c490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c4a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
1c4b0 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
1c4c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1c4d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1c4e0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1c4f0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
1c500 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
1c510 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1c520 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1c530 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1c540 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
1c550 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c560 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
1c570 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
1c580 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1c590 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50   }.    return pP
1c5a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c5b0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1c5c0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
1c5d0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
1c5e0 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
1c5f0 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
1c600 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
1c610 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72  rc2 = pager_unwr
1c620 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1c630 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c650 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1c660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1c670 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1c680 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1c690 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c6a0 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e   -1;..  /* If an
1c6b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
1c6c0 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
1c6d0 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
1c6e0 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
1c6f0 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f  r.  ** cache. So
1c700 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
1c710 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
1c720 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
1c730 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69  rror .  ** persi
1c740 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65  stent..  */.  re
1c750 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1c760 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1c770 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1c780 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
1c790 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
1c7a0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
1c7b0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
1c7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1c7d0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
1c7e0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
1c7f0 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61  lite3pager_isrea
1c800 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
1c810 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1c820 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
1c830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c840 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1c850 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1c860 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
1c870 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 63  qlite3pager_refc
1c880 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1c890 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1c8a0 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23  ager->nRef;.}..#
1c8b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1c8c0 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
1c8d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1c8e0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
1c8f0 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
1c900 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  nt *sqlite3pager
1c910 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  _stats(Pager *pP
1c920 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
1c930 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
1c940 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
1c950 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
1c960 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
1c970 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
1c980 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
1c990 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
1c9a0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
1c9b0 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
1c9c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1c9d0 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
1c9e0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
1c9f0 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
1ca00 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
1ca10 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50  vfl;.  a[9] = pP
1ca20 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
1ca30 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
1ca40 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
1ca50 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
1ca60 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
1ca70 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
1ca80 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
1ca90 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
1caa0 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
1cab0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1cac0 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
1cad0 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
1cae0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1caf0 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
1cb00 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
1cb10 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
1cb20 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
1cb30 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
1cb40 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
1cb50 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
1cb60 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
1cb70 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  _begin(Pager *pP
1cb80 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1cb90 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
1cba0 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
1cbb0 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ZE];.  assert( !
1cbc0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1cbd0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1cbe0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1cbf0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
1cc00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cc10 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54  dbSize>=0 );.  T
1cc20 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
1cc30 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
1cc40 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1cc50 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
1cc60 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1cc70 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1cc80 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
1cc90 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1cca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ccb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
1ccc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1ccd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1cce0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
1ccf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1cd00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1cd10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1cd20 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
1cd30 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
1cd40 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1cd50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1cd60 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
1cd70 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
1cd80 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
1cd90 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
1cda0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
1cdb0 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
1cdc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1cdd0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
1cde0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1cdf0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1ce00 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
1ce10 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
1ce20 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1ce30 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1ce40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ce50 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50  >stmtJSize == pP
1ce60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ce70 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61   );.#endif.  pPa
1ce80 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
1ce90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cea0 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
1ceb0 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
1cec0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
1ced0 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
1cee0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
1cef0 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
1cf00 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
1cf10 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
1cf20 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
1cf30 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
1cf40 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70  entemp(zTemp, &p
1cf50 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
1cf60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1cf70 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
1cf80 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  d;.    pPager->s
1cf90 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
1cfa0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1cfb0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
1cfc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1cfd0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
1cfe0 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
1cff0 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
1d000 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
1d010 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
1d020 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
1d030 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
1d040 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
1d050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1d070 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
1d080 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1d090 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61  r_stmt_commit(Pa
1d0a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d0b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1d0c0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48  InUse ){.    PgH
1d0d0 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
1d0e0 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
1d0f0 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  T-COMMIT %d\n", 
1d100 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1d110 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
1d120 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d130 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
1d140 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  stfd, 0);.      
1d150 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
1d160 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  cate(pPager->stf
1d170 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
1d180 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
1d190 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
1d1a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1d1b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
1d1c0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1d1d0 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
1d1e0 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
1d1f0 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
1d200 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
1d210 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53  assert( pPg->inS
1d220 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67  tmt );.      pPg
1d230 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1d240 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1d250 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1d260 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
1d270 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1d280 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1d290 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1d2a0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1d2b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d2c0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
1d2d0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
1d2e0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
1d2f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d300 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1d310 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1d320 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1d330 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
1d340 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
1d350 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1d360 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
1d370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d380 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1d390 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
1d3a0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1d3b0 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  stmt_rollback(Pa
1d3c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d3d0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
1d3e0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1d3f0 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  ){.    TRACE2("S
1d400 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  TMT-ROLLBACK %d\
1d410 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1d420 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  er));.    if( ME
1d430 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48  MDB ){.      PgH
1d440 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66  dr *pPg;.      f
1d450 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1d460 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
1d470 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a  Pg->pNextStmt){.
1d480 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1d490 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1d4a0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1d4b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
1d4c0 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
1d4d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1d4e0 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
1d4f0 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70  A(pPg), pHist->p
1d500 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61  Stmt, pPager->pa
1d510 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1d520 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
1d530 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
1d540 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1d550 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
1d560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d570 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d580 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
1d590 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79  ze;.      memory
1d5a0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
1d5b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1d5c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1d5d0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
1d5e0 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
1d5f0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1d600 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1d610 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50  r_stmt_commit(pP
1d620 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1d630 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d640 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
1d650 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1d660 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1d670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d680 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1d690 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1d6a0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
1d6b0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
1d6c0 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61  ager_filename(Pa
1d6d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d6e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1d6f0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1d700 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
1d710 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
1d720 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1d730 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1d740 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d  ite3pager_dirnam
1d750 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1d760 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1d770 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d  r->zDirectory;.}
1d780 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d790 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1d7a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1d7b0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1d7c0 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1d7d0 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  r_journalname(Pa
1d7e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d7f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1d800 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
1d810 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1d820 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
1d830 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
1d840 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
1d850 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
1d860 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
1d870 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
1d880 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1d890 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72  ger_nosync(Pager
1d8a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1d8b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
1d8c0 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  nc;.}../*.** Set
1d8d0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
1d8e0 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
1d8f0 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
1d900 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65  et_codec(.  Page
1d910 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
1d920 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
1d930 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
1d940 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
1d950 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
1d960 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
1d970 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
1d980 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
1d990 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
1d9a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d9b0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1d9c0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1d9d0 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1d9e0 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1d9f0 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1da00 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1da10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1da20 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1da30 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1da40 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
1da50 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  ;.  PgHdr *pPgHd
1da60 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1da70 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1da80 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61  c;..  /* Open pa
1da90 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
1daa0 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
1dab0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1dac0 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1dad0 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69   1, &pPage);.  i
1dae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1daf0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1db00 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1db10 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1db20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1db30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1db40 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1db50 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1db60 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70   byte 24. */.  p
1db70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f  PgHdr = DATA_TO_
1db80 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20  PGHDR(pPage);.  
1db90 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1dba0 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
1dbb0 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
1dbc0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1dbd0 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1dbe0 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1dbf0 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1dc00 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1dc10 65 72 2b 2b 3b 0a 20 20 70 75 74 33 32 62 69 74  er++;.  put32bit
1dc20 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f  s(((char*)PGHDR_
1dc30 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29  TO_DATA(pPgHdr))
1dc40 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1dc50 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  ter);..  /* Rele
1dc60 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
1dc70 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c  erence. */.  sql
1dc80 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
1dc90 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
1dca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1dcb0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
1dcc0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1dcd0 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
1dce0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1dcf0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
1dd00 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1dd10 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1dd20 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1dd30 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
1dd40 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
1dd50 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
1dd60 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
1dd70 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1dd80 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
1dd90 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
1dda0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
1ddb0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
1ddc0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
1ddd0 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  es that the jour
1dde0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61  nal is synced, a
1ddf0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77  ll dirty pages w
1de00 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65  ritten.** to the
1de10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1de20 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1de30 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65  file synced. The
1de40 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
1de50 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  .** remains to c
1de60 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1de70 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65  ction is to dele
1de80 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
1de90 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65  ile (or.** maste
1dea0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1deb0 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
1dec0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
1ded0 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
1dee0 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
1def0 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
1df00 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
1df10 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
1df20 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c  pager_sync() cal
1df30 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  l..**.** If para
1df40 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20  meter nTrunc is 
1df50 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
1df60 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
1df70 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a   truncated to.**
1df80 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74   nTrunc pages (t
1df90 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61  his is used by a
1dfa0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1dfb0 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ases)..*/.int sq
1dfc0 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1dfd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
1dfe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1dff0 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29  er, Pgno nTrunc)
1e000 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1e010 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45  ITE_OK;..  TRACE
1e020 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  4("DATABASE SYNC
1e030 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
1e040 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e  r=%s nTrunc=%d\n
1e050 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
1e060 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
1e070 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a  ster, nTrunc);..
1e080 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1e090 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
1e0a0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
1e0b0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1e0c0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
1e0d0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
1e0e0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1e0f0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
1e100 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1e110 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1e120 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44  _SYNCED && !MEMD
1e130 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  B && pPager->dir
1e140 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
1e150 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61  gHdr *pPg;.    a
1e160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1e170 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
1e180 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
1e190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1e1a0 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
1e1b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1e1c0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
1e1d0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
1e1e0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
1e1f0 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
1e200 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
1e210 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
1e220 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
1e230 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
1e240 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
1e250 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1e260 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
1e270 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
1e280 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
1e290 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
1e2a0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
1e2b0 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
1e2c0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1e2d0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
1e2e0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1e2f0 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
1e300 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
1e310 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1e320 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1e330 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e340 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1e350 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  it;.#ifndef SQLI
1e360 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1e370 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72  UM.      if( nTr
1e380 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
1e390 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
1e3a0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
1e3b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1e3c0 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
1e3d0 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a   pages.        *
1e3e0 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
1e3f0 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
1e400 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
1e410 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
1e420 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1e430 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
1e440 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20         Pgno i;. 
1e450 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 50 61         void *pPa
1e460 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1e470 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
1e480 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
1e490 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
1e4a0 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
1e4b0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
1e4c0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
1e4d0 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
1e4e0 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
1e4f0 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69  (1<<(i&7))) && i
1e500 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
1e510 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e520 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
1e530 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
1e540 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e550 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e560 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1e570 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1e580 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1e590 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
1e5a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e5b0 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
1e5c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1e5d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e5e0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1e5f0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
1e600 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
1e610 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1e620 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
1e630 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
1e640 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
1e650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e660 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1e670 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
1e680 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1e690 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1e6a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1e6b0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1e6c0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1e6d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1e6e0 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75  UUM.    if( nTru
1e6f0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nc!=0 ){.      r
1e700 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1e710 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1e720 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
1e730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e740 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1e750 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
1e760 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
1e770 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1e780 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1e790 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
1e7a0 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1e7b0 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1e7c0 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
1e7d0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1e7e0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
1e7f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e800 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1e810 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
1e820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e830 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1e840 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
1e850 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e860 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1e870 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  fd, 0);.    }.. 
1e880 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1e890 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
1e8a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d  .  }else if( MEM
1e8b0 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20  DB && nTrunc!=0 
1e8c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1e8d0 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1e8e0 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1e8f0 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
1e900 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
1e910 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1e920 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e930 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
1e940 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
1e950 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63   by pData to loc
1e960 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
1e970 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  e file. .**.** T
1e980 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
1e990 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1e9a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 70  e current page p
1e9b0 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20  gno. If current 
1e9c0 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20  page.** pgno is 
1e9d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74  not already in t
1e9e0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1e9f0 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77  nal, it is not w
1ea00 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a  ritten there by.
1ea10 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ** by this routi
1ea20 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70  ne. The same app
1ea30 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  lies to the page
1ea40 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74 6f   pData refers to
1ea50 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20   on entry to.** 
1ea60 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1ea70 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
1ea80 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  o the page refer
1ea90 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20 72  ed to by pData r
1eaa0 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
1eab0 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
1eac0 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
1ead0 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61 74  d with page pDat
1eae0 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  a (i.e. data sto
1eaf0 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
1eb00 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
1eb10 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
1eb20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
1eb30 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1eb40 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
1eb50 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
1eb60 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
1eb70 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1eb80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
1eb90 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
1eba0 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
1ebb0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1ebc0 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
1ebd0 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
1ebe0 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
1ebf0 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
1ec00 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
1ec10 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
1ec20 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
1ec30 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
1ec40 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f  n is active)..*/
1ec50 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1ec60 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65 72  r_movepage(Pager
1ec70 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 2a   *pPager, void *
1ec80 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f  pData, Pgno pgno
1ec90 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1eca0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1ecb0 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72 20  pData);.  PgHdr 
1ecc0 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20  *pPgOld; .  int 
1ecd0 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
1ece0 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
1ecf0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1ed00 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35 28  >0 );..  TRACE5(
1ed10 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
1ed20 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
1ed30 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
1ed40 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1ed50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1ed60 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
1ed70 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70   pgno);..  if( p
1ed80 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1ed90 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
1eda0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
1edb0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1edc0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
1edd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1ede0 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
1edf0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1ee00 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
1ee10 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
1ee20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
1ee30 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
1ee40 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
1ee50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1ee60 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
1ee70 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
1ee80 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
1ee90 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
1eea0 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
1eeb0 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
1eec0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
1eed0 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
1eee0 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
1eef0 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
1ef00 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
1ef10 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
1ef20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
1ef30 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
1ef40 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   */.  pPgOld = p
1ef50 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1ef60 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
1ef70 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
1ef80 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
1ef90 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
1efa0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1efb0 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
1efc0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1efd0 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50  Old);.    if( pP
1efe0 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29  gOld->needSync )
1eff0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f000 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgOld->inJourna
1f010 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  l );.      pPg->
1f020 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1f030 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1f040 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  nc = 1;.      as
1f050 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1f060 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a  edSync );.    }.
1f070 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
1f080 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1f090 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
1f0a0 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
1f0b0 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
1f0c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  */.  assert( pgn
1f0d0 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  o!=0 );.  pPg->p
1f0e0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20  gno = pgno;.  h 
1f0f0 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
1f100 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66  ->nHash-1);.  if
1f110 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1f120 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
1f130 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1f140 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
1f150 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1f160 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1f170 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
1f180 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1f190 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1f1a0 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
1f1b0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
1f1c0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
1f1d0 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79   0;..  makeDirty
1f1e0 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
1f1f0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1f200 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
1f210 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
1f220 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
1f230 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1f240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f250 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
1f260 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
1f270 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1f280 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
1f290 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
1f2a0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
1f2b0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
1f2c0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
1f2d0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
1f2e0 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
1f2f0 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
1f300 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
1f310 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
1f320 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
1f330 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
1f340 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
1f350 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
1f360 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
1f370 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1f380 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
1f390 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
1f3a0 33 70 61 67 65 72 5f 67 65 74 28 29 20 63 61 6c  3pager_get() cal
1f3b0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
1f3c0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
1f3d0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
1f3e0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
1f3f0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1f400 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
1f410 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1f420 76 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b  void *pNeedSync;
1f430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f440 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
1f450 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f460 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1f470 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
1f480 20 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20   &pNeedSync);.  
1f490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f4a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f4b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
1f4c0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1f4d0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1f4e0 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e  edSync)->needSyn
1f4f0 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1f500 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1f510 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  nc)->inJournal =
1f520 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74   1;.    makeDirt
1f530 79 28 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  y(DATA_TO_PGHDR(
1f540 70 4e 65 65 64 53 79 6e 63 29 29 3b 0a 20 20 20  pNeedSync));.   
1f550 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1f560 72 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a  ref(pNeedSync);.
1f570 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1f580 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1f590 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
1f5a0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1f5b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1f5c0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1f5d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
1f5e0 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
1f5f0 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
1f600 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
1f610 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f620 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
1f630 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
1f640 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
1f650 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
1f660 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
1f670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1f680 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50  ager_lockstate(P
1f690 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f6a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
1f6b0 73 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65  sLockState(pPage
1f6c0 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66  r->fd);.}.#endif
1f6d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f6e0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
1f6f0 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
1f700 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
1f710 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
1f720 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
1f730 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
1f740 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
1f750 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
1f760 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
1f770 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1f780 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1f790 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
1f7a0 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
1f7b0 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
1f7c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
1f7d0 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
1f7e0 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
1f7f0 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
1f800 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1f810 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
1f820 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  }.}.#endif..#end
1f830 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1f840 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.