/ Hex Artifact Content
Login

Artifact c4d007fc3572950d9ee20cae03c2beb4e4c12daa:


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 38 34  : pager.c,v 1.84
0350: 20 32 30 30 33 2f 30 36 2f 30 34 20 31 36 3a 32   2003/06/04 16:2
0360: 34 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a  4:40 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
10b0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
10e0: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
10f0: 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   */.  /* SQLITE_
1100: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
1110: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1120: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1130: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1140: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1150: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1160: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1170: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
1180: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1190: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
11a0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
11b0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
11c0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
11d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
11e0: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
11f0: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
1200: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
1210: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
1220: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
1230: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
1240: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
1250: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1260: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f  E_PAGE_SIZE])../
1270: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1280: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1290: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
12a0: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
12b0: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
12c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
12d0: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
12e0: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
12f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1300: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1310: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1320: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1330: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1340: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1350: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1360: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1370: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1380: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1390: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
13a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
13d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
13f0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1400: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1420: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1430: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
1440: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
1450: 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20 20 20  File cpfd;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1480: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1490: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
14a0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
14b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14c0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14d0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
14e0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1500: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1510: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1520: 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20    int ckptSize; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1550: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1560: 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  ckpt_begin() */.
1570: 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a    off_t ckptJSiz
1580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1590: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
15a0: 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29   at ckpt_begin()
15b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15e0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
15f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1600: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1620: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
1630: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
1640: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
1650: 69 6e 74 20 63 6b 70 74 4e 52 65 63 3b 20 20 20  int ckptNRec;   
1660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1670: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
1680: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
1690: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
16a0: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
16d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
16e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
16f0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
1700: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61  r)(void*); /* Ca
1710: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1720: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1730: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  es */.  int nPag
1740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1750: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1760: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
1770: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1780: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17a0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
17b0: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
17c0: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
17d0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
17e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
17f0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
1800: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
1810: 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69  che */.  int nHi
1820: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
1830: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
1840: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
1850: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
1860: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
1870: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1880: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
1890: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18a0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
18b0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
18c0: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
18d0: 20 54 72 75 65 20 69 66 20 69 6e 69 74 69 61 6c   True if initial
18e0: 20 6d 61 67 69 63 20 6f 66 20 6a 6f 75 72 6e 61   magic of journa
18f0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
1900: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 44 6f 20 6e 6f 74 20 75 73 65 20 61 20 72 6f 6c  Do not use a rol
1930: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
1940: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1950: 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20  u8 ckptOpen;    
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1970: 72 75 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  rue if the check
1980: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  point journal is
1990: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b   open */.  u8 ck
19a0: 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  ptInUse;        
19b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
19c0: 65 20 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b  e are in a check
19d0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 63 6b  point */.  u8 ck
19e0: 70 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  ptAutoopen;     
19f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
1a00: 6b 70 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  kpt journal when
1a10: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
1a20: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
1a30: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
1a40: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a50: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
1a60: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
1a70: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1a90: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
1aa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1ab0: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
1ac0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f  SQLITE_UNLOCK, _
1af0: 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49  READLOCK or _WRI
1b00: 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65  TELOCK */.  u8 e
1b10: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
1b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
1b50: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1b70: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
1b80: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
1b90: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
1bc0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1bd0: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
1c00: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
1c10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c20: 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b  .  u8 dirtyFile;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62 61  * True if databa
1c50: 73 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  se file has chan
1c60: 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a  ged in any way *
1c70: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c80: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c90: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1ca0: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  rollback() for a
1cb0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1cc0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
1cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1ce0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
1cf0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1d00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
1d10: 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20  *aInCkpt;       
1d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1d30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
1d40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1d50: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  e */.  PgHdr *pF
1d60: 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20  irst, *pLast;   
1d70: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1d80: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
1d90: 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65  Hdr *pFirstSynce
1da0: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d;        /* Fir
1db0: 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74  st free page wit
1dc0: 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  h PgHdr.needSync
1dd0: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
1de0: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
1df0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e00: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
1e10: 67 48 64 72 20 2a 70 43 6b 70 74 3b 20 20 20 20  gHdr *pCkpt;    
1e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1e30: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
1e40: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
1e50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
1e60: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
1e70: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
1e80: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
1e90: 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72   number of PgHdr
1ea0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1eb0: 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61  ese are bits tha
1ec0: 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20  t can be set in 
1ed0: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a  Pager.errMask..*
1ee0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1ef0: 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30  ERR_FULL     0x0
1f00: 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20  1  /* a write() 
1f10: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
1f20: 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20  e PAGER_ERR_MEM 
1f30: 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61       0x02  /* ma
1f40: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f  lloc() failed */
1f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1f60: 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34  RR_LOCK     0x04
1f70: 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68    /* error in th
1f80: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
1f90: 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ol */.#define PA
1fa0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
1fb0: 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61   0x08  /* databa
1fc0: 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f  se or journal co
1fd0: 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  rruption */.#def
1fe0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49  ine PAGER_ERR_DI
1ff0: 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20  SK     0x10  /* 
2000: 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f  general disk I/O
2010: 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72   error - bad har
2020: 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a  d drive? */../*.
2030: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
2040: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67  ile contains pag
2050: 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
2060: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f   following.** fo
2070: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75  rmat..**.** Actu
2080: 61 6c 6c 79 2c 20 74 68 69 73 20 73 74 72 75 63  ally, this struc
2090: 74 75 72 65 20 69 73 20 74 68 65 20 63 6f 6d 70  ture is the comp
20a0: 6c 65 74 65 20 70 61 67 65 20 72 65 63 6f 72 64  lete page record
20b0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66 6f   for pager.** fo
20c0: 72 6d 61 74 73 20 6c 65 73 73 20 74 68 61 6e 20  rmats less than 
20d0: 33 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20 77 69  3.  Beginning wi
20e0: 74 68 20 66 6f 72 6d 61 74 20 33 2c 20 74 68 69  th format 3, thi
20f0: 73 20 72 65 63 6f 72 64 20 69 73 20 73 75 72 72  s record is surr
2100: 6f 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77 6f  ounded.** by two
2110: 20 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74   checksums..*/.t
2120: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
2130: 67 65 52 65 63 6f 72 64 20 50 61 67 65 52 65 63  geRecord PageRec
2140: 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65  ord;.struct Page
2150: 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20  Record {.  Pgno 
2160: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2180: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2190: 20 20 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c    char aData[SQL
21a0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20  ITE_PAGE_SIZE]; 
21b0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74   /* Original dat
21c0: 61 20 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20  a for page pgno 
21d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  */.};../*.** Jou
21e0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
21f0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
2200: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
2210: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
2220: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2230: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
2240: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
2250: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
2260: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2270: 65 20 74 68 72 65 65 20 6a 6f 75 72 6e 61 6c 20  e three journal 
2280: 66 6f 72 6d 61 74 73 20 28 73 6f 20 66 61 72 29  formats (so far)
2290: 2e 20 54 68 65 20 31 73 74 20 6a 6f 75 72 6e 61  . The 1st journa
22a0: 6c 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a  l format writes.
22b0: 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ** 32-bit intege
22c0: 72 73 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f  rs in the byte-o
22d0: 72 64 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74  rder of the host
22e0: 20 6d 61 63 68 69 6e 65 2e 20 20 4e 65 77 0a 2a   machine.  New.*
22f0: 2a 20 66 6f 72 6d 61 74 73 20 77 72 69 74 65 73  * formats writes
2300: 20 69 6e 74 65 67 65 72 73 20 61 73 20 62 69 67   integers as big
2310: 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65  -endian.  All ne
2320: 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74  w journals use t
2330: 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74  he.** new format
2340: 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 74 6f  , but we have to
2350: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64   be able to read
2360: 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61   an older journa
2370: 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  l in order.** to
2380: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2390: 6c 73 20 63 72 65 61 74 65 64 20 62 79 20 6f 6c  ls created by ol
23a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
23b0: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a  the library..**.
23c0: 2a 2a 20 54 68 65 20 33 72 64 20 6a 6f 75 72 6e  ** The 3rd journ
23d0: 61 6c 20 66 6f 72 6d 61 74 20 28 61 64 64 65 64  al format (added
23e0: 20 66 6f 72 20 32 2e 38 2e 30 29 20 61 64 64 73   for 2.8.0) adds
23f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
2400: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
2410: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2420: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
2430: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
2440: 68 69 6c 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  hile the.** jour
2450: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
2460: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
2470: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
2480: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 0a 2a  ight appear in.*
2490: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
24a0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
24b0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
24c0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
24d0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
24e0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
24f0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2500: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
2510: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
2520: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
2530: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
2540: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
2550: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
2560: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
2570: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
2580: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
2590: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
25a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
25b0: 68 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66  he 3rd journal f
25c0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
25d0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
25e0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
25f0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
2600: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
2610: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
2620: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
2630: 65 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e SQLITE_PAGE_SI
2640: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
2650: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
2660: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
2670: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
2680: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
2690: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
26a0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
26b0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
26c0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
26d0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
26e0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
26f0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
2700: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
2710: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2720: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
2730: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
2740: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
2750: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
2760: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
2770: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
2780: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
2790: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
27a0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
27b0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
27c0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
27d0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
27e0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
27f0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
2800: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
2810: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
2820: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
2830: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
2840: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
2850: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2860: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
2870: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 5b 5d 20 3d  ournalMagic1[] =
2880: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
2890: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
28a0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
28b0: 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63  xd4,.};.static c
28c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
28d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
28e0: 32 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  2[] = {.  0xd9, 
28f0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
2900: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
2910: 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 73 74 61  63, 0xd5,.};.sta
2920: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
2930: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
2940: 4d 61 67 69 63 33 5b 5d 20 3d 20 7b 0a 20 20 30  Magic3[] = {.  0
2950: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
2960: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
2970: 31 2c 20 30 78 36 33 2c 20 30 78 64 36 2c 0a 7d  1, 0x63, 0xd6,.}
2980: 3b 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  ;.#define JOURNA
2990: 4c 5f 46 4f 52 4d 41 54 5f 31 20 31 0a 23 64 65  L_FORMAT_1 1.#de
29a0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  fine JOURNAL_FOR
29b0: 4d 41 54 5f 32 20 32 0a 23 64 65 66 69 6e 65 20  MAT_2 2.#define 
29c0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33  JOURNAL_FORMAT_3
29d0: 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   3../*.** The fo
29e0: 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20  llowing integer 
29f0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 61 74 20  determines what 
2a00: 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 77 68  format to use wh
2a10: 65 6e 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20 6e  en creating.** n
2a20: 65 77 20 70 72 69 6d 61 72 79 20 6a 6f 75 72 6e  ew primary journ
2a30: 61 6c 20 66 69 6c 65 73 2e 20 20 42 79 20 64 65  al files.  By de
2a40: 66 61 75 6c 74 20 77 65 20 61 6c 77 61 79 73 20  fault we always 
2a50: 75 73 65 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a  use format 3..**
2a60: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 77   When testing, w
2a70: 65 20 63 61 6e 20 73 65 74 20 74 68 69 73 20 76  e can set this v
2a80: 61 6c 75 65 20 74 6f 20 6f 6c 64 65 72 20 6a 6f  alue to older jo
2a90: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 69 6e  urnal formats in
2aa0: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b   order to.** mak
2ab0: 65 20 73 75 72 65 20 74 68 61 74 20 6e 65 77 65  e sure that newe
2ac0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  r versions of th
2ad0: 65 20 6c 69 62 72 61 72 79 20 61 72 65 20 61 62  e library are ab
2ae0: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  le to rollback o
2af0: 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  lder.** journal 
2b00: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  files..**.** Not
2b10: 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e  e that checkpoin
2b20: 74 20 6a 6f 75 72 6e 61 6c 73 20 61 6c 77 61 79  t journals alway
2b30: 73 20 75 73 65 20 66 6f 72 6d 61 74 20 32 20 61  s use format 2 a
2b40: 6e 64 20 6f 6d 69 74 20 74 68 65 20 68 65 61 64  nd omit the head
2b50: 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  er..*/.#ifdef SQ
2b60: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 6a 6f  LITE_TEST.int jo
2b70: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d 20 33  urnal_format = 3
2b80: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2b90: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20   journal_format 
2ba0: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
2bb0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
2bc0: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
2bd0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
2be0: 6f 75 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63  ournal varies ac
2bf0: 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68  cording.** to wh
2c00: 69 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ich journal form
2c10: 61 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  at is being used
2c20: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2c30: 20 6d 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f   macros figure o
2c40: 75 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20  ut.** the sizes 
2c50: 62 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20  based on format 
2c60: 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66  numbers..*/.#def
2c70: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
2c80: 53 5a 28 58 29 20 5c 0a 20 20 20 28 73 69 7a 65  SZ(X) \.   (size
2c90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2ca0: 31 29 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f  1) + sizeof(Pgno
2cb0: 29 20 2b 20 28 28 58 29 3e 3d 33 29 2a 32 2a 73  ) + ((X)>=3)*2*s
2cc0: 69 7a 65 6f 66 28 75 33 32 29 29 0a 23 64 65 66  izeof(u32)).#def
2cd0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
2ce0: 5a 28 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54  Z(X) \.   (SQLIT
2cf0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69  E_PAGE_SIZE + si
2d00: 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58  zeof(Pgno) + ((X
2d10: 29 3e 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32  )>=3)*sizeof(u32
2d20: 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  ))../*.** Enable
2d30: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2d40: 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a   tracking here:.
2d50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2d60: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
2d70: 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  r_refinfo_enable
2d80: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
2d90: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
2da0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
2db0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
2dc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
2dd0: 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  ger_refinfo_enab
2de0: 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  le ) return;.   
2df0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20   printf(.       
2e00: 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64  "REFCNT: %4d add
2e10: 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
2e20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
2e30: 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f  gno, (int)PGHDR_
2e40: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
2e50: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
2e60: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
2e70: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
2e80: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
2e90: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
2ea0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
2eb0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
2ec0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
2ed0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
2ee0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
2ef0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
2f00: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
2f10: 69 70 74 6f 72 0a 2a 2f 0a 73 74 61 74 69 63 20  iptor.*/.static 
2f20: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 69  int read32bits(i
2f30: 6e 74 20 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c  nt format, OsFil
2f40: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
2f50: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
2f60: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
2f70: 71 6c 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20  qliteOsRead(fd, 
2f80: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
2f90: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
2fa0: 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61  LITE_OK && forma
2fb0: 74 3e 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  t>JOURNAL_FORMAT
2fc0: 5f 31 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  _1 ){.    unsign
2fd0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
2fe0: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
2ff0: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
3000: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
3010: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
3020: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
3030: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
3040: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
3050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3060: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3070: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
3080: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3090: 2e 20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73  .  Writing.** is
30a0: 20 61 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69   always done usi
30b0: 6e 67 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  ng the new journ
30c0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74  al format..*/.st
30d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
30e0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
30f0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
3100: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
3110: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
3120: 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20  format<=1 ){.   
3130: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73   return sqliteOs
3140: 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20  Write(fd, &val, 
3150: 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20  4);.  }.  ac[0] 
3160: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3170: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
3180: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
3190: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
31a0: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
31b0: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
31c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
31d0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
31e0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  4);.}../*.** Wri
31f0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
3200: 67 65 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20  ger into a page 
3210: 68 65 61 64 65 72 20 72 69 67 68 74 20 62 65 66  header right bef
3220: 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ore the.** page 
3230: 64 61 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c  data.  This will
3240: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 50   overwrite the P
3250: 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
3260: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
3270: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
3280: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
3290: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
32a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32b0: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 63  *ac;.  ac = &((c
32c0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
32d0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
32e0: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
32f0: 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 6d  rmat<=1 ){.    m
3300: 65 6d 63 70 79 28 61 63 2c 20 26 76 61 6c 2c 20  emcpy(ac, &val, 
3310: 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
3320: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
3330: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  4) & 0xff;.    a
3340: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
3350: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b   & 0xff;.    ac[
3360: 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20  2] = (val>>8) & 
3370: 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 33 5d 20  0xff;.    ac[3] 
3380: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3390: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  }.}.../*.** Conv
33a0: 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  ert the bits in 
33b0: 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  the pPager->errM
33c0: 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ask into an appr
33d0: 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e  oprate.** return
33e0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
33f0: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f   int pager_errco
3400: 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
3410: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3420: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
3430: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3440: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3450: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
3460: 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28  _PROTOCOL;.  if(
3470: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3480: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53   & PAGER_ERR_DIS
3490: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
34a0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20  TE_IOERR;.  if( 
34b0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
34c0: 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  & PAGER_ERR_FULL
34d0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
34e0: 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50  E_FULL;.  if( pP
34f0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3500: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20  PAGER_ERR_MEM ) 
3510: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3520: 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61  NOMEM;.  if( pPa
3530: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3540: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3550: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
3560: 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e  ORRUPT;.  return
3570: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
3580: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
3590: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
35a0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
35b0: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
35c0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
35d0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
35e0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
35f0: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
3600: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
3610: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
3620: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
3630: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
3640: 20 74 68 65 20 73 71 6c 69 74 65 70 61 67 65 72   the sqlitepager
3650: 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _ckpt_commit().*
3660: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
3670: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
3680: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
3690: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
36a0: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
36b0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
36c0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
36d0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
36e0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
36f0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63  id page_add_to_c
3700: 6b 70 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  kpt_list(PgHdr *
3710: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
3720: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
3730: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
3740: 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b  inCkpt ) return;
3750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
3760: 70 50 72 65 76 43 6b 70 74 3d 3d 30 20 26 26 20  pPrevCkpt==0 && 
3770: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d  pPg->pNextCkpt==
3780: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
3790: 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20 69 66 28  vCkpt = 0;.  if(
37a0: 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 29   pPager->pCkpt )
37b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43  {.    pPager->pC
37c0: 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d  kpt->pPrevCkpt =
37d0: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
37e0: 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 61  >pNextCkpt = pPa
37f0: 67 65 72 2d 3e 70 43 6b 70 74 3b 0a 20 20 70 50  ger->pCkpt;.  pP
3800: 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50  ager->pCkpt = pP
3810: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74  g;.  pPg->inCkpt
3820: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
3830: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
3840: 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 50  from_ckpt_list(P
3850: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
3860: 28 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29  ( !pPg->inCkpt )
3870: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3880: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 29 7b  Pg->pPrevCkpt ){
3890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
38a0: 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65  ->pPrevCkpt->pNe
38b0: 78 74 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  xtCkpt==pPg );. 
38c0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70     pPg->pPrevCkp
38d0: 74 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70  t->pNextCkpt = p
38e0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20  Pg->pNextCkpt;. 
38f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3900: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
3910: 3e 70 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  >pCkpt==pPg );. 
3920: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
3930: 70 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pCkpt = pPg->pNe
3940: 78 74 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 69 66  xtCkpt;.  }.  if
3950: 28 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  ( pPg->pNextCkpt
3960: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3970: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e  pPg->pNextCkpt->
3980: 70 50 72 65 76 43 6b 70 74 3d 3d 70 50 67 20 29  pPrevCkpt==pPg )
3990: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
39a0: 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20  Ckpt->pPrevCkpt 
39b0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74  = pPg->pPrevCkpt
39c0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
39d0: 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50  xtCkpt = 0;.  pP
39e0: 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30  g->pPrevCkpt = 0
39f0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20  ;.  pPg->inCkpt 
3a00: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
3a10: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
3a20: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
3a30: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
3a40: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
3a50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3a60: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
3a70: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
3a80: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
3a90: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
3aa0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
3ab0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
3ac0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
3ad0: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
3ae0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
3af0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
3b00: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
3b10: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
3b20: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
3b30: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
3b40: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
3b50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
3b60: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
3b70: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
3b80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
3b90: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
3ba0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
3bb0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
3bc0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
3bd0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
3be0: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
3bf0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
3c00: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
3c10: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
3c20: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
3c30: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
3c40: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
3c50: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
3c60: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
3c70: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
3c80: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
3c90: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
3ca0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3cb0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
3cc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
3cd0: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
3ce0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
3cf0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
3d00: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
3d10: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
3d20: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
3d30: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
3d40: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
3d50: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
3d60: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
3d70: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
3d80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
3d90: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
3da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61   ){.    sqlitepa
3db0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
3dc0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
3dd0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
3de0: 65 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65  er->fd);.  pPage
3df0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
3e00: 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  E_UNLOCK;.  pPag
3e10: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
3e20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
3e30: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
3e40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
3e50: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
3e60: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
3e70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
3e80: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
3e90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
3ea0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74  en and.** a writ
3eb0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
3ec0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
3ed0: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74  utine releases t
3ee0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77  he database.** w
3ef0: 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  rite lock and ac
3f00: 71 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f  quires a read lo
3f10: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
3f20: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
3f30: 6c 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64  le.** is deleted
3f40: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a   and closed..*/.
3f50: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
3f60: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
3f70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3f80: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
3f90: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
3fa0: 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f  r->state<SQLITE_
3fb0: 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75  WRITELOCK ) retu
3fc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3fd0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
3fe0: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
3ff0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
4000: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  kptOpen ){.    s
4010: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
4020: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
4030: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
4040: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
4050: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4060: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
4070: 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  teOsClose(&pPage
4080: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
4090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
40a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
40b0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
40c0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
40d0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
40e0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
40f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
4100: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
4110: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
4120: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
4130: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
4140: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
4150: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
4160: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
4170: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
4180: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
41a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
41b0: 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  tyFile==0 || pPa
41c0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
41d0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  =0 );.  }.  rc =
41e0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
41f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
4200: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
4220: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
4230: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65  E_READLOCK;.  }e
4240: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
4250: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
4260: 20 69 66 20 61 20 70 72 6f 63 65 73 73 20 64 6f   if a process do
4270: 65 73 20 61 20 42 45 47 49 4e 2c 20 74 68 65 6e  es a BEGIN, then
4280: 20 66 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a 20   forks and the. 
4290: 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63     ** child proc
42a0: 65 73 73 20 64 6f 65 73 20 74 68 65 20 43 4f 4d  ess does the COM
42b0: 4d 49 54 2e 20 20 42 65 63 61 75 73 65 20 6f 66  MIT.  Because of
42c0: 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
42d0: 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69  f unix.    ** fi
42e0: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20  le locking, the 
42f0: 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c  unlock will fail
4300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
4310: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
4320: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  ITE_UNLOCK;.  }.
4330: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4340: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
4350: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
4360: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
4370: 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61   of data..*/.sta
4380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
4390: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
43a0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
43b0: 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29  nst char *aData)
43c0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
43d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
43e0: 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75  t + pgno;.  retu
43f0: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
4410: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
4420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
4430: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
4440: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
4450: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
4460: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
4470: 72 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66  re are three dif
4480: 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  ferent journal f
4490: 6f 72 6d 61 74 73 2e 20 20 54 68 65 20 66 6f 72  ormats.  The for
44a0: 6d 61 74 20 70 61 72 61 6d 65 74 65 72 20 64 65  mat parameter de
44b0: 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 69 63  termines.** whic
44c0: 68 20 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64  h format is used
44d0: 20 62 79 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   by the journal 
44e0: 74 68 61 74 20 69 73 20 70 6c 61 79 65 64 20 62  that is played b
44f0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
4500: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
4510: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
4520: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
4530: 20 2a 6a 66 64 2c 20 69 6e 74 20 66 6f 72 6d 61   *jfd, int forma
4540: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
4550: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
4560: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
4570: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
4580: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
4590: 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b  ageRecord pgRec;
45a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 0a 20  .  u32 cksum;.. 
45b0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
45c0: 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 70  (format, jfd, &p
45d0: 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66  gRec.pgno);.  if
45e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
45f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
4600: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
4610: 28 6a 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61  (jfd, &pgRec.aDa
4620: 74 61 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63  ta, sizeof(pgRec
4630: 2e 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20  .aData));.  if( 
4640: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
4650: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
4660: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
4670: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
4680: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
4690: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
46a0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
46b0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
46c0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
46d0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
46e0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
46f0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
4700: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
4710: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
4720: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
4730: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
4740: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
4750: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
4760: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
4770: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
4780: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
4790: 28 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20  ( pgRec.pgno==0 
47a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
47b0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
47c0: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e   if( pgRec.pgno>
47d0: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
47e0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
47f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4800: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f 72 6d  ;.  }.  if( form
4810: 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  at>=JOURNAL_FORM
4820: 41 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20 3d  AT_3 ){.    rc =
4830: 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d   read32bits(form
4840: 61 74 2c 20 6a 66 64 2c 20 26 63 6b 73 75 6d 29  at, jfd, &cksum)
4850: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
4860: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
4870: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
4880: 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f  ager, pgRec.pgno
4890: 2c 20 70 67 52 65 63 2e 61 44 61 74 61 29 21 3d  , pgRec.aData)!=
48a0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
48b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
48c0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
48d0: 2f 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  /* Playback the 
48e0: 70 61 67 65 2e 20 20 55 70 64 61 74 65 20 74 68  page.  Update th
48f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79  e in-memory copy
4900: 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a   of the page.  *
4910: 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  * at the same ti
4920: 6d 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  me, if there is 
4930: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  one..  */.  pPg 
4940: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
4950: 50 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e  Pager, pgRec.pgn
4960: 6f 29 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c  o);.  TRACE2("PL
4970: 41 59 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 67  AYBACK %d\n", pg
4980: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 73 71 6c  Rec.pgno);.  sql
4990: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
49a0: 72 2d 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67  r->fd, (pgRec.pg
49b0: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
49c0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
49d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
49e0: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
49f0: 2c 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53  , pgRec.aData, S
4a00: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
4a10: 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
4a20: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
4a30: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 6d  ==0 ||.        m
4a40: 65 6d 63 6d 70 28 50 47 48 44 52 5f 54 4f 5f 44  emcmp(PGHDR_TO_D
4a50: 41 54 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e  ATA(pPg), pgRec.
4a60: 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  aData, SQLITE_PA
4a70: 47 45 5f 53 49 5a 45 29 3d 3d 30 0a 20 20 20 20  GE_SIZE)==0.    
4a80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
4a90: 6f 74 20 75 70 64 61 74 65 20 74 68 65 20 64 61  ot update the da
4aa0: 74 61 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ta on this page 
4ab0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  if the page is i
4ac0: 6e 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 61  n use.      ** a
4ad0: 6e 64 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nd the page has 
4ae0: 6e 65 76 65 72 20 62 65 65 6e 20 6d 6f 64 69 66  never been modif
4af0: 69 65 64 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ied.  This avoid
4b00: 73 20 72 65 73 65 74 74 69 6e 67 0a 20 20 20 20  s resetting.    
4b10: 20 20 2a 2a 20 74 68 65 20 22 65 78 74 72 61 22    ** the "extra"
4b20: 20 64 61 74 61 2e 20 20 54 68 61 74 20 69 6e 20   data.  That in 
4b30: 74 75 72 6e 20 61 76 6f 69 64 73 20 69 6e 76 61  turn avoids inva
4b40: 6c 69 64 61 74 69 6e 67 20 42 54 72 65 65 20 63  lidating BTree c
4b50: 75 72 73 6f 72 73 0a 20 20 20 20 20 20 2a 2a 20  ursors.      ** 
4b60: 69 6e 20 74 72 65 65 73 20 74 68 61 74 20 68 61  in trees that ha
4b70: 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 6d 6f  ve never been mo
4b80: 64 69 66 69 65 64 2e 20 20 54 68 65 20 65 6e 64  dified.  The end
4b90: 20 72 65 73 75 6c 74 20 69 73 20 74 68 61 74 0a   result is that.
4ba0: 20 20 20 20 20 20 2a 2a 20 79 6f 75 20 63 61 6e        ** you can
4bb0: 20 68 61 76 65 20 61 20 53 45 4c 45 43 54 20 67   have a SELECT g
4bc0: 6f 69 6e 67 20 6f 6e 20 69 6e 20 6f 6e 65 20 74  oing on in one t
4bd0: 61 62 6c 65 20 61 6e 64 20 52 4f 4c 4c 42 41 43  able and ROLLBAC
4be0: 4b 20 63 68 61 6e 67 65 73 0a 20 20 20 20 20 20  K changes.      
4bf0: 2a 2a 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ** to a differen
4c00: 74 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  t table and the 
4c10: 53 45 4c 45 43 54 20 69 73 20 75 6e 61 66 66 65  SELECT is unaffe
4c20: 63 74 65 64 20 62 79 20 74 68 65 20 52 4f 4c 4c  cted by the ROLL
4c30: 42 41 43 4b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  BACK..      */. 
4c40: 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
4c50: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
4c60: 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c  pgRec.aData, SQL
4c70: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
4c80: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
4c90: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
4ca0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
4cb0: 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
4cc0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
4cd0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
4ce0: 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
4cf0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4d00: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
4d10: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
4d20: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
4d30: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
4d40: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
4d50: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
4d60: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
4d70: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
4d80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
4d90: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
4da0: 77 73 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e  ws:  There is an
4db0: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66 69 6c 65   initial.** file
4dc0: 2d 74 79 70 65 20 73 74 72 69 6e 67 20 66 6f 72  -type string for
4dd0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4de0: 2e 20 20 54 68 65 6e 20 74 68 65 72 65 20 69 73  .  Then there is
4df0: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 50 67 6e   a single.** Pgn
4e00: 6f 20 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69  o number which i
4e10: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
4e20: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
4e30: 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
4e40: 63 68 61 6e 67 65 73 20 77 65 72 65 20 6d 61 64  changes were mad
4e50: 65 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  e.  The database
4e60: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
4e70: 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a 2a 20 4e   this size..** N
4e80: 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f 20 6f 72  ext come zero or
4e90: 20 6d 6f 72 65 20 70 61 67 65 20 72 65 63 6f 72   more page recor
4ea0: 64 73 20 77 68 65 72 65 20 65 61 63 68 20 70 61  ds where each pa
4eb0: 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20 63 6f 6e  ge record.** con
4ec0: 73 69 73 74 73 20 6f 66 20 61 20 50 67 6e 6f 20  sists of a Pgno 
4ed0: 61 6e 64 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  and SQLITE_PAGE_
4ee0: 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61  SIZE bytes of da
4ef0: 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  ta.  See.** the 
4f00: 50 61 67 65 52 65 63 6f 72 64 20 73 74 72 75 63  PageRecord struc
4f10: 74 75 72 65 20 66 6f 72 20 64 65 74 61 69 6c 73  ture for details
4f20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
4f30: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
4f40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
4f50: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
4f60: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
4f70: 69 6c 65 20 28 61 73 20 64 65 74 65 72 6d 69 6e  ile (as determin
4f80: 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
4f90: 20 74 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   the magic numbe
4fa0: 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
4fb0: 6e 6e 69 6e 67 29 20 74 68 65 6e 20 74 68 69 73  nning) then this
4fc0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4fd0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
4fe0: 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 74 68 65  ..** If any othe
4ff0: 72 20 65 72 72 6f 72 73 20 6f 63 63 75 72 20 64  r errors occur d
5000: 75 72 69 6e 67 20 70 6c 61 79 62 61 63 6b 2c 20  uring playback, 
5010: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
5020: 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20 62 65 20 63  l.** likely be c
5030: 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65  orrupted, so the
5040: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
5050: 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  PT bit is set in
5060: 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  .** pPager->errM
5070: 61 73 6b 20 61 6e 64 20 53 51 4c 49 54 45 5f 43  ask and SQLITE_C
5080: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
5090: 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 0a 2a  ed.  If it all.*
50a0: 2a 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68  * works, then th
50b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
50c0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
50d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
50e0: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
50f0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75 73   *pPager, int us
5100: 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a 20  eJournalSize){. 
5110: 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20   off_t szJ;     
5120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
5130: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
5140: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
5150: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5170: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
5180: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
5190: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
51c0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
51d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
51e0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
51f0: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
5200: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 6d  es */.  int form
5210: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
5220: 20 2f 2a 20 46 6f 72 6d 61 74 20 6f 66 20 74 68   /* Format of th
5230: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
5240: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5250: 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66  ar aMagic[sizeof
5260: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29  (aJournalMagic1)
5270: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
5280: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
5290: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
52a0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
52b0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
52c0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
52d0: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
52e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
52f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
5300: 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65   );.  sqliteOsSe
5310: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
5320: 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
5330: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
5340: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
5350: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5360: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
5370: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
5380: 20 20 7d 0a 20 20 69 66 28 20 73 7a 4a 20 3c 20    }.  if( szJ < 
5390: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b 73  sizeof(aMagic)+s
53a0: 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a 20  izeof(Pgno) ){. 
53b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
53c0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
53d0: 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69  Read the beginni
53e0: 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
53f0: 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 74  l and truncate t
5400: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
5410: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
5420: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
5430: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
5440: 69 74 65 4f 73 52 65 61 64 28 26 70 50 61 67 65  iteOsRead(&pPage
5450: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
5460: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b  sizeof(aMagic));
5470: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5480: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
5490: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
54a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
54b0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69  layback;.  }.  i
54c0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
54d0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33  , aJournalMagic3
54e0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
54f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d  )==0 ){.    form
5500: 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  at = JOURNAL_FOR
5510: 4d 41 54 5f 33 3b 0a 20 20 7d 65 6c 73 65 20 69  MAT_3;.  }else i
5520: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
5530: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32  , aJournalMagic2
5540: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
5550: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d  )==0 ){.    form
5560: 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  at = JOURNAL_FOR
5570: 4d 41 54 5f 32 3b 0a 20 20 7d 65 6c 73 65 20 69  MAT_2;.  }else i
5580: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
5590: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  , aJournalMagic1
55a0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
55b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d  )==0 ){.    form
55c0: 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  at = JOURNAL_FOR
55d0: 4d 41 54 5f 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  MAT_1;.  }else{.
55e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
55f0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f  PROTOCOL;.    go
5600: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
5610: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f 72 6d 61  .  }.  if( forma
5620: 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t>=JOURNAL_FORMA
5630: 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  T_3 ){.    rc = 
5640: 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61  read32bits(forma
5650: 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  t, &pPager->jfd,
5660: 20 26 6e 52 65 63 29 3b 0a 20 20 20 20 69 66 28   &nRec);.    if(
5670: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
5680: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 72 63 20  layback;.    rc 
5690: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
56a0: 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  mat, &pPager->jf
56b0: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  d, &pPager->cksu
56c0: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  mInit);.    if( 
56d0: 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  rc ) goto end_pl
56e0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 69 66 28 20  ayback;.    if( 
56f0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
5700: 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69   || useJournalSi
5710: 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ze ){.      nRec
5720: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
5730: 4c 5f 48 44 52 5f 53 5a 28 33 29 29 2f 4a 4f 55  L_HDR_SZ(3))/JOU
5740: 52 4e 41 4c 5f 50 47 5f 53 5a 28 33 29 3b 0a 20  RNAL_PG_SZ(3);. 
5750: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5760: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
5770: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32  JOURNAL_HDR_SZ(2
5780: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
5790: 28 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (2);.    assert(
57a0: 20 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47   nRec*JOURNAL_PG
57b0: 5f 53 5a 28 32 29 2b 4a 4f 55 52 4e 41 4c 5f 48  _SZ(2)+JOURNAL_H
57c0: 44 52 5f 53 5a 28 32 29 3d 3d 73 7a 4a 20 29 3b  DR_SZ(2)==szJ );
57d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 61 64  .  }.  rc = read
57e0: 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26  32bits(format, &
57f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78  pPager->jfd, &mx
5800: 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Pg);.  if( rc!=S
5810: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5820: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
5830: 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
5840: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
5850: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
5860: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
5870: 50 67 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Pg );.  rc = sql
5880: 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70  iteOsTruncate(&p
5890: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
58a0: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
58b0: 5f 74 29 6d 78 50 67 29 3b 0a 20 20 69 66 28 20  _t)mxPg);.  if( 
58c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
58d0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
58e0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
58f0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
5900: 78 50 67 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  xPg;.  .  /* Cop
5910: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
5920: 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
5930: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
5940: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
5950: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ile..  */.  for(
5960: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
5970: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
5980: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
5990: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
59a0: 67 65 72 2d 3e 6a 66 64 2c 20 66 6f 72 6d 61 74  ger->jfd, format
59b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
59c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
59d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
59e0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
59f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5a00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5a10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5a20: 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74  .  /* Pages that
5a30: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
5a40: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
5a50: 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63  l but never sync
5a60: 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f  ed.  ** where no
5a70: 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68  t restored by th
5a80: 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57  e loop above.  W
5a90: 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72  e have to restor
5aa0: 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67  e those.  ** pag
5ab0: 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  es by reading th
5ac0: 65 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  e back from the 
5ad0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
5ae0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
5af0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5b00: 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
5b10: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
5b20: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
5b30: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
5b40: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
5b50: 66 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  f[SQLITE_PAGE_SI
5b60: 5a 45 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ZE];.      if( !
5b70: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
5b80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5b90: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
5ba0: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
5bb0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
5bc0: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
5bd0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
5be0: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
5bf0: 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  _t)(pPg->pgno-1)
5c00: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
5c10: 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50  sqliteOsRead(&pP
5c20: 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
5c30: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5c40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5c50: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
5c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5c70: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
5c80: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5c90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5ca0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
5cb0: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
5cc0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
5cd0: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
5ce0: 45 5f 53 49 5a 45 29 20 29 7b 0a 20 20 20 20 20  E_SIZE) ){.     
5cf0: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
5d00: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
5d10: 75 66 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  uf, SQLITE_PAGE_
5d20: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 6d  SIZE);.        m
5d30: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
5d40: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
5d50: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
5d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
5d70: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
5d80: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
5d90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5da0: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
5db0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5dc0: 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  OK ){.    pager_
5dd0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
5de0: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
5df0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
5e00: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
5e10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
5e20: 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
5e30: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
5e40: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
5e50: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
5e60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
5e70: 6c 61 79 62 61 63 6b 20 74 68 65 20 63 68 65 63  layback the chec
5e80: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
5e90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
5ea0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
5eb0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
5ec0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
5ed0: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
5ee0: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
5ef0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
5f00: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
5f10: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
5f20: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
5f30: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
5f40: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
5f50: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
5f60: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 2c 20 6e 6f  er->ckptSize, no
5f70: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
5f80: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
5f90: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
5fa0: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
5fb0: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
5fc0: 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ck the checkpoin
5fd0: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
5fe0: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
5ff0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
6000: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6010: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
6020: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
6030: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
6040: 63 6b 70 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  ckptJSize..*/.st
6050: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 63  atic int pager_c
6060: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  kpt_playback(Pag
6070: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
6080: 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20  ff_t szJ;       
6090: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
60a0: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
60b0: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  nal */.  int nRe
60c0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
60d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
60e0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
60f0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
6100: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
6110: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
6120: 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65  ;..  /* Truncate
6130: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
6140: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
6150: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
6160: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75  rc = sqliteOsTru
6170: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
6180: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
6190: 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65  IZE*(off_t)pPage
61a0: 72 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a 20 20  r->ckptSize);.  
61b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
61c0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
61d0: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
61e0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
61f0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
6200: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
6210: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
6220: 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  t( pPager->ckptI
6230: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
6240: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
6250: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
6260: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b  Pager->cpfd, 0);
6270: 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
6280: 2d 3e 63 6b 70 74 4e 52 65 63 3b 0a 20 20 0a 20  ->ckptNRec;.  . 
6290: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
62a0: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
62b0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
62c0: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
62d0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
62e0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
62f0: 65 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b  e that the check
6300: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  point journal al
6310: 77 61 79 73 20 75 73 65 73 20 66 6f 72 6d 61 74  ways uses format
6320: 0a 20 20 2a 2a 20 32 20 69 6e 73 74 65 61 64 20  .  ** 2 instead 
6330: 6f 66 20 66 6f 72 6d 61 74 20 33 20 73 69 6e 63  of format 3 sinc
6340: 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  e it does not ne
6350: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
6360: 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 70 6f 77  ed with.  ** pow
6370: 65 72 20 66 61 69 6c 75 72 65 73 20 63 6f 72 72  er failures corr
6380: 75 70 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  upting the journ
6390: 61 6c 20 61 6e 64 20 63 61 6e 20 74 68 75 73 20  al and can thus 
63a0: 6f 6d 69 74 20 74 68 65 20 63 68 65 63 6b 73 75  omit the checksu
63b0: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ms..  */.  for(i
63c0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
63d0: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
63e0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
63f0: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
6400: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 32 29 3b  Pager->cpfd, 2);
6410: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
6420: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
6430: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6440: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
6450: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _ckpt_playback;.
6460: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
6470: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61   out how many pa
6480: 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
6490: 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
64a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
64b0: 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  * journal..  */.
64c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53    rc = sqliteOsS
64d0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
64e0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53  , pPager->ckptJS
64f0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
6500: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6510: 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70   goto end_ckpt_p
6520: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
6530: 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
6540: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
6550: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
6560: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6570: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b  .    goto end_ck
6580: 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  pt_playback;.  }
6590: 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d  .  nRec = (szJ -
65a0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
65b0: 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ze)/JOURNAL_PG_S
65c0: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
65d0: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  );.  for(i=nRec-
65e0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
65f0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
6600: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
6610: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
6620: 3e 6a 66 64 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f  >jfd, journal_fo
6630: 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28 20 72  rmat);.    if( r
6640: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6650: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
6660: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
6670: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
6680: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  ckpt_playback;. 
6690: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f     }.  }.  .end_
66a0: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  ckpt_playback:. 
66b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
66c0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
66d0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
66e0: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
66f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6700: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72  CORRUPT;.  }.  r
6710: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6720: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
6730: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
6740: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
6750: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
6760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
6770: 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68  mum number is th
6780: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
6790: 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70   of the mxPage p
67a0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
67b0: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
67c0: 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66  ve, the noSync f
67d0: 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  lag is also set.
67e0: 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65    noSync bypasse
67f0: 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  s.** calls to sq
6800: 6c 69 74 65 4f 73 53 79 6e 63 28 29 2e 20 20 54  liteOsSync().  T
6810: 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75  he pager runs mu
6820: 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20 6e  ch faster with n
6830: 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74  oSync on,.** but
6840: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
6850: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
6860: 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e 20   or there is an 
6870: 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a  abrupt power .**
6880: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61   failure, the da
6890: 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68  tabase file migh
68a0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  t be left in an 
68b0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
68c0: 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65  .** unrepairable
68d0: 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69   state.  .*/.voi
68e0: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65  d sqlitepager_se
68f0: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
6900: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
6910: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
6920: 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Page>=0 ){.    p
6930: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
6940: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
6950: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6960: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
6970: 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20  1;.    mxPage = 
6980: 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69  -mxPage;.  }.  i
6990: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
69a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
69b0: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
69c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
69d0: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
69e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
69f0: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
6a00: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
6a10: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
6a20: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
6a30: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
6a40: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
6a50: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
6a60: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
6a70: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
6a80: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
6a90: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 79        sqliteOsSy
6aa0: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
6ab0: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
6ac0: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
6ad0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
6ae0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
6af0: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
6b00: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
6b10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
6b20: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
6b30: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
6b40: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
6b50: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
6b60: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
6b70: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
6b80: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
6ba0: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
6bb0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
6bc0: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
6bd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
6be0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
6bf0: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
6c00: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
6c10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
6c20: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
6c30: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
6c40: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
6c70: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
6c80: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
6c90: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
6ca0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
6cb0: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
6cc0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
6cd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
6ce0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
6cf0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
6d00: 66 6f 72 6d 61 74 69 6f 6e 20 62 65 69 6e 67 20  formation being 
6d10: 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 20  written.**      
6d20: 20 20 20 20 20 20 20 20 69 6e 20 62 65 74 77 65          in betwe
6d30: 65 6e 20 74 68 65 20 74 77 6f 20 73 79 6e 63 73  en the two syncs
6d40: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
6d50: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
6d60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
6d70: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
6d80: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
6d90: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
6da0: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
6db0: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
6dc0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
6dd0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
6de0: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
6e00: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
6e10: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
6e20: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
6e30: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
6e40: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
6e50: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
6e60: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
6e70: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
6e80: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
6e90: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
6ea0: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
6eb0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
6ec0: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
6ed0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
6ee0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
6ef0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
6f00: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
6f10: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
6f20: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
6f30: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
6f40: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
6f50: 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61  e.  Write the na
6f60: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  me of the file i
6f70: 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e  nto zName.** (zN
6f80: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ame must be at l
6f90: 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50  east SQLITE_TEMP
6fa0: 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20  NAME_SIZE bytes 
6fb0: 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a  long.)  Write.**
6fc0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
6fd0: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
6fe0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
6ff0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
7000: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
7010: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
7020: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
7030: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
7040: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
7050: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
7060: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
7070: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
7080: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70  t sqlitepager_op
7090: 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69  entemp(char *zFi
70a0: 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b  le, OsFile *fd){
70b0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
70c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a    int rc;.  do{.
70d0: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
70e0: 71 6c 69 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e  qliteOsTempFileN
70f0: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
7100: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65  rc = sqliteOsOpe
7110: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
7120: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
7130: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
7140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
7150: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7160: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
7170: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
7180: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
7190: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
71a0: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
71b0: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
71c0: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
71d0: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
71e0: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
71f0: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
7200: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70   call to sqlitep
7210: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
7220: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
7230: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
7240: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
7250: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
7260: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
7270: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
7280: 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
7290: 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
72a0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
72b0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
72c0: 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
72d0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
72e0: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
72f0: 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
7300: 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
7310: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  it is closed..*/
7320: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
7330: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
7340: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
7350: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
7360: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
7370: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
7380: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
7390: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
73a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
73b0: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
73c0: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
73d0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
73e0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
73f0: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
7400: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
7410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
7420: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
7430: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7440: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
7450: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20   useJournal     
7460: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
7470: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
7480: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7490: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
74a0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
74b0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
74c0: 65 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  e;.  int nameLen
74d0: 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20  ;.  OsFile fd;. 
74e0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74   int rc;.  int t
74f0: 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  empFile;.  int r
7500: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63  eadOnly = 0;.  c
7510: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
7520: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
7530: 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  ..  *ppPager = 0
7540: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  ;.  if( sqlite_m
7550: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
7560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7570: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
7580: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a  f( zFilename ){.
7590: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
75a0: 65 20 3d 20 73 71 6c 69 74 65 4f 73 46 75 6c 6c  e = sqliteOsFull
75b0: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
75c0: 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  me);.    rc = sq
75d0: 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72  liteOsOpenReadWr
75e0: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
75f0: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
7600: 79 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  y);.    tempFile
7610: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
7630: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
7640: 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46  mp, &fd);.    zF
7650: 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b  ilename = zTemp;
7660: 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61  .    zFullPathna
7670: 6d 65 20 3d 20 73 71 6c 69 74 65 4f 73 46 75 6c  me = sqliteOsFul
7680: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
7690: 61 6d 65 29 3b 0a 20 20 20 20 74 65 6d 70 46 69  ame);.    tempFi
76a0: 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  le = 1;.  }.  if
76b0: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
76c0: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
76d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
76e0: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  M;.  }.  if( rc!
76f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7700: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
7710: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
7720: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7730: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e  ANTOPEN;.  }.  n
7740: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
7750: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
7760: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
7770: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7780: 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
7790: 65 6e 2a 32 20 2b 20 33 30 20 29 3b 0a 20 20 69  en*2 + 30 );.  i
77a0: 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  f( pPager==0 ){.
77b0: 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73      sqliteOsClos
77c0: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
77d0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
77e0: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
77f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7800: 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28    }.  SET_PAGER(
7810: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
7820: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
7830: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
7840: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
7850: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
7860: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
7870: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
7880: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
7890: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
78a0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
78b0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75  r->zJournal, zFu
78c0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
78d0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
78e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
78f0: 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
7900: 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22  rnal[nameLen], "
7910: 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50  -journal");.  pP
7920: 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
7930: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7940: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
7950: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
7960: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70   useJournal;.  p
7970: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
7980: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  = 0;.  pPager->c
7990: 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  kptInUse = 0;.  
79a0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
79b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
79c0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
79d0: 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 30 3b  r->ckptSize = 0;
79e0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  .  pPager->ckptJ
79f0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
7a00: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
7a10: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
7a20: 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50  = mxPage>5 ? mxP
7a30: 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67  age : 10;.  pPag
7a40: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
7a50: 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  TE_UNLOCK;.  pPa
7a60: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
7a70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  ;.  pPager->temp
7a80: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
7a90: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
7aa0: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
7ab0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7ac0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
7ad0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
7ae0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
7af0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
7b00: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
7b10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
7b20: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
7b30: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
7b40: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  0;.  pPager->nEx
7b50: 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20  tra = nExtra;.  
7b60: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
7b70: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
7b80: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
7b90: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
7ba0: 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
7bb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7bc0: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
7bd0: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
7be0: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
7bf0: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
7c00: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
7c10: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
7c20: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
7c30: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
7c40: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
7c50: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
7c60: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
7c70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
7c80: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
7c90: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
7ca0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
7cb0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
7cc0: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
7cd0: 65 73 75 6c 74 20 73 71 6c 69 74 65 70 61 67 65  esult sqlitepage
7ce0: 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  r_close().  .** 
7cf0: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
7d00: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
7d10: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
7d20: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
7d30: 74 65 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74  tepager_set_dest
7d40: 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
7d50: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
7d60: 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a 20 20 70  sc)(void*)){.  p
7d70: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
7d80: 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
7d90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7da0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7db0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
7dc0: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
7dd0: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
7de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
7df0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
7e00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7e10: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
7e20: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
7e30: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
7e40: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
7e50: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
7e60: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
7e70: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
7e80: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  e(&pPager->fd, &
7e90: 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  n)!=SQLITE_OK ){
7ea0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
7eb0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
7ec0: 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75  R_DISK;.    retu
7ed0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d  rn 0;.  }.  n /=
7ee0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
7ef0: 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  E;.  if( pPager-
7f00: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
7f10: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
7f20: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
7f30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
7f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
7f50: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
7f60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
7f70: 41 6c 6c 50 61 67 65 73 28 50 61 67 65 72 2a 29  AllPages(Pager*)
7f80: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
7f90: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
7fa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
7fb0: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
7fc0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
7fd0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
7fe0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
7ff0: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
8000: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
8010: 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ize<0 ){.    sql
8020: 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75  itepager_pagecou
8030: 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
8040: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
8050: 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
8060: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
8070: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
8080: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
8090: 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
80a0: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
80b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
80c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
80d0: 7d 0a 20 20 73 79 6e 63 41 6c 6c 50 61 67 65 73  }.  syncAllPages
80e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
80f0: 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74   sqliteOsTruncat
8100: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
8110: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
8120: 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20  (off_t)nPage);. 
8130: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8140: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
8150: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
8160: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8170: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
8180: 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
8190: 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
81a0: 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
81b0: 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
81c0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
81d0: 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
81e0: 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
81f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
8200: 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
8210: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
8220: 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
8230: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
8240: 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
8250: 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
8260: 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
8270: 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
8280: 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
8290: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
82a0: 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
82b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
82c0: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
82d0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
82e0: 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
82f0: 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28  litepager_close(
8300: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8310: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
8320: 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Next;.  switch( 
8330: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
8340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8350: 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20  _WRITELOCK: {.  
8360: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
8370: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
8380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
8390: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
83a0: 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
83b0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
83c0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
83d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
83e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
83f0: 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20  READLOCK: {.    
8400: 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b    sqliteOsUnlock
8410: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
8420: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8430: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
8440: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
8450: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
8460: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
8470: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
8480: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
8490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
84a0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
84b0: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
84c0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 73 71  e(pPg);.  }.  sq
84d0: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61  liteOsClose(&pPa
84e0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65  ger->fd);.  asse
84f0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
8500: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
8510: 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
8520: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
8530: 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
8540: 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
8550: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
8560: 20 2a 2a 20 20 20 73 71 6c 69 74 65 4f 73 44 65   **   sqliteOsDe
8570: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
8580: 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
8590: 20 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52    */.  CLR_PAGER
85a0: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
85b0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
85c0: 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65  e!=(char*)&pPage
85d0: 72 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  r[1] ){.    sqli
85e0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
85f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
8600: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
8610: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  ->zJournal);.  }
8620: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
8630: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
8640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8650: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
8660: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
8670: 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
8680: 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
8690: 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  tepager_pagenumb
86a0: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  er(void *pData){
86b0: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41  .  PgHdr *p = DA
86c0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
86d0: 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  a);.  return p->
86e0: 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pgno;.}../*.** I
86f0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
8700: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
8710: 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68 65   a page.  If the
8720: 20 70 61 67 65 20 69 73 0a 2a 2a 20 63 75 72 72   page is.** curr
8730: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
8740: 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
8750: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
8760: 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
8770: 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
8780: 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66  reelist..*/.#def
8790: 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
87a0: 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
87b0: 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
87c0: 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
87d0: 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
87e0: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
87f0: 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
8800: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
8810: 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
8820: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
8830: 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
8840: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
8850: 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
8860: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
8870: 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
8880: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
8890: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
88a0: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
88b0: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
88c0: 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
88d0: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
88e0: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
88f0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
8900: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
8910: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
8920: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
8930: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
8940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
8950: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
8960: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
8970: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
8980: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
8990: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
89a0: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
89b0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
89c0: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
89d0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
89e0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
89f0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
8a00: 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
8a10: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
8a20: 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
8a30: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
8a40: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
8a50: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
8a60: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
8a70: 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
8a80: 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
8a90: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
8aa0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
8ab0: 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66 28 76  qlitepager_ref(v
8ac0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
8ad0: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
8ae0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
8af0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
8b00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
8b10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8b20: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
8b30: 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20   and then write 
8b40: 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20 70  all free dirty p
8b50: 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
8b60: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a  base.** file..**
8b70: 0a 2a 2a 20 57 72 69 74 69 6e 67 20 61 6c 6c 20  .** Writing all 
8b80: 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65 73  free dirty pages
8b90: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8ba0: 20 61 66 74 65 72 20 74 68 65 20 73 79 6e 63 20   after the sync 
8bb0: 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69  is a.** non-obvi
8bc0: 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
8bd0: 2e 20 20 66 73 79 6e 63 28 29 20 69 73 20 61 6e  .  fsync() is an
8be0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
8bf0: 74 69 6f 6e 20 73 6f 20 77 65 0a 2a 2a 20 77 61  tion so we.** wa
8c00: 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  nt to minimize t
8c10: 68 65 20 6e 75 6d 62 65 72 20 6f 74 20 74 69 6d  he number ot tim
8c20: 65 73 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e  es it is called.
8c30: 20 41 66 74 65 72 20 61 6e 20 66 73 79 6e 63 28   After an fsync(
8c40: 29 20 63 61 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72  ) call,.** we ar
8c50: 65 20 66 72 65 65 20 74 6f 20 77 72 69 74 65 20  e free to write 
8c60: 64 69 72 74 79 20 70 61 67 65 73 20 62 61 63 6b  dirty pages back
8c70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8c80: 2e 20 20 49 74 20 69 73 20 62 65 73 74 0a 2a 2a  .  It is best.**
8c90: 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
8ca0: 20 77 72 69 74 65 20 61 73 20 6d 61 6e 79 20 64   write as many d
8cb0: 69 72 74 79 20 70 61 67 65 73 20 61 73 20 70 6f  irty pages as po
8cc0: 73 73 69 62 6c 65 20 74 6f 20 6d 69 6e 69 6d 69  ssible to minimi
8cd0: 7a 65 20 0a 2a 2a 20 74 68 65 20 72 69 73 6b 20  ze .** the risk 
8ce0: 6f 66 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  of having to do 
8cf0: 61 6e 6f 74 68 65 72 20 66 73 79 6e 63 28 29 20  another fsync() 
8d00: 6c 61 74 65 72 20 6f 6e 2e 20 20 57 72 69 74 69  later on.  Writi
8d10: 6e 67 20 64 69 72 74 79 0a 2a 2a 20 66 72 65 65  ng dirty.** free
8d20: 20 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 77   pages in this w
8d30: 61 79 20 77 61 73 20 6f 62 73 65 72 76 65 64 20  ay was observed 
8d40: 74 6f 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  to make database
8d50: 20 6f 70 65 72 61 74 69 6f 6e 73 20 67 6f 0a 2a   operations go.*
8d60: 2a 20 75 70 20 74 6f 20 31 30 20 74 69 6d 65 73  * up to 10 times
8d70: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
8d80: 66 20 77 65 20 61 72 65 20 77 72 69 74 69 6e 67  f we are writing
8d90: 20 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 64 61   to temporary da
8da0: 74 61 62 61 73 65 2c 20 74 68 65 72 65 20 69 73  tabase, there is
8db0: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 70 72 65 73   no need to pres
8dc0: 65 72 76 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65  erve.** the inte
8dd0: 67 72 69 74 79 20 6f 66 20 74 68 65 20 6a 6f 75  grity of the jou
8de0: 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 77 65  rnal file, so we
8df0: 20 63 61 6e 20 73 61 76 65 20 74 69 6d 65 20 61   can save time a
8e00: 6e 64 20 73 6b 69 70 20 74 68 65 0a 2a 2a 20 66  nd skip the.** f
8e10: 73 79 6e 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sync()..*/.stati
8e20: 63 20 69 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67  c int syncAllPag
8e30: 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
8e40: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
8e50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8e60: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
8e70: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
8e80: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
8e90: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
8ea0: 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
8eb0: 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
8ec0: 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
8ed0: 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
8ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
8ef0: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
8f00: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
8f10: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
8f20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8f30: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
8f40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
8f50: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
8f60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
8f70: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
8f80: 6f 66 66 5f 74 20 68 64 72 53 7a 2c 20 70 67 53  off_t hdrSz, pgS
8f90: 7a 2c 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  z, jSz;.        
8fa0: 68 64 72 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f  hdrSz = JOURNAL_
8fb0: 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66  HDR_SZ(journal_f
8fc0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20  ormat);.        
8fd0: 70 67 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50  pgSz = JOURNAL_P
8fe0: 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  G_SZ(journal_for
8ff0: 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  mat);.        rc
9000: 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53   = sqliteOsFileS
9010: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
9020: 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20  , &jSz);.       
9030: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
9040: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
9050: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9060: 6e 52 65 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d  nRec*pgSz+hdrSz=
9070: 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
9080: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
9090: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e   journal_format>
90a0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  =3 ){.        of
90b0: 66 5f 74 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f_t szJ;.       
90c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
90d0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
90e0: 20 20 20 54 52 41 43 45 31 28 22 53 59 4e 43 5c     TRACE1("SYNC\
90f0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  n");.          r
9100: 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79 6e 63  c = sqliteOsSync
9110: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
9120: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
9130: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
9140: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9150: 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28     sqliteOsSeek(
9160: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69  &pPager->jfd, si
9170: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9180: 69 63 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72  ic1));.        r
9190: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
91a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
91b0: 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
91c0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
91d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
91e0: 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48   szJ = JOURNAL_H
91f0: 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f  DR_SZ(journal_fo
9200: 72 6d 61 74 29 20 2b 0a 20 20 20 20 20 20 20 20  rmat) +.        
9210: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
9220: 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47  >nRec*JOURNAL_PG
9230: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
9240: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  at);.        sql
9250: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
9260: 72 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20  r->jfd, szJ);.  
9270: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
9280: 45 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20  E1("SYNC\n");.  
9290: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
92a0: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a  sSync(&pPager->j
92b0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
92c0: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
92d0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
92e0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
92f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
9300: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9310: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
9320: 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
9330: 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
9340: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
9350: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
9360: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
9370: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
9380: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
9390: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
93a0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
93b0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
93c0: 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
93d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
93e0: 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
93f0: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
9400: 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
9410: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
9420: 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
9430: 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
9440: 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
9450: 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
9460: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
9470: 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
9480: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
9490: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
94a0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
94b0: 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
94c0: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
94d0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
94e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
94f0: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
9500: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
9510: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
9520: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9530: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
9540: 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
9550: 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
9560: 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
9570: 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
9580: 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
9590: 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
95a0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
95b0: 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
95c0: 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
95d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
95e0: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
95f0: 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
9600: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
9610: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
9620: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
9630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
9640: 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
9650: 67 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  ger;.  while( pL
9660: 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
9670: 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
9680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53  );.    sqliteOsS
9690: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
96a0: 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
96b0: 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50  *(off_t)SQLITE_P
96c0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72  AGE_SIZE);.    r
96d0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
96e0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  e(&pPager->fd, P
96f0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
9700: 73 74 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  st), SQLITE_PAGE
9710: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
9720: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9730: 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
9740: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
9750: 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
9760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9770: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9780: 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
9790: 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
97a0: 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
97b0: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
97c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
97d0: 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
97e0: 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
97f0: 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
9800: 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
9810: 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
9820: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
9830: 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
9840: 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
9850: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
9860: 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
9870: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
9880: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
9890: 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
98a0: 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
98b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
98c0: 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
98d0: 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
98e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
98f0: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
9900: 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
9910: 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
9920: 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
9930: 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
9940: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
9950: 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
9960: 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
9970: 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
9980: 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
9990: 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
99a0: 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
99b0: 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
99c0: 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
99d0: 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
99e0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
99f0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9a00: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
9a10: 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
9a20: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
9a30: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
9a40: 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
9a50: 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
9a60: 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
9a70: 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
9a80: 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
9a90: 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
9aa0: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
9ab0: 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
9ac0: 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
9ad0: 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
9ae0: 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
9af0: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
9b00: 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
9b10: 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
9b20: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
9b30: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
9b40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
9b50: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
9b60: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
9b70: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
9b80: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f   sqlitepager_loo
9b90: 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
9ba0: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
9bb0: 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
9bc0: 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
9bd0: 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
9be0: 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
9bf0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
9c00: 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
9c10: 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
9c20: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
9c30: 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
9c40: 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
9c50: 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
9c60: 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
9c70: 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
9c80: 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
9c90: 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
9ca0: 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
9cb0: 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
9cc0: 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
9cd0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
9ce0: 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
9cf0: 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
9d00: 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
9d10: 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
9d20: 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
9d30: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
9d40: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9d50: 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
9d60: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
9d70: 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
9d80: 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
9d90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
9da0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
9db0: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
9dc0: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
9dd0: 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
9de0: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
9df0: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
9e00: 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
9e10: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9e20: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
9e30: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
9e40: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
9e50: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
9e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9e70: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
9e80: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
9e90: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
9ea0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
9eb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
9ec0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
9ed0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
9ee0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
9ef0: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
9f00: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
9f10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9f20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9f30: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
9f40: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
9f50: 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f  READLOCK;..    /
9f60: 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
9f70: 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79 20  ile exists, try 
9f80: 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 2e  to play it back.
9f90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9fa0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
9fb0: 61 6c 20 26 26 20 73 71 6c 69 74 65 4f 73 46 69  al && sqliteOsFi
9fc0: 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
9fd0: 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  >zJournal) ){.  
9fe0: 20 20 20 20 20 69 6e 74 20 72 63 2c 20 64 75 6d       int rc, dum
9ff0: 6d 79 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47  my;..       /* G
a000: 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
a010: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
a020: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a030: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
a040: 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  iteLock(&pPager-
a050: 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  >fd);.       if(
a060: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a070: 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 73  {.         if( s
a080: 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70  qliteOsUnlock(&p
a090: 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49  Pager->fd)!=SQLI
a0a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a0b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75      /* This shou
a0c0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 21  ld never happen!
a0d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 72   */.           r
a0e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
a0f0: 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a  NAL;.         }.
a100: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a110: 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
a120: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
a130: 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  e = SQLITE_WRITE
a140: 4c 4f 43 4b 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  LOCK;..       /*
a150: 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
a160: 6c 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  l for exclusive 
a170: 61 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20  access.  Return 
a180: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
a190: 20 20 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e        ** we cann
a1a0: 6f 74 20 67 65 74 20 65 78 63 6c 75 73 69 76 65  ot get exclusive
a1b0: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6a   access to the j
a1c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
a1d0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a       **.       *
a1e0: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 77 65  * Even though we
a1f0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 72 65   will only be re
a200: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
a210: 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 77 72 69 74  ournal, not writ
a220: 69 6e 67 2c 0a 20 20 20 20 20 20 20 2a 2a 20 77  ing,.       ** w
a230: 65 20 68 61 76 65 20 74 6f 20 6f 70 65 6e 20 74  e have to open t
a240: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 77  he journal for w
a250: 72 69 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  riting in order 
a260: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 0a 20 20 20  to obtain an.   
a270: 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
a280: 20 61 63 63 65 73 73 20 6c 6f 63 6b 2e 0a 20 20   access lock..  
a290: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
a2a0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e  c = sqliteOsOpen
a2b0: 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
a2c0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
a2d0: 67 65 72 2d 3e 6a 66 64 2c 20 26 64 75 6d 6d 79  ger->jfd, &dummy
a2e0: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
a2f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a300: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
a310: 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  iteOsUnlock(&pPa
a320: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
a330: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
a340: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a350: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a360: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
a370: 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
a380: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
a390: 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
a3a0: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
a3b0: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  = 0;..       /* 
a3c0: 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
a3d0: 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
a3e0: 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
a3f0: 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
a400: 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
a410: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
a420: 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
a430: 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
a440: 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
a450: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 69 66  r, 0);.       if
a460: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a470: 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  ){.         retu
a480: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
a490: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
a4a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
a4b0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
a4c0: 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
a4d0: 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
a4e0: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
a4f0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  no);.  }.  if( p
a500: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
a510: 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
a520: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
a530: 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
a540: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70      int h;.    p
a550: 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a  Pager->nMiss++;.
a560: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
a570: 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
a580: 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Page || pPager->
a590: 70 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pFirst==0 ){.   
a5a0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
a5b0: 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
a5c0: 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
a5d0: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
a5e0: 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f 50 41  pPg) + SQLITE_PA
a5f0: 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 20 20  GE_SIZE .       
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
a620: 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
a630: 45 78 74 72 61 20 29 3b 0a 20 20 20 20 20 20 69  Extra );.      i
a640: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
a650: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69       pager_unwri
a660: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
a670: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a680: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
a690: 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
a6a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a6b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
a6c0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
a6d0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
a6e0: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  );.      pPg->pP
a6f0: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
a700: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41       pPg->pNextA
a710: 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
a720: 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  l;.      if( pPa
a730: 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
a740: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
a750: 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70 50  l->pPrevAll = pP
a760: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  g;.      }.     
a770: 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20 3d   pPg->pPrevAll =
a780: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
a790: 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
a7a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
a7b0: 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e++;.    }else{.
a7c0: 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20        /* Find a 
a7d0: 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
a7e0: 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
a7f0: 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
a800: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65   not.      ** re
a810: 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
a820: 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
a830: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20   journal..      
a840: 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  */.      pPg = p
a850: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
a860: 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ced;..      /* I
a870: 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
a880: 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
a890: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
a8a0: 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20   an fsync().    
a8b0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
a8c0: 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
a8d0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
a8e0: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
a8f0: 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73  .      ** very s
a900: 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
a910: 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
a920: 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
a930: 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20   sometimes.     
a940: 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
a950: 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f  helped..      */
a960: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
a970: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
a980: 20 72 63 20 3d 20 73 79 6e 63 41 6c 6c 50 61 67   rc = syncAllPag
a990: 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
a9a0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
a9b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a9c0: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
a9d0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
a9e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a9f0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
aa00: 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
aa10: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
aa20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
aa30: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
aa40: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
aa50: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
aa60: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
aa70: 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
aa80: 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
aa90: 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
aaa0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
aab0: 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
aac0: 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
aad0: 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
aae0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
aaf0: 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
ab00: 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
ab10: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ab20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ab30: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
ab40: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
ab50: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ab60: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
ab70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ab80: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
ab90: 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
aba0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
abb0: 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
abc0: 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
abd0: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
abe0: 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ack, then.      
abf0: 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
ac00: 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
ac10: 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
ac20: 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  bling the.      
ac30: 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72  ** sqlite_dont_r
ac40: 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
ac50: 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
ac60: 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
ac70: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
ac80: 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
ac90: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
aca0: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
acb0: 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
acc0: 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67  ack.      ** mig
acd0: 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
ace0: 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
acf0: 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
ad00: 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
ad10: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  er.      ** that
ad20: 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
ad30: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
ad40: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
ad50: 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
ad60: 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65       ** be marke
ad70: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
ad80: 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
ad90: 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   out..      */. 
ada0: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c       if( pPg->al
adb0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
adc0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
add0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
ade0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
adf0: 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65     /* Unlink the
ae00: 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
ae10: 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
ae20: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
ae30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ae40: 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
ae50: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
ae60: 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
ae70: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
ae80: 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e;.        while
ae90: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
aea0: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
aeb0: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
aec0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
aed0: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
aee0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
aef0: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
af00: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72          pPg->pPr
af10: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
af20: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
af30: 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ee;.      }else{
af40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
af50: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
af60: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
af70: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
af80: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
af90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
afa0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
afb0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
afc0: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
afd0: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
afe0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  revFree;.      }
aff0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
b000: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
b010: 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
b020: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
b030: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
b040: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ee;.      }.    
b050: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
b060: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
b070: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
b080: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
b090: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
b0a0: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
b0b0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
b0c0: 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  vHash;.      }. 
b0d0: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50       if( pPg->pP
b0e0: 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 20  revHash ){.     
b0f0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
b100: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
b110: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
b120: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b130: 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
b140: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
b150: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b160: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
b170: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
b180: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
b190: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
b1a0: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
b1b0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
b1c0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
b1d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
b1e0: 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20  er->nOvfl++;.   
b1f0: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
b200: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
b210: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
b220: 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
b230: 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
b240: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
b250: 6c 69 74 65 43 68 65 63 6b 4d 65 6d 6f 72 79 28  liteCheckMemory(
b260: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
b270: 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
b280: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b290: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
b2a0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
b2b0: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
b2c0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
b2d0: 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
b2e0: 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
b2f0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
b300: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
b310: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
b320: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
b330: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
b340: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b350: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 26  Pager->aInCkpt &
b360: 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
b370: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 0a 20 20  ger->ckptSize.  
b380: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
b390: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
b3a0: 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
b3b0: 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
b3c0: 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
b3d0: 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  ckpt_list(pPg);.
b3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b3f0: 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
b400: 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29  m_ckpt_list(pPg)
b410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
b420: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
b430: 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
b440: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
b450: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
b460: 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67  f++;.    h = pag
b470: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
b480: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
b490: 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
b4a0: 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
b4b0: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
b4c0: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
b4d0: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
b4e0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
b4f0: 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
b500: 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
b510: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
b520: 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
b530: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b540: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
b550: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
b560: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
b570: 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
b580: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
b590: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
b5a0: 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65  bSize<0 ) sqlite
b5b0: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
b5c0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
b5d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
b5e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
b5f0: 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 50  itepager_unref(P
b600: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
b610: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ));.      rc = p
b620: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
b630: 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ger);.      retu
b640: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
b650: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
b660: 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b  ize<(int)pgno ){
b670: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
b680: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
b690: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  , 0, SQLITE_PAGE
b6a0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73  _SIZE);.    }els
b6b0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  e{.      int rc;
b6c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53  .      sqliteOsS
b6d0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
b6e0: 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74   (pgno-1)*(off_t
b6f0: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
b700: 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  E);.      rc = s
b710: 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61  qliteOsRead(&pPa
b720: 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
b730: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c  O_DATA(pPg), SQL
b740: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
b750: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
b760: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b770: 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a     off_t fileSiz
b780: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
b790: 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28  qliteOsFileSize(
b7a0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c  &pPager->fd,&fil
b7b0: 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f  eSize)!=SQLITE_O
b7c0: 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
b7d0: 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67   || fileSize>=pg
b7e0: 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  no*SQLITE_PAGE_S
b7f0: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
b800: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
b810: 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
b820: 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20  (pPg));.        
b830: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
b840: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b850: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
b860: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
b870: 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   0, SQLITE_PAGE_
b880: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  SIZE);.        }
b890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
b8b0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
b8c0: 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
b8d0: 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70   cache. */.    p
b8e0: 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20  Pager->nHit++;. 
b8f0: 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
b900: 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
b910: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
b920: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
b930: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b940: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
b950: 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
b960: 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
b970: 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
b980: 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
b990: 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
b9a0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
b9b0: 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
b9c0: 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
b9d0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
b9e0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
b9f0: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65  o sqlitepager_ge
ba00: 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
ba10: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
ba20: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
ba30: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74   sqlitepager_get
ba40: 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
ba50: 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
ba60: 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
ba70: 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
ba80: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
ba90: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
baa0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
bab0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
bac0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
bad0: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
bae0: 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
baf0: 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
bb00: 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f   happened..*/.vo
bb10: 69 64 20 2a 73 71 6c 69 74 65 70 61 67 65 72 5f  id *sqlitepager_
bb20: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
bb30: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
bb40: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
bb50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bb60: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
bb70: 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69  ( pgno!=0 );.  i
bb80: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
bb90: 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52  sk & ~(PAGER_ERR
bba0: 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65  _FULL) ){.    re
bbb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
bbc0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
bbd0: 66 3d 3d 30 20 29 7b 0a 20 20 2a 2a 20 20 72 65  f==0 ){.  **  re
bbe0: 74 75 72 6e 20 30 3b 0a 20 20 2a 2a 20 7d 0a 20  turn 0;.  ** }. 
bbf0: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
bc00: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
bc10: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
bc20: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
bc30: 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
bc40: 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52  ;.  return PGHDR
bc50: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d  _TO_DATA(pPg);.}
bc60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
bc70: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
bc80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
bc90: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
bca0: 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
bcb0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
bcc0: 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
bcd0: 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
bce0: 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
bcf0: 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
bd00: 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
bd10: 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
bd20: 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
bd30: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bd40: 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
bd50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
bd60: 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
bd70: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
bd80: 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
bd90: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
bda0: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
bdb0: 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
bdc0: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
bdd0: 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
bde0: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
bdf0: 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
be00: 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
be10: 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
be20: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
be30: 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
be40: 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
be50: 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
be60: 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
be70: 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
be80: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
be90: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
bea0: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
beb0: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
bec0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
bed0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
bee0: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
bef0: 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
bf00: 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
bf10: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
bf20: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
bf30: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
bf40: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
bf50: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
bf60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bf70: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
bf80: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
bf90: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
bfa0: 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
bfb0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
bfc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
bfd0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
bfe0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
bff0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
c000: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
c010: 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
c020: 72 75 63 74 6f 72 28 70 44 61 74 61 29 3b 0a 20  ructor(pData);. 
c030: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
c040: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
c050: 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
c060: 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
c070: 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
c080: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c090: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
c0a0: 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
c0b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
c0c0: 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
c0d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
c0e0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ef==0 ){.      p
c0f0: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
c100: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
c110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
c130: 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
c140: 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
c150: 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
c160: 64 79 20 62 65 20 61 20 77 72 69 74 65 0a 2a 2a  dy be a write.**
c170: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
c180: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
c190: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c1a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
c1b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
c1c0: 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
c1d0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
c1e0: 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
c1f0: 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
c200: 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
c210: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
c220: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
c230: 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
c240: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
c250: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
c260: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51  Pager->state==SQ
c270: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
c280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c290: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
c2a0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c2b0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
c2c0: 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al );.  pPager->
c2d0: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
c2e0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
c2f0: 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
c300: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
c310: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
c320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65  {.    sqliteOsRe
c330: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
c340: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
c350: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
c360: 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  READLOCK;.    re
c370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c380: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
c390: 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73  liteOsOpenExclus
c3a0: 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ive(pPager->zJou
c3b0: 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
c3c0: 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  fd,pPager->tempF
c3d0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
c3e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c3f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
c400: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
c410: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
c420: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c430: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
c440: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
c450: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
c460: 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c  e = SQLITE_READL
c470: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
c480: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
c490: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
c4a0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
c4b0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c4c0: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
c4d0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
c4e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
c4f0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
c500: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
c510: 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
c520: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
c530: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
c540: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
c550: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
c560: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
c570: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
c580: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
c590: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
c5a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
c5b0: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
c5c0: 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52  mat==JOURNAL_FOR
c5d0: 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20  MAT_3 ){.    rc 
c5e0: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
c5f0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
c600: 6f 75 72 6e 61 6c 4d 61 67 69 63 33 2c 20 73 69  ournalMagic3, si
c610: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
c620: 69 63 33 29 29 3b 0a 20 20 20 20 69 66 28 20 72  ic3));.    if( r
c630: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c640: 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
c650: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
c660: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  jfd, pPager->noS
c670: 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66  ync ? 0xffffffff
c680: 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20   : 0);.    }.   
c690: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c6a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
c6b0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20  er->cksumInit = 
c6c0: 28 75 33 32 29 73 71 6c 69 74 65 52 61 6e 64 6f  (u32)sqliteRando
c6d0: 6d 49 6e 74 65 67 65 72 28 29 3b 0a 20 20 20 20  mInteger();.    
c6e0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
c6f0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
c700: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
c710: 69 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  it);.    }.  }el
c720: 73 65 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66  se if( journal_f
c730: 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat==JOURNAL_F
c740: 4f 52 4d 41 54 5f 32 20 29 7b 0a 20 20 20 20 72  ORMAT_2 ){.    r
c750: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
c760: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
c770: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32 2c 20  aJournalMagic2, 
c780: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
c790: 61 67 69 63 32 29 29 3b 0a 20 20 7d 65 6c 73 65  agic2));.  }else
c7a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 6f  {.    assert( jo
c7b0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f  urnal_format==JO
c7c0: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29  URNAL_FORMAT_1 )
c7d0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c7e0: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
c7f0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
c800: 61 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4a  agic1, sizeof(aJ
c810: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b 0a  ournalMagic1));.
c820: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
c830: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
c840: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
c850: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
c860: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
c870: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
c880: 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26  >ckptAutoopen &&
c890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c8a0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c8b0: 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69  epager_ckpt_begi
c8c0: 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
c8d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c8e0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
c8f0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
c900: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
c910: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c920: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c930: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
c940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c950: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  ;  .}../*.** Acq
c960: 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
c970: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
c980: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
c990: 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
c9a0: 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
c9b0: 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
c9c0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
c9d0: 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  tepager_commit()
c9e0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
c9f0: 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f   *  sqlitepager_
ca00: 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
ca10: 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
ca20: 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28  litepager_close(
ca30: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
ca40: 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72    *  sqlitepager
ca50: 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
ca60: 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
ca70: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
ca80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
ca90: 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
caa0: 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
cab0: 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
cac0: 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
cad0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
cae0: 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
caf0: 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
cb00: 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 0a   is used merely.
cb10: 2a 2a 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ** to acquire a 
cb20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
cb30: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
cb40: 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
cb50: 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72   there.** is alr
cb60: 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
cb70: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
cb80: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
cb90: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
cba0: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
cbb0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
cbc0: 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72  .  For.** tempor
cbd0: 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  ary files, the o
cbe0: 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
cbf0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
cc00: 66 65 72 72 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  ferred until.** 
cc10: 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
cc20: 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
cc30: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
cc40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
cc50: 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
cc60: 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20  y write-locked, 
cc70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
cc80: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
cc90: 73 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69  sqlitepager_begi
cca0: 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  n(void *pData){.
ccb0: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
ccc0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
ccd0: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
cce0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ccf0: 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
cd00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
cd10: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
cd20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
cd30: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
cd40: 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  TE_UNLOCK );.  i
cd50: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
cd60: 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  ==SQLITE_READLOC
cd70: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
cd80: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
cd90: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  nal==0 );.    rc
cda0: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
cdb0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
cdc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
cdd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cde0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
cdf0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
ce00: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52  tate = SQLITE_WR
ce10: 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61  ITELOCK;.    pPa
ce20: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
ce30: 20 30 3b 0a 20 20 20 20 54 52 41 43 45 31 28 22   0;.    TRACE1("
ce40: 54 52 41 4e 53 41 43 54 49 4f 4e 5c 6e 22 29 3b  TRANSACTION\n");
ce50: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ce60: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
ce70: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
ce80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
ce90: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
cea0: 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
ceb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
cec0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
ced0: 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
cee0: 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
cef0: 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
cf00: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
cf10: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
cf20: 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
cf30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
cf40: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
cf50: 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
cf60: 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
cf70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
cf80: 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
cf90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
cfa0: 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
cfb0: 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
cfc0: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
cfd0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
cfe0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
cff0: 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63  the write.** loc
d000: 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
d010: 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
d020: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
d030: 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
d040: 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
d050: 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
d060: 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
d070: 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
d080: 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
d090: 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
d0a0: 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
d0b0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
d0c0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
d0d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d0e0: 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
d0f0: 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
d100: 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
d110: 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
d120: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
d130: 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
d140: 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
d150: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
d160: 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
d170: 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
d180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
d190: 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
d1a0: 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
d1b0: 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69  qlitepager_commi
d1c0: 74 28 29 20 6f 72 20 73 71 6c 69 74 65 70 61 67  t() or sqlitepag
d1d0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
d1e0: 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
d1f0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72  t sqlitepager_wr
d200: 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ite(void *pData)
d210: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
d220: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
d230: 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
d240: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
d250: 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
d260: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
d270: 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
d280: 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
d290: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b  ager->errMask ){
d2a0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67   .    return pag
d2b0: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
d2c0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
d2d0: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
d2e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d2f0: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
d300: 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
d310: 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
d320: 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
d330: 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
d340: 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
d350: 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
d360: 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
d370: 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  way..  */.  pPg-
d380: 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66  >dirty = 1;.  if
d390: 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
d3a0: 20 26 26 20 28 70 50 67 2d 3e 69 6e 43 6b 70 74   && (pPg->inCkpt
d3b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74   || pPager->ckpt
d3c0: 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
d3d0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
d3e0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  le = 1;.    retu
d3f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d400: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  }..  /* If we ge
d410: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
d420: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
d430: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
d440: 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
d450: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
d460: 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
d470: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
d480: 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20  .  ** or both.. 
d490: 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20 63   **.  ** First c
d4a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
d4b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d4c0: 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
d4d0: 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74 65 20  and.  ** create 
d4e0: 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
d4f0: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
d500: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
d510: 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29  =SQLITE_UNLOCK )
d520: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70  ;.  rc = sqlitep
d530: 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61  ager_begin(pData
d540: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d550: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
d560: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
d570: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
d580: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49  tate==SQLITE_WRI
d590: 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  TELOCK );.  if( 
d5a0: 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
d5b0: 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
d5c0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
d5d0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
d5e0: 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
d5f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d600: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
d610: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
d620: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
d630: 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
d640: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
d650: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
d660: 79 46 69 6c 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a  yFile = 1;..  /*
d670: 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
d680: 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
d690: 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
d6a0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
d6b0: 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61  the.  ** main da
d6c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
d6d0: 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
d6e0: 70 61 67 65 20 74 6f 20 74 68 65 20 74 72 61 6e  page to the tran
d6f0: 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f  saction .  ** jo
d700: 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
d710: 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
d720: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
d730: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
d740: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
d750: 61 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  al ){.    if( (i
d760: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
d770: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
d780: 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ze ){.      int 
d790: 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20  szPg;.      u32 
d7a0: 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28  saved;.      if(
d7b0: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e   journal_format>
d7c0: 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
d7d0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  3 ){.        u32
d7e0: 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
d7f0: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67  ksum(pPager, pPg
d800: 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a  ->pgno, pData);.
d810: 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
d820: 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
d830: 45 58 54 52 41 28 70 50 67 29 3b 0a 20 20 20 20  EXTRA(pPg);.    
d840: 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
d850: 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53 51 4c 49  cksum, pPg, SQLI
d860: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
d870: 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 53 51         szPg = SQ
d880: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 38  LITE_PAGE_SIZE+8
d890: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d8a0: 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 53 51         szPg = SQ
d8b0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34  LITE_PAGE_SIZE+4
d8c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d8d0: 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
d8e0: 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
d8f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d900: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
d910: 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a  r->jfd, &((char*
d920: 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50  )pData)[-4], szP
d930: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 6f  g);.      if( jo
d940: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f  urnal_format>=JO
d950: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29  URNAL_FORMAT_3 )
d960: 7b 0a 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a  {.        *(u32*
d970: 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  )PGHDR_TO_EXTRA(
d980: 70 50 67 29 20 3d 20 73 61 76 65 64 3b 0a 20 20  pPg) = saved;.  
d990: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d9a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d9b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 70  .        sqlitep
d9c0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
d9d0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
d9e0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
d9f0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
da00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
da10: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
da20: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
da30: 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
da40: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
da50: 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
da60: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
da70: 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
da80: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
da90: 26 37 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  &7);.      pPg->
daa0: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
dab0: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
dac0: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
dad0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
dae0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
daf0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
db00: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67  ger->aInCkpt[pPg
db10: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
db20: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
db30: 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
db40: 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67  to_ckpt_list(pPg
db50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
db60: 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c   TRACE3("JOURNAL
db70: 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   %d %d\n", pPg->
db80: 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
db90: 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ync);.    }else{
dba0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
dbb0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
dbc0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
dbd0: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
dbe0: 63 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  c;.      TRACE3(
dbf0: 22 41 50 50 45 4e 44 20 25 64 20 25 64 5c 6e 22  "APPEND %d %d\n"
dc00: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
dc10: 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
dc20: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
dc30: 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
dc40: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
dc50: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nc = 1;.    }.  
dc60: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
dc70: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
dc80: 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
dc90: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
dca0: 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77   it,.  ** then w
dcb0: 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
dcc0: 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 68 65   page to the che
dcd0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  ckpoint journal.
dce0: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
dcf0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
dd00: 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79 73 20 75  journal always u
dd10: 73 65 73 20 74 68 65 20 73 69 6d 70 6c 69 65 72  ses the simplier
dd20: 20 66 6f 72 6d 61 74 20 32 20 74 68 61 74 20 6c   format 2 that l
dd30: 61 63 6b 73 0a 20 20 2a 2a 20 63 68 65 63 6b 73  acks.  ** checks
dd40: 75 6d 73 2e 20 20 54 68 65 20 68 65 61 64 65 72  ums.  The header
dd50: 20 69 73 20 61 6c 73 6f 20 6f 6d 69 74 74 65 64   is also omitted
dd60: 20 66 72 6f 6d 20 74 68 65 20 63 68 65 63 6b 70   from the checkp
dd70: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  oint journal..  
dd80: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
dd90: 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 21 70  >ckptInUse && !p
dda0: 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69  Pg->inCkpt && (i
ddb0: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
ddc0: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29  ager->ckptSize )
ddd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
dde0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
ddf0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
de00: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
de10: 65 20 29 3b 0a 20 20 20 20 73 74 6f 72 65 33 32  e );.    store32
de20: 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20  bits(pPg->pgno, 
de30: 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 72 63  pPg, -4);.    rc
de40: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
de50: 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
de60: 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b  &((char*)pData)[
de70: 2d 34 5d 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  -4], SQLITE_PAGE
de80: 5f 53 49 5a 45 2b 34 29 3b 0a 20 20 20 20 69 66  _SIZE+4);.    if
de90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dea0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70  ){.      sqlitep
deb0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
dec0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
ded0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
dee0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
def0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
df00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
df10: 72 2d 3e 63 6b 70 74 4e 52 65 63 2b 2b 3b 0a 20  r->ckptNRec++;. 
df20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
df30: 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b  r->aInCkpt!=0 );
df40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
df50: 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Ckpt[pPg->pgno/8
df60: 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
df70: 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
df80: 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74  add_to_ckpt_list
df90: 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
dfa0: 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
dfb0: 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
dfc0: 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
dfd0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
dfe0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
dff0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
e000: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
e010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
e020: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
e030: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
e040: 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
e050: 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
e060: 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
e070: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65  ** to sqlitepage
e080: 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
e090: 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
e0a0: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
e0b0: 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
e0c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
e0d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  the page..*/.int
e0e0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77   sqlitepager_isw
e0f0: 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70  riteable(void *p
e100: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
e110: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
e120: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
e130: 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
e140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
e150: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
e160: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77   a single page w
e170: 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ith the informat
e180: 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64  ion in the third
e190: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
e1a0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
e1b0: 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  _overwrite(Pager
e1c0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
e1d0: 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
e1e0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
e1f0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
e200: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
e210: 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  get(pPager, pgno
e220: 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
e230: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e240: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e250: 65 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  epager_write(pPa
e260: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
e270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e280: 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
e290: 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , pData, SQLITE_
e2a0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
e2b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65  }.    sqlitepage
e2c0: 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
e2d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
e2f0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
e300: 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
e310: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
e320: 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
e330: 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
e340: 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
e350: 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
e360: 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
e370: 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
e380: 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
e390: 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
e3a0: 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
e3b0: 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
e3c0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
e3d0: 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
e3e0: 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
e3f0: 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
e400: 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
e410: 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
e420: 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
e430: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
e440: 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
e450: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
e460: 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
e470: 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
e480: 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
e490: 2a 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f  * sqlitepager_do
e4a0: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65  nt_rollback() be
e4b0: 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
e4c0: 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
e4d0: 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
e4e0: 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
e4f0: 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
e500: 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
e510: 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
e520: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
e530: 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
e540: 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
e550: 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
e560: 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
e570: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 70 61 67  lls to sqlitepag
e580: 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
e590: 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
e5a0: 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
e5b0: 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
e5c0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
e5d0: 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
e5e0: 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
e5f0: 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
e600: 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
e610: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
e620: 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
e630: 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
e640: 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
e650: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
e660: 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
e670: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
e680: 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
e690: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
e6a0: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
e6b0: 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
e6c0: 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
e6d0: 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
e6e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e6f0: 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
e700: 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
e710: 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
e720: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
e730: 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
e740: 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
e750: 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
e760: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
e770: 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
e780: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
e790: 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
e7a0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
e7b0: 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
e7c0: 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  itepager_dont_wr
e7d0: 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
e7e0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
e7f0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
e800: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
e810: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
e820: 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
e830: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
e840: 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64  f( pPg && pPg->d
e850: 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20  irty ){.    if( 
e860: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
e870: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
e880: 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
e890: 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
e8a0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
e8b0: 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
e8c0: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
e8d0: 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
e8e0: 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
e8f0: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
e900: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
e910: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
e920: 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
e930: 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
e940: 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
e950: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
e960: 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
e970: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
e980: 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
e990: 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
e9a0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
e9b0: 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
e9c0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
e9d0: 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
e9e0: 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
e9f0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
ea00: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
ea10: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
ea20: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
ea30: 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
ea40: 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
ea50: 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
ea60: 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
ea70: 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
ea80: 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
ea90: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
eaa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
eab0: 20 20 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 57    TRACE2("DONT_W
eac0: 52 49 54 45 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  RITE %d\n", pgno
ead0: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
eae0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rty = 0;.    }. 
eaf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61   }.}../*.** A ca
eb00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
eb10: 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
eb20: 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c  er that if a rol
eb30: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a  lback occurs,.**
eb40: 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
eb50: 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20  sary to restore 
eb60: 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20  the data on the 
eb70: 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69  given page.  Thi
eb80: 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  s.** means that 
eb90: 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
eba0: 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72  ot have to recor
ebb0: 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  d the given page
ebc0: 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62   in the.** rollb
ebd0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
ebe0: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
ebf0: 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76  _dont_rollback(v
ec00: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
ec10: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
ec20: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
ec30: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
ec40: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
ec50: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
ec60: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52  state!=SQLITE_WR
ec70: 49 54 45 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  ITELOCK || pPage
ec80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
ec90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
eca0: 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
ecb0: 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  lback || pPager-
ecc0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
ecd0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
ece0: 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
ecf0: 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
ed00: 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
ed10: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
ed20: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
ed30: 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
ed40: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
ed50: 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
ed60: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
ed70: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
ed80: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
ed90: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
eda0: 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20  >ckptInUse ){.  
edb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43      pPager->aInC
edc0: 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  kpt[pPg->pgno/8]
edd0: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
ede0: 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65  o&7);.      page
edf0: 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73  _add_to_ckpt_lis
ee00: 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
ee10: 20 20 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 52    TRACE2("DONT_R
ee20: 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70  OLLBACK %d\n", p
ee30: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
ee40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
ee50: 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
ee60: 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70  inCkpt && (int)p
ee70: 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
ee80: 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20  ->ckptSize ){.  
ee90: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
eea0: 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
eeb0: 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
eec0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
eed0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
eee0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20  ger->aInCkpt!=0 
eef0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
ef00: 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f  InCkpt[pPg->pgno
ef10: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
ef20: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67  pgno&7);.    pag
ef30: 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69  e_add_to_ckpt_li
ef40: 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  st(pPg);.  }.}..
ef50: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
ef60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
ef70: 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
ef80: 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
ef90: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
efa0: 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
efb0: 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
efc0: 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
efd0: 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
efe0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
eff0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
f000: 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
f010: 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
f020: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
f030: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
f040: 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
f050: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
f060: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
f070: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
f080: 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52  rMask==PAGER_ERR
f090: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
f0a0: 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  = sqlitepager_ro
f0b0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
f0c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f0d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
f0e0: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
f0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f100: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
f110: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
f120: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
f130: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
f140: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
f150: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
f160: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
f170: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
f180: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
f190: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
f1a0: 20 54 52 41 43 45 31 28 22 43 4f 4d 4d 49 54 5c   TRACE1("COMMIT\
f1b0: 6e 22 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  n");.  if( pPage
f1c0: 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20  r->dirtyFile==0 
f1d0: 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
f1e0: 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
f1f0: 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
f200: 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 4f 73 53  suming sqliteOsS
f210: 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
f220: 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
f230: 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
f240: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
f250: 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
f260: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
f270: 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
f280: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
f290: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
f2a0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
f2b0: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
f2c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
f2d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f2e0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
f2f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
f300: 64 53 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f  dSync && sqliteO
f310: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a  sSync(&pPager->j
f320: 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  fd)!=SQLITE_OK )
f330: 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69  {.    goto commi
f340: 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 70  t_abort;.  }.  p
f350: 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
f360: 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
f370: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f380: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  g ){.    rc = pa
f390: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
f3a0: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
f3b0: 20 72 63 20 7c 7c 20 28 21 70 50 61 67 65 72 2d   rc || (!pPager-
f3c0: 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c 69 74  >noSync && sqlit
f3d0: 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  eOsSync(&pPager-
f3e0: 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  >fd)!=SQLITE_OK)
f3f0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63   ){.      goto c
f400: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20  ommit_abort;.   
f410: 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61   }.  }.  rc = pa
f420: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
f430: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
f440: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
f450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20    return rc;..  
f460: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
f470: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
f480: 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63  ong during the c
f490: 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20  ommit process.. 
f4a0: 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74   */.commit_abort
f4b0: 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70  :.  rc = sqlitep
f4c0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
f4d0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  ager);.  if( rc=
f4e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f4f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
f500: 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
f510: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
f520: 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
f530: 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
f540: 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
f550: 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a  read-only mode..
f560: 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
f570: 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
f580: 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
f590: 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
f5a0: 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
f5b0: 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
f5c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f5d0: 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
f5e0: 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
f5f0: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
f600: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
f610: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
f620: 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
f630: 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
f640: 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
f650: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
f660: 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
f670: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
f680: 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
f690: 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
f6a0: 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
f6b0: 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
f6c0: 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
f6d0: 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
f6e0: 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
f6f0: 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
f700: 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
f710: 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
f720: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
f730: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
f740: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
f750: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
f760: 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 31 28  nt rc;.  TRACE1(
f770: 22 52 4f 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20  "ROLLBACK\n");. 
f780: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
f790: 72 74 79 46 69 6c 65 20 7c 7c 20 21 70 50 61 67  rtyFile || !pPag
f7a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
f7b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
f7c0: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
f7d0: 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
f7e0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
f7f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f800: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
f810: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20  ->errMask!=0 && 
f820: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
f830: 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20  =PAGER_ERR_FULL 
f840: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
f850: 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45  r->state>=SQLITE
f860: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20  _WRITELOCK ){.  
f870: 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
f880: 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
f890: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
f8a0: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
f8b0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
f8c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
f8d0: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
f8e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f8f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f900: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
f910: 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
f920: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
f940: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
f950: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
f960: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
f970: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20  _CORRUPT;.  }.  
f980: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
f990: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
f9a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
f9b0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
f9c0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
f9d0: 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
f9e0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
f9f0: 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
fa00: 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
fa10: 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
fa20: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73  t sqlitepager_is
fa30: 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
fa40: 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
fa50: 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
fa60: 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ly;.}../*.** Thi
fa70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
fa80: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
fa90: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
faa0: 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 70  .*/.int *sqlitep
fab0: 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72  ager_stats(Pager
fac0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
fad0: 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20  tic int a[9];.  
fae0: 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
faf0: 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
fb00: 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
fb10: 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
fb20: 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
fb30: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
fb40: 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
fb50: 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
fb60: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b  pPager->errMask;
fb70: 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
fb80: 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
fb90: 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
fba0: 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d    a[8] = pPager-
fbb0: 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e  >nOvfl;.  return
fbc0: 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   a;.}../*.** Set
fbd0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2e   the checkpoint.
fbe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
fbf0: 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
fc00: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
fc10: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
fc20: 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
fc30: 6e 2e 20 20 41 20 6e 65 77 20 63 68 65 63 6b 70  n.  A new checkp
fc40: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  oint journal is 
fc50: 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e  created that can
fc60: 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c   be used to roll
fc70: 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20  back.** changes 
fc80: 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  of a single SQL 
fc90: 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61  command within a
fca0: 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74   larger transact
fcb0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
fcc0: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67  tepager_ckpt_beg
fcd0: 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
fce0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
fcf0: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
fd00: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
fd10: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
fd20: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
fd30: 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 41     pPager->ckptA
fd40: 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
fd50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fd60: 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
fd70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fd80: 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  Open );.  assert
fd90: 28 20 21 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  ( !pPager->ckptI
fda0: 6e 55 73 65 20 29 3b 0a 20 20 70 50 61 67 65 72  nUse );.  pPager
fdb0: 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73 71 6c 69  ->aInCkpt = sqli
fdc0: 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
fdd0: 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
fde0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
fdf0: 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a 20 20  aInCkpt==0 ){.  
fe00: 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f    sqliteOsReadLo
fe10: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
fe20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fe30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69  TE_NOMEM;.  }.#i
fe40: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72  fndef NDEBUG.  r
fe50: 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
fe60: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
fe70: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 70 74  d, &pPager->ckpt
fe80: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
fe90: 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67   ) goto ckpt_beg
fea0: 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
feb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
fec0: 74 4a 53 69 7a 65 20 3d 3d 20 0a 20 20 20 20 70  tJSize == .    p
fed0: 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52  Pager->nRec*JOUR
fee0: 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61  NAL_PG_SZ(journa
fef0: 6c 5f 66 6f 72 6d 61 74 29 2b 4a 4f 55 52 4e 41  l_format)+JOURNA
ff00: 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c  L_HDR_SZ(journal
ff10: 5f 66 6f 72 6d 61 74 29 20 29 3b 0a 23 65 6e 64  _format) );.#end
ff20: 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  if.  pPager->ckp
ff30: 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
ff40: 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47  >nRec*JOURNAL_PG
ff50: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
ff60: 61 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  at).            
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4a               + J
ff80: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f  OURNAL_HDR_SZ(jo
ff90: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20  urnal_format);. 
ffa0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
ffb0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
ffc0: 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ze;.  if( !pPage
ffd0: 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20  r->ckptOpen ){. 
ffe0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
fff0: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
10000 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66  mp, &pPager->cpf
10010 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
10020 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e   goto ckpt_begin
10030 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
10040 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20  ger->ckptOpen = 
10050 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  1;.    pPager->c
10060 6b 70 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  kptNRec = 0;.  }
10070 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  .  pPager->ckptI
10080 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
10090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
100a0 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  ckpt_begin_faile
100b0 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
100c0 3e 61 49 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20  >aInCkpt ){.    
100d0 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
100e0 72 2d 3e 61 49 6e 43 6b 70 74 29 3b 0a 20 20 20  r->aInCkpt);.   
100f0 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
10100 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10110 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10120 43 6f 6d 6d 69 74 20 61 20 63 68 65 63 6b 70 6f  Commit a checkpo
10130 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
10140 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d  tepager_ckpt_com
10150 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
10160 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
10170 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20  ->ckptInUse ){. 
10180 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
10190 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
101a0 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
101b0 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 20 20 2f  >cpfd, 0);.    /
101c0 2a 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  * sqliteOsTrunca
101d0 74 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64  te(&pPager->cpfd
101e0 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 70 50 61  , 0); */.    pPa
101f0 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20  ger->ckptNRec = 
10200 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  0;.    pPager->c
10210 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  kptInUse = 0;.  
10220 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
10230 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 3b  ager->aInCkpt );
10240 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
10250 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Ckpt = 0;.    fo
10260 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 43  r(pPg=pPager->pC
10270 6b 70 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  kpt; pPg; pPg=pN
10280 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
10290 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  t = pPg->pNextCk
102a0 70 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pt;.      assert
102b0 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 3b  ( pPg->inCkpt );
102c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b  .      pPg->inCk
102d0 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  pt = 0;.      pP
102e0 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70  g->pPrevCkpt = p
102f0 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20  Pg->pNextCkpt = 
10300 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  0;.    }.    pPa
10310 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 30 3b 0a  ger->pCkpt = 0;.
10320 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b    }.  pPager->ck
10330 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  ptAutoopen = 0;.
10340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10350 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
10360 6c 62 61 63 6b 20 61 20 63 68 65 63 6b 70 6f 69  lback a checkpoi
10370 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
10380 65 70 61 67 65 72 5f 63 6b 70 74 5f 72 6f 6c 6c  epager_ckpt_roll
10390 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
103a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
103b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
103c0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 72 63  tInUse ){.    rc
103d0 20 3d 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c   = pager_ckpt_pl
103e0 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
103f0 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
10400 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  ckpt_commit(pPag
10410 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
10420 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
10430 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10440 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  ckptAutoopen = 0
10450 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10460 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10470 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
10480 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10490 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
104a0 63 68 61 72 20 2a 73 71 6c 69 74 65 70 61 67 65  char *sqlitepage
104b0 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  r_filename(Pager
104c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
104d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
104e0 65 6e 61 6d 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  ename;.}..#ifdef
104f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
10500 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
10510 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
10520 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
10530 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
10540 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
10550 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
10560 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
10570 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
10580 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
10590 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
105a0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
105b0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
105c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
105d0 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  printf("PAGE %3d
105e0 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
105f0 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
10600 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74   pPg->pgno, (int
10610 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
10620 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
10630 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.