/ Hex Artifact Content
Login

Artifact 4adf3cc6d031504e2941791f5838138d4fad2803:


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 37 33  : pager.c,v 1.73
0350: 20 32 30 30 33 2f 30 32 2f 31 31 20 31 34 3a 35   2003/02/11 14:5
0360: 35 3a 34 31 20 64 72 68 20 45 78 70 20 24 0a 2a  5:41 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 61 6e  the page data an
1170: 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 7d 3b  d checksum */.};
1180: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1190: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
11a0: 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e  gHdr into a poin
11b0: 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a  ter to its data.
11c0: 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69  ** and back agai
11d0: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47  n..*/.#define PG
11e0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20  HDR_TO_DATA(P)  
11f0: 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d  ((void*)(&(P)[1]
1200: 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f  )).#define DATA_
1210: 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28  TO_PGHDR(D)  (&(
1220: 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d  (PgHdr*)(D))[-1]
1230: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
1240: 54 4f 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f  TO_EXTRA(P) ((vo
1250: 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  id*)&((char*)(&(
1260: 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50  P)[1]))[SQLITE_P
1270: 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a  AGE_SIZE])../*.*
1280: 2a 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b  * How big to mak
1290: 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
12a0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69   used for locati
12b0: 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ng in-memory pag
12c0: 65 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75  es.** by page nu
12d0: 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mber..*/.#define
12e0: 20 4e 5f 50 47 5f 48 41 53 48 20 32 30 34 38 0a   N_PG_HASH 2048.
12f0: 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70 61  ./*.** Hash a pa
1300: 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65  ge number.*/.#de
1310: 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73 68 28  fine pager_hash(
1320: 50 4e 29 20 20 28 28 50 4e 29 26 28 4e 5f 50 47  PN)  ((PN)&(N_PG
1330: 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a  _HASH-1))../*.**
1340: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
1350: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
1360: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1370: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
1380: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
1390: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
13a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
13b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
13c0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
13d0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13f0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
1400: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46  al file */.  OsF
1410: 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20  ile fd, jfd;    
1420: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1430: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
1440: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
1450: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
1460: 65 20 63 70 66 64 3b 20 20 20 20 20 20 20 20 20  e cpfd;         
1470: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1480: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
1490: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
14a0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rnal */.  int db
14b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
14c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14d0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
14e0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
14f0: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
1500: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
1510: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
1520: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
1530: 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20 20 20 20  nt ckptSize;    
1540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1550: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
1560: 69 6e 20 70 61 67 65 73 29 20 61 74 20 63 6b 70  in pages) at ckp
1570: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 6f  t_begin() */.  o
1580: 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a 65 3b 20  ff_t ckptJSize; 
1590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
15a0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
15b0: 20 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f   ckpt_begin() */
15c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
15d0: 20 20 6f 66 66 5f 74 20 73 79 6e 63 4a 53 69 7a    off_t syncJSiz
15e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
15f0: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
1600: 20 61 74 20 6c 61 73 74 20 66 73 79 6e 63 28 29   at last fsync()
1610: 20 63 61 6c 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   call */.#endif.
1620: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1640: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1650: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1660: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1670: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
1680: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
1690: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
16a0: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
16b0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
16c0: 63 6b 70 74 4e 52 65 63 3b 20 20 20 20 20 20 20  ckptNRec;       
16d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16e0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
16f0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
1700: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
1710: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
1720: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1730: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
1740: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
1750: 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20   page */.  void 
1760: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
1770: 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  oid*); /* Call t
1780: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
1790: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
17a0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
17d0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
17e0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
17f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1800: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1810: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1820: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
1830: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
1840: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1850: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
1860: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1870: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
1880: 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  */.  int nHit, n
1890: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
18a0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
18b0: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
18c0: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
18d0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18f0: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
1900: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1910: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
1920: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
1930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1940: 65 20 69 66 20 69 6e 69 74 69 61 6c 20 6d 61 67  e if initial mag
1950: 69 63 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  ic of journal is
1960: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
1970: 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  useJournal;     
1980: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
1990: 6f 74 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63  ot use a rollbac
19a0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
19b0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  s file */.  u8 c
19c0: 6b 70 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  kptOpen;        
19d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19e0: 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  if the checkpoin
19f0: 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1a00: 6e 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 49 6e  n */.  u8 ckptIn
1a10: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
1a20: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
1a30: 65 20 69 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  e in a checkpoin
1a40: 74 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 41 75  t */.  u8 ckptAu
1a50: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
1a60: 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6b 70 74 20     /* Open ckpt 
1a70: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
1a80: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
1a90: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
1aa0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ab0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
1ac0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
1ad0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
1ae0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
1b00: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
1b10: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
1b20: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
1b30: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
1b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1b50: 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44  TE_UNLOCK, _READ
1b60: 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54 45 4c 4f  LOCK or _WRITELO
1b70: 43 4b 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61  CK */.  u8 errMa
1b80: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1b90: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
1ba0: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
1bb0: 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65  rrors */.  u8 te
1bc0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
1bd0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
1be0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
1bf0: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
1c00: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c20: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
1c30: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
1c40: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c60: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
1c70: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
1c80: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1c90: 38 20 64 69 72 74 79 46 69 6c 65 3b 20 20 20 20  8 dirtyFile;    
1ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1cb0: 75 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  ue if database f
1cc0: 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
1cd0: 69 6e 20 61 6e 79 20 77 61 79 20 2a 2f 0a 20 20  in any way */.  
1ce0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
1cf0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
1d00: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
1d10: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
1d20: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 2a 61 49  ages */.  u8 *aI
1d30: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
1d40: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
1d50: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
1d60: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d70: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
1d80: 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  Ckpt;           
1d90: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
1da0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
1db0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1dc0: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
1dd0: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
1de0: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
1df0: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
1e00: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
1e10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
1e20: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
1e30: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
1e40: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
1e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e60: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
1e70: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
1e80: 20 2a 70 43 6b 70 74 3b 20 20 20 20 20 20 20 20   *pCkpt;        
1e90: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1ea0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
1eb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
1ec0: 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48  l */.  PgHdr *aH
1ed0: 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20  ash[N_PG_HASH]; 
1ee0: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
1ef0: 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d   to map page num
1f00: 62 65 72 20 6f 66 20 50 67 48 64 72 20 2a 2f 0a  ber of PgHdr */.
1f10: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  };../*.** These 
1f20: 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61  are bits that ca
1f30: 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65  n be set in Page
1f40: 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64  r.errMask..*/.#d
1f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
1f60: 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f  FULL     0x01  /
1f70: 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c  * a write() fail
1f80: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
1f90: 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20  GER_ERR_MEM     
1fa0: 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63   0x02  /* malloc
1fb0: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65  () failed */.#de
1fc0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c  fine PAGER_ERR_L
1fd0: 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a  OCK     0x04  /*
1fe0: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f   error in the lo
1ff0: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a  cking protocol *
2000: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
2010: 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30  ERR_CORRUPT  0x0
2020: 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f  8  /* database o
2030: 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  r journal corrup
2040: 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tion */.#define 
2050: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20  PAGER_ERR_DISK  
2060: 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65     0x10  /* gene
2070: 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  ral disk I/O err
2080: 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72  or - bad hard dr
2090: 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ive? */../*.** T
20a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20b0: 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 20 72 65  contains page re
20c0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 66 6f 6c  cords in the fol
20d0: 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74  lowing.** format
20e0: 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
20f0: 2c 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  , this structure
2100: 20 69 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   is the complete
2110: 20 70 61 67 65 20 72 65 63 6f 72 64 20 66 6f 72   page record for
2120: 20 70 61 67 65 72 0a 2a 2a 20 66 6f 72 6d 61 74   pager.** format
2130: 73 20 6c 65 73 73 20 74 68 61 6e 20 33 2e 20 20  s less than 3.  
2140: 42 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 66  Beginning with f
2150: 6f 72 6d 61 74 20 33 2c 20 74 68 69 73 20 72 65  ormat 3, this re
2160: 63 6f 72 64 20 69 73 20 73 75 72 72 6f 75 6e 64  cord is surround
2170: 65 64 0a 2a 2a 20 62 79 20 74 77 6f 20 63 68 65  ed.** by two che
2180: 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74 79 70 65 64  cksums..*/.typed
2190: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 52 65  ef struct PageRe
21a0: 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72 64 3b  cord PageRecord;
21b0: 0a 73 74 72 75 63 74 20 50 61 67 65 52 65 63 6f  .struct PageReco
21c0: 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  rd {.  Pgno pgno
21d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
21f0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
2200: 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f  ar aData[SQLITE_
2210: 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20  PAGE_SIZE];  /* 
2220: 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66 6f  Original data fo
2230: 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f 0a 7d  r page pgno */.}
2240: 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  ;../*.** Journal
2250: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
2260: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
2270: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
2280: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
2290: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
22a0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
22b0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
22c0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
22d0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68  .** There are th
22e0: 72 65 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ree journal form
22f0: 61 74 73 20 28 73 6f 20 66 61 72 29 2e 20 54 68  ats (so far). Th
2300: 65 20 31 73 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  e 1st journal fo
2310: 72 6d 61 74 20 77 72 69 74 65 73 0a 2a 2a 20 33  rmat writes.** 3
2320: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20 69  2-bit integers i
2330: 6e 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72  n the byte-order
2340: 20 6f 66 20 74 68 65 20 68 6f 73 74 20 6d 61 63   of the host mac
2350: 68 69 6e 65 2e 20 20 4e 65 77 0a 2a 2a 20 66 6f  hine.  New.** fo
2360: 72 6d 61 74 73 20 77 72 69 74 65 73 20 69 6e 74  rmats writes int
2370: 65 67 65 72 73 20 61 73 20 62 69 67 2d 65 6e 64  egers as big-end
2380: 69 61 6e 2e 20 20 41 6c 6c 20 6e 65 77 20 6a 6f  ian.  All new jo
2390: 75 72 6e 61 6c 73 20 75 73 65 20 74 68 65 0a 2a  urnals use the.*
23a0: 2a 20 6e 65 77 20 66 6f 72 6d 61 74 2c 20 62 75  * new format, bu
23b0: 74 20 77 65 20 68 61 76 65 20 74 6f 20 62 65 20  t we have to be 
23c0: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 61 6e 20  able to read an 
23d0: 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c 20 69 6e  older journal in
23e0: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 72 6f 6c   order.** to rol
23f0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 73 20 63  lback journals c
2400: 72 65 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20  reated by older 
2410: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
2420: 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  library..**.** T
2430: 68 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66  he 3rd journal f
2440: 6f 72 6d 61 74 20 28 61 64 64 65 64 20 66 6f 72  ormat (added for
2450: 20 32 2e 38 2e 30 29 20 61 64 64 73 20 61 64 64   2.8.0) adds add
2460: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
2470: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
2480: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 6a 6f  mation to the jo
2490: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 70  urnal.  If the p
24a0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
24b0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
24c0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
24d0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
24e0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
24f0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
2500: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2510: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
2520: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
2530: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
2540: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
2550: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
2560: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
2570: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
2580: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
2590: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
25a0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
25b0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
25c0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
25d0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
25e0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
25f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
2600: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
2610: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 33  mation for the 3
2620: 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
2630: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
2640: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
2650: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
2660: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
2670: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
2680: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
2690: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 53 51  umber and the SQ
26a0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62  LITE_PAGE_SIZE b
26b0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
26c0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
26d0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
26e0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
26f0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
2700: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
2710: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2720: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
2730: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
2740: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
2750: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
2760: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
2770: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
2780: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
2790: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
27a0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
27b0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
27c0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
27d0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
27e0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
27f0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
2800: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
2810: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
2820: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
2830: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
2840: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
2850: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
2860: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
2870: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
2880: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
2890: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
28a0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
28b0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
28c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
28d0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
28e0: 61 6c 4d 61 67 69 63 31 5b 5d 20 3d 20 7b 0a 20  alMagic1[] = {. 
28f0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
2900: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
2910: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 34 2c  xa1, 0x63, 0xd4,
2920: 0a 7d 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .};.static const
2930: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
2940: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32 5b 5d 20  JournalMagic2[] 
2950: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
2960: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
2970: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
2980: 30 78 64 35 2c 0a 7d 3b 0a 73 74 61 74 69 63 20  0xd5,.};.static 
2990: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
29a0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
29b0: 63 33 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  c3[] = {.  0xd9,
29c0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
29d0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
29e0: 78 36 33 2c 20 30 78 64 36 2c 0a 7d 3b 0a 23 64  x63, 0xd6,.};.#d
29f0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f  efine JOURNAL_FO
2a00: 52 4d 41 54 5f 31 20 31 0a 23 64 65 66 69 6e 65  RMAT_1 1.#define
2a10: 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f   JOURNAL_FORMAT_
2a20: 32 20 32 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  2 2.#define JOUR
2a30: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 33 0a 0a  NAL_FORMAT_3 3..
2a40: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2a50: 69 6e 67 20 69 6e 74 65 67 65 72 20 64 65 74 65  ing integer dete
2a60: 72 6d 69 6e 65 73 20 77 68 61 74 20 66 6f 72 6d  rmines what form
2a70: 61 74 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63  at to use when c
2a80: 72 65 61 74 69 6e 67 0a 2a 2a 20 6e 65 77 20 70  reating.** new p
2a90: 72 69 6d 61 72 79 20 6a 6f 75 72 6e 61 6c 20 66  rimary journal f
2aa0: 69 6c 65 73 2e 20 20 42 79 20 64 65 66 61 75 6c  iles.  By defaul
2ab0: 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
2ac0: 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a 20 57 68 65  format 3..** Whe
2ad0: 6e 20 74 65 73 74 69 6e 67 2c 20 77 65 20 63 61  n testing, we ca
2ae0: 6e 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65  n set this value
2af0: 20 74 6f 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61   to older journa
2b00: 6c 20 66 6f 72 6d 61 74 73 20 69 6e 20 6f 72 64  l formats in ord
2b10: 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  er to.** make su
2b20: 72 65 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  re that newer ve
2b30: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 69  rsions of the li
2b40: 62 72 61 72 79 20 61 72 65 20 61 62 6c 65 20 74  brary are able t
2b50: 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 6c 64 65 72  o rollback older
2b60: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2b70: 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  s..**.** Note th
2b80: 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  at checkpoint jo
2b90: 75 72 6e 61 6c 73 20 61 6c 77 61 79 73 20 75 73  urnals always us
2ba0: 65 20 66 6f 72 6d 61 74 20 32 20 61 6e 64 20 6f  e format 2 and o
2bb0: 6d 69 74 20 74 68 65 20 68 65 61 64 65 72 2e 0a  mit the header..
2bc0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2bd0: 5f 54 45 53 54 0a 69 6e 74 20 6a 6f 75 72 6e 61  _TEST.int journa
2be0: 6c 5f 66 6f 72 6d 61 74 20 3d 20 33 3b 0a 23 65  l_format = 3;.#e
2bf0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a 6f 75  lse.# define jou
2c00: 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 33 0a 23 65  rnal_format 3.#e
2c10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2c20: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
2c30: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
2c40: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
2c50: 61 6c 20 76 61 72 69 65 73 20 61 63 63 6f 72 64  al varies accord
2c60: 69 6e 67 0a 2a 2a 20 74 6f 20 77 68 69 63 68 20  ing.** to which 
2c70: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69  journal format i
2c80: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 54  s being used.  T
2c90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
2ca0: 72 6f 73 20 66 69 67 75 72 65 20 6f 75 74 0a 2a  ros figure out.*
2cb0: 2a 20 74 68 65 20 73 69 7a 65 73 20 62 61 73 65  * the sizes base
2cc0: 64 20 6f 6e 20 66 6f 72 6d 61 74 20 6e 75 6d 62  d on format numb
2cd0: 65 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ers..*/.#define 
2ce0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 58  JOURNAL_HDR_SZ(X
2cf0: 29 20 5c 0a 20 20 20 28 73 69 7a 65 6f 66 28 61  ) \.   (sizeof(a
2d00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29 20 2b  JournalMagic1) +
2d10: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20   sizeof(Pgno) + 
2d20: 28 28 58 29 3e 3d 33 29 2a 32 2a 73 69 7a 65 6f  ((X)>=3)*2*sizeo
2d30: 66 28 75 33 32 29 29 0a 23 64 65 66 69 6e 65 20  f(u32)).#define 
2d40: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 58 29  JOURNAL_PG_SZ(X)
2d50: 20 5c 0a 20 20 20 28 53 51 4c 49 54 45 5f 50 41   \.   (SQLITE_PA
2d60: 47 45 5f 53 49 5a 45 20 2b 20 73 69 7a 65 6f 66  GE_SIZE + sizeof
2d70: 28 50 67 6e 6f 29 20 2b 20 28 28 58 29 3e 3d 33  (Pgno) + ((X)>=3
2d80: 29 2a 73 69 7a 65 6f 66 28 75 33 32 29 29 0a 0a  )*sizeof(u32))..
2d90: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
2da0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
2db0: 63 6b 69 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23  cking here:.*/.#
2dc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2dd0: 54 0a 20 20 69 6e 74 20 70 61 67 65 72 5f 72 65  T.  int pager_re
2de0: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
2df0: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
2e00: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
2e10: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
2e20: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
2e30: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 5f  .    if( !pager_
2e40: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29  refinfo_enable )
2e50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69   return;.    pri
2e60: 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46  ntf(.       "REF
2e70: 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78  CNT: %4d addr=0x
2e80: 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  %08x nRef=%d\n",
2e90: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
2ea0: 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44   (int)PGHDR_TO_D
2eb0: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a  ATA(p), p->nRef.
2ec0: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
2ed0: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
2ee0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
2ef0: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
2f00: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
2f10: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
2f20: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
2f30: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
2f40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
2f50: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
2f60: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
2f70: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2f80: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
2f90: 72 65 61 64 33 32 62 69 74 73 28 69 6e 74 20 66  read32bits(int f
2fa0: 6f 72 6d 61 74 2c 20 4f 73 46 69 6c 65 20 2a 66  ormat, OsFile *f
2fb0: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
2fc0: 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20   u32 res;.  int 
2fd0: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
2fe0: 65 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  eOsRead(fd, &res
2ff0: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
3000: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3010: 5f 4f 4b 20 26 26 20 66 6f 72 6d 61 74 3e 4a 4f  _OK && format>JO
3020: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29  URNAL_FORMAT_1 )
3030: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
3040: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d  har ac[4];.    m
3050: 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20  emcpy(ac, &res, 
3060: 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61  4);.    res = (a
3070: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
3080: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
3090: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20  <<8) | ac[3];.  
30a0: 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b  }.  *pRes = res;
30b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
30d0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
30e0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
30f0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 57  e descriptor.  W
3100: 72 69 74 69 6e 67 0a 2a 2a 20 69 73 20 61 6c 77  riting.** is alw
3110: 61 79 73 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ays done using t
3120: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3130: 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormat..*/.static
3140: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
3150: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
3160: 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65   val){.  unsigne
3170: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
3180: 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  if( journal_form
3190: 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  at<=1 ){.    ret
31a0: 75 72 6e 20 73 71 6c 69 74 65 4f 73 57 72 69 74  urn sqliteOsWrit
31b0: 65 28 66 64 2c 20 26 76 61 6c 2c 20 34 29 3b 0a  e(fd, &val, 4);.
31c0: 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76    }.  ac[0] = (v
31d0: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
31e0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
31f0: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
3200: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
3210: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
3220: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
3230: 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73 57 72  eturn sqliteOsWr
3240: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a  ite(fd, ac, 4);.
3250: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
3260: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
3270: 69 6e 74 6f 20 61 20 70 61 67 65 20 68 65 61 64  into a page head
3280: 65 72 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  er right before 
3290: 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
32a0: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6f 76 65  .  This will ove
32b0: 72 77 72 69 74 65 20 74 68 65 20 50 67 48 64 72  rwrite the PgHdr
32c0: 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
32d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32e0: 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20  store32bits(u32 
32f0: 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69  val, PgHdr *p, i
3300: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
3310: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
3320: 0a 20 20 61 63 20 3d 20 26 28 28 63 68 61 72 2a  .  ac = &((char*
3330: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
3340: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ))[offset];.  if
3350: 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  ( journal_format
3360: 3c 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  <=1 ){.    memcp
3370: 79 28 61 63 2c 20 26 76 61 6c 2c 20 34 29 3b 0a  y(ac, &val, 4);.
3380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 63 5b    }else{.    ac[
3390: 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26  0] = (val>>24) &
33a0: 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 31 5d   0xff;.    ac[1]
33b0: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
33c0: 78 66 66 3b 0a 20 20 20 20 61 63 5b 32 5d 20 3d  xff;.    ac[2] =
33d0: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
33e0: 3b 0a 20 20 20 20 61 63 5b 33 5d 20 3d 20 76 61  ;.    ac[3] = va
33f0: 6c 20 26 20 30 78 66 66 3b 0a 20 20 7d 0a 7d 0a  l & 0xff;.  }.}.
3400: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
3410: 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
3420: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3430: 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61  into an appropra
3440: 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64  te.** return cod
3450: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3460: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50   pager_errcode(P
3470: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
3480: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3490: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
34a0: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
34b0: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20  ER_ERR_LOCK )   
34c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f   rc = SQLITE_PRO
34d0: 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61  TOCOL;.  if( pPa
34e0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
34f0: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20  AGER_ERR_DISK ) 
3500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
3510: 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67  OERR;.  if( pPag
3520: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
3530: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20  GER_ERR_FULL )  
3540: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
3550: 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  LL;.  if( pPager
3560: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
3570: 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20  R_ERR_MEM )     
3580: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
3590: 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  M;.  if( pPager-
35a0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
35b0: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72  _ERR_CORRUPT ) r
35c0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
35d0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  PT;.  return rc;
35e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
35f0: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
3600: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
3610: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
3620: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 63 68 65  re in the.** che
3630: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  ckpoint journal.
3640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
3650: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
3660: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
3670: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
3680: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 63 68 65  ly in.** the che
3690: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  ckpoint journal.
36a0: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
36b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
36c0: 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  t_commit().** ro
36d0: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
36e0: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
36f0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
3700: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
3710: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
3720: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
3730: 20 61 72 65 20 69 6e 20 74 68 65 20 63 68 65 63   are in the chec
3740: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
3750: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
3760: 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f  age_add_to_ckpt_
3770: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
3780: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
3790: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37a0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 43 6b  .  if( pPg->inCk
37b0: 70 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  pt ) return;.  a
37c0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
37d0: 76 43 6b 70 74 3d 3d 30 20 26 26 20 70 50 67 2d  vCkpt==0 && pPg-
37e0: 3e 70 4e 65 78 74 43 6b 70 74 3d 3d 30 20 29 3b  >pNextCkpt==0 );
37f0: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70  .  pPg->pPrevCkp
3800: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  t = 0;.  if( pPa
3810: 67 65 72 2d 3e 70 43 6b 70 74 20 29 7b 0a 20 20  ger->pCkpt ){.  
3820: 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 2d    pPager->pCkpt-
3830: 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70 50 67  >pPrevCkpt = pPg
3840: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
3850: 78 74 43 6b 70 74 20 3d 20 70 50 61 67 65 72 2d  xtCkpt = pPager-
3860: 3e 70 43 6b 70 74 3b 0a 20 20 70 50 61 67 65 72  >pCkpt;.  pPager
3870: 2d 3e 70 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20  ->pCkpt = pPg;. 
3880: 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 31   pPg->inCkpt = 1
3890: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
38a0: 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
38b0: 5f 63 6b 70 74 5f 6c 69 73 74 28 50 67 48 64 72  _ckpt_list(PgHdr
38c0: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70   *pPg){.  if( !p
38d0: 50 67 2d 3e 69 6e 43 6b 70 74 20 29 20 72 65 74  Pg->inCkpt ) ret
38e0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
38f0: 70 50 72 65 76 43 6b 70 74 20 29 7b 0a 20 20 20  pPrevCkpt ){.   
3900: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
3910: 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78 74 43 6b  revCkpt->pNextCk
3920: 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  pt==pPg );.    p
3930: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70  Pg->pPrevCkpt->p
3940: 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 67 2d 3e  NextCkpt = pPg->
3950: 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 7d 65 6c  pNextCkpt;.  }el
3960: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
3970: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 43 6b  pPg->pPager->pCk
3980: 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  pt==pPg );.    p
3990: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 43 6b 70  Pg->pPager->pCkp
39a0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  t = pPg->pNextCk
39b0: 70 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  pt;.  }.  if( pP
39c0: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 29 7b 0a  g->pNextCkpt ){.
39d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
39e0: 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70 50 72 65  >pNextCkpt->pPre
39f0: 76 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20  vCkpt==pPg );.  
3a00: 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74    pPg->pNextCkpt
3a10: 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70 50  ->pPrevCkpt = pP
3a20: 67 2d 3e 70 50 72 65 76 43 6b 70 74 3b 0a 20 20  g->pPrevCkpt;.  
3a30: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  }.  pPg->pNextCk
3a40: 70 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  pt = 0;.  pPg->p
3a50: 50 72 65 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20  PrevCkpt = 0;.  
3a60: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b  pPg->inCkpt = 0;
3a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
3a80: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
3a90: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
3aa0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
3ab0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
3ac0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
3ad0: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
3ae0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
3af0: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
3b00: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
3b10: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
3b20: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67   PgHdr *p = pPag
3b30: 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f  er->aHash[pager_
3b40: 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77  hash(pgno)];.  w
3b50: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
3b60: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
3b70: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
3b80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
3ba0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  k the database a
3bb0: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d  nd clear the in-
3bc0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
3bd0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
3be0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
3bf0: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
3c00: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
3c10: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
3c20: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
3c30: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
3c40: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
3c50: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
3c60: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
3c70: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
3c80: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
3c90: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
3ca0: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
3cb0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
3cc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
3cd0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
3ce0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67  pNext;.  for(pPg
3cf0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
3d00: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
3d10: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
3d20: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
3d30: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
3d40: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46    }.  pPager->pF
3d50: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
3d60: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
3d70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
3d80: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
3d90: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
3da0: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
3db0: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
3dc0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
3dd0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
3de0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
3df0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49  ger->state>=SQLI
3e00: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
3e10: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
3e20: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
3e30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
3e40: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
3e50: 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  fd);.  pPager->s
3e60: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e  tate = SQLITE_UN
3e70: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
3e80: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
3e90: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
3ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
3eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
3ec0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
3ed0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
3ee0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
3ef0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
3f00: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
3f10: 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f  nd.** a write lo
3f20: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
3f30: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
3f40: 65 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 64  e releases the d
3f50: 61 74 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65  atabase.** write
3f60: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
3f70: 65 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  es a read lock i
3f80: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
3f90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
3fa0: 2a 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  * is deleted and
3fb0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
3fc0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77  ic int pager_unw
3fd0: 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a  ritelock(Pager *
3fe0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
3ff0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
4000: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
4010: 74 61 74 65 3c 53 51 4c 49 54 45 5f 57 52 49 54  tate<SQLITE_WRIT
4020: 45 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 20 53  ELOCK ) return S
4030: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
4040: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d  tepager_ckpt_com
4050: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
4060: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f  f( pPager->ckptO
4070: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
4080: 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  eOsClose(&pPager
4090: 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 70 50 61  ->cpfd);.    pPa
40a0: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20  ger->ckptOpen = 
40b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
40c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
40d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73   ){.    sqliteOs
40e0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
40f0: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
4100: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
4110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 44 65  ;.    sqliteOsDe
4120: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
4130: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
4140: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
4150: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
4160: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
4170: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
4180: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
4190: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
41a0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
41b0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
41c0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
41d0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
41e0: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
41f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
4200: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4210: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
4220: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4230: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
4240: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
4250: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
4260: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66  Pager->fd);.  if
4270: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4280: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
4290: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45  tate = SQLITE_RE
42a0: 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ADLOCK;.  }else{
42b0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e  .    /* This can
42c0: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
42d0: 61 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 61  a process does a
42e0: 20 42 45 47 49 4e 2c 20 74 68 65 6e 20 66 6f 72   BEGIN, then for
42f0: 6b 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ks and the.    *
4300: 2a 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20  * child process 
4310: 64 6f 65 73 20 74 68 65 20 43 4f 4d 4d 49 54 2e  does the COMMIT.
4320: 20 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65    Because of the
4330: 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 75 6e   semantics of un
4340: 69 78 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6c  ix.    ** file l
4350: 6f 63 6b 69 6e 67 2c 20 74 68 65 20 75 6e 6c 6f  ocking, the unlo
4360: 63 6b 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 20 20  ck will fail..  
4370: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
4380: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
4390: 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65  UNLOCK;.  }.  re
43a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
43b0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
43c0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
43d0: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
43e0: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
43f0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
4400: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
4410: 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20  gno pgno, const 
4420: 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20  char *aData){.  
4430: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
4440: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 2b 20  er->cksumInit + 
4450: 70 67 6e 6f 3b 0a 20 20 2f 2a 20 63 6f 6e 73 74  pgno;.  /* const
4460: 20 75 38 20 2a 61 20 3d 20 28 63 6f 6e 73 74 20   u8 *a = (const 
4470: 75 38 2a 29 61 44 61 74 61 3b 0a 20 20 69 6e 74  u8*)aData;.  int
4480: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4490: 3c 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  <SQLITE_PAGE_SIZ
44a0: 45 3b 20 69 2b 2b 29 7b 20 63 6b 73 75 6d 20 2b  E; i++){ cksum +
44b0: 3d 20 61 5b 69 5d 3b 20 7d 20 2a 2f 0a 20 20 2f  = a[i]; } */.  /
44c0: 2a 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  * fprintf(stderr
44d0: 2c 22 43 4b 53 55 4d 20 66 6f 72 20 25 70 28 25  ,"CKSUM for %p(%
44e0: 30 38 78 29 20 70 61 67 65 20 25 64 3a 20 25 30  08x) page %d: %0
44f0: 38 78 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  8x\n", pPager, p
4500: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
4510: 2c 20 70 67 6e 6f 2c 20 63 6b 73 75 6d 29 3b 20  , pgno, cksum); 
4520: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75  */.  return cksu
4530: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
4540: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
4550: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
4560: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
4570: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
4580: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
4590: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
45a0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
45b0: 74 68 72 65 65 20 64 69 66 66 65 72 65 6e 74 20  three different 
45c0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 2e  journal formats.
45d0: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 70 61 72    The format par
45e0: 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
45f0: 73 0a 2a 2a 20 77 68 69 63 68 20 66 6f 72 6d 61  s.** which forma
4600: 74 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  t is used by the
4610: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 69 73   journal that is
4620: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2f   played back..*/
4630: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
4640: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
4650: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
4660: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
4670: 69 6e 74 20 66 6f 72 6d 61 74 29 7b 0a 20 20 69  int format){.  i
4680: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
4690: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
46a0: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
46b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
46c0: 68 65 20 2a 2f 0a 20 20 50 61 67 65 52 65 63 6f  he */.  PageReco
46d0: 72 64 20 70 67 52 65 63 3b 0a 20 20 75 33 32 20  rd pgRec;.  u32 
46e0: 63 6b 73 75 6d 3b 0a 0a 20 20 72 63 20 3d 20 72  cksum;..  rc = r
46f0: 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74  ead32bits(format
4700: 2c 20 6a 66 64 2c 20 26 70 67 52 65 63 2e 70 67  , jfd, &pgRec.pg
4710: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
4720: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4730: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
4740: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
4750: 61 64 28 6a 66 64 2c 20 26 70 67 52 65 63 2e 61  ad(jfd, &pgRec.a
4760: 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 70 67 52  Data, sizeof(pgR
4770: 65 63 2e 61 44 61 74 61 29 29 3b 0a 20 20 69 66  ec.aData));.  if
4780: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4790: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
47a0: 44 4f 4e 45 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  DONE;..  /* Sani
47b0: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
47c0: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
47d0: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
47e0: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
47f0: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
4800: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
4810: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
4820: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
4830: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
4840: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
4850: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
4860: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
4870: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
4880: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
4890: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
48a0: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
48b0: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
48c0: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
48d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 52  ..  */.  if( pgR
48e0: 65 63 2e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  ec.pgno==0 ){.  
48f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4900: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
4910: 70 67 52 65 63 2e 70 67 6e 6f 3e 70 50 61 67 65  pgRec.pgno>pPage
4920: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
4930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4940: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f 72  K;.  }.  if( for
4950: 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52  mat>=JOURNAL_FOR
4960: 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20  MAT_3 ){.    rc 
4970: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
4980: 6d 61 74 2c 20 6a 66 64 2c 20 26 63 6b 73 75 6d  mat, jfd, &cksum
4990: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
49a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
49b0: 4e 45 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  NE;.    if( page
49c0: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
49d0: 70 67 52 65 63 2e 70 67 6e 6f 2c 20 70 67 52 65  pgRec.pgno, pgRe
49e0: 63 2e 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  c.aData)!=cksum 
49f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4a00: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
4a10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 6c 61   }.  }..  /* Pla
4a20: 79 62 61 63 6b 20 74 68 65 20 70 61 67 65 2e 20  yback the page. 
4a30: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
4a40: 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20 74 68  emory copy of th
4a50: 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74 20 74  e page.  ** at t
4a60: 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 69 66  he same time, if
4a70: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 20   there is one.. 
4a80: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
4a90: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
4aa0: 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20   pgRec.pgno);.  
4ab0: 69 66 28 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50  if( pPg==0 || pP
4ac0: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
4ad0: 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 50 4c  {.    TRACE2("PL
4ae0: 41 59 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 67  AYBACK %d\n", pg
4af0: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 73  Rec.pgno);.    s
4b00: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
4b10: 67 65 72 2d 3e 66 64 2c 20 28 70 67 52 65 63 2e  ger->fd, (pgRec.
4b20: 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53  pgno-1)*(off_t)S
4b30: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
4b40: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
4b50: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
4b60: 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61 74  ->fd, pgRec.aDat
4b70: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
4b80: 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IZE);.  }.  if( 
4b90: 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pPg ){.    if( p
4ba0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 0a 20  Pg->nRef==0 ||. 
4bb0: 20 20 20 20 20 20 20 6d 65 6d 63 6d 70 28 50 47         memcmp(PG
4bc0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
4bd0: 2c 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53  , pgRec.aData, S
4be0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
4bf0: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
4c00: 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 70 64 61 74   /* Do not updat
4c10: 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
4c20: 69 73 20 70 61 67 65 20 69 66 20 74 68 65 20 70  is page if the p
4c30: 61 67 65 20 69 73 20 69 6e 20 75 73 65 0a 20 20  age is in use.  
4c40: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 70      ** and the p
4c50: 61 67 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  age has never be
4c60: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68  en modified.  Th
4c70: 69 73 20 61 76 6f 69 64 73 20 72 65 73 65 74 74  is avoids resett
4c80: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ing.      ** the
4c90: 20 22 65 78 74 72 61 22 20 64 61 74 61 2e 20 20   "extra" data.  
4ca0: 54 68 61 74 20 69 6e 20 74 75 72 6e 20 61 76 6f  That in turn avo
4cb0: 69 64 73 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ids invalidating
4cc0: 20 42 54 72 65 65 20 63 75 72 73 6f 72 73 0a 20   BTree cursors. 
4cd0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 72 65 65 73       ** in trees
4ce0: 20 74 68 61 74 20 68 61 76 65 20 6e 65 76 65 72   that have never
4cf0: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
4d00: 20 54 68 65 20 65 6e 64 20 72 65 73 75 6c 74 20   The end result 
4d10: 69 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  is that.      **
4d20: 20 79 6f 75 20 63 61 6e 20 68 61 76 65 20 61 20   you can have a 
4d30: 53 45 4c 45 43 54 20 67 6f 69 6e 67 20 6f 6e 20  SELECT going on 
4d40: 69 6e 20 6f 6e 65 20 74 61 62 6c 65 20 61 6e 64  in one table and
4d50: 20 52 4f 4c 4c 42 41 43 4b 20 63 68 61 6e 67 65   ROLLBACK change
4d60: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  s.      ** to a 
4d70: 64 69 66 66 65 72 65 6e 74 20 74 61 62 6c 65 20  different table 
4d80: 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20 69  and the SELECT i
4d90: 73 20 75 6e 61 66 66 65 63 74 65 64 20 62 79 20  s unaffected by 
4da0: 74 68 65 20 52 4f 4c 4c 42 41 43 4b 2e 0a 20 20  the ROLLBACK..  
4db0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
4dc0: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
4dd0: 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44  A(pPg), pgRec.aD
4de0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
4df0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 6d 65  _SIZE);.      me
4e00: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
4e10: 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  TRA(pPg), 0, pPa
4e20: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
4e30: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
4e40: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
4e50: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
4e60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
4e80: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
4e90: 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
4ea0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4eb0: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
4ec0: 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
4ed0: 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
4ee0: 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
4ef0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
4f00: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
4f10: 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20 54 68 65  as follows:  The
4f20: 72 65 20 69 73 20 61 6e 20 69 6e 69 74 69 61 6c  re is an initial
4f30: 0a 2a 2a 20 66 69 6c 65 2d 74 79 70 65 20 73 74  .** file-type st
4f40: 72 69 6e 67 20 66 6f 72 20 73 61 6e 69 74 79 20  ring for sanity 
4f50: 63 68 65 63 6b 69 6e 67 2e 20 20 54 68 65 6e 20  checking.  Then 
4f60: 74 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  there is a singl
4f70: 65 0a 2a 2a 20 50 67 6e 6f 20 6e 75 6d 62 65 72  e.** Pgno number
4f80: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
4f90: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4fa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
4fb0: 66 6f 72 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20  fore.** changes 
4fc0: 77 65 72 65 20 6d 61 64 65 2e 20 20 54 68 65 20  were made.  The 
4fd0: 64 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e  database is trun
4fe0: 63 61 74 65 64 20 74 6f 20 74 68 69 73 20 73 69  cated to this si
4ff0: 7a 65 2e 0a 2a 2a 20 4e 65 78 74 20 63 6f 6d 65  ze..** Next come
5000: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   zero or more pa
5010: 67 65 20 72 65 63 6f 72 64 73 20 77 68 65 72 65  ge records where
5020: 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72   each page recor
5030: 64 0a 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66  d.** consists of
5040: 20 61 20 50 67 6e 6f 20 61 6e 64 20 53 51 4c 49   a Pgno and SQLI
5050: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74  TE_PAGE_SIZE byt
5060: 65 73 20 6f 66 20 64 61 74 61 2e 20 20 53 65 65  es of data.  See
5070: 0a 2a 2a 20 74 68 65 20 50 61 67 65 52 65 63 6f  .** the PageReco
5080: 72 64 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  rd structure for
5090: 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
50a0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
50b0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
50c0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
50d0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
50e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 61 73 20  ournal file (as 
50f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f  determined by lo
5100: 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 6d 61 67  oking at the mag
5110: 69 63 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20  ic number.** at 
5120: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 29 20 74  the beginning) t
5130: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
5140: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
5150: 50 52 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20  PROTOCOL..** If 
5160: 61 6e 79 20 6f 74 68 65 72 20 65 72 72 6f 72 73  any other errors
5170: 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 70 6c   occur during pl
5180: 61 79 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  ayback, the data
5190: 62 61 73 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b  base will.** lik
51a0: 65 6c 79 20 62 65 20 63 6f 72 72 75 70 74 65 64  ely be corrupted
51b0: 2c 20 73 6f 20 74 68 65 20 50 41 47 45 52 5f 45  , so the PAGER_E
51c0: 52 52 5f 43 4f 52 52 55 50 54 20 62 69 74 20 69  RR_CORRUPT bit i
51d0: 73 20 73 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67  s set in.** pPag
51e0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20  er->errMask and 
51f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
5200: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
5210: 69 74 20 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c  it all.** works,
5220: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
5230: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
5240: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
5250: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
5260: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
5270: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5290: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
52a0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
52b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  es */.  int nRec
52c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
52e0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
52f0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
5320: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
5330: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
5340: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
5350: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
5360: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
5370: 66 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 20 20  format;         
5380: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 6f       /* Format o
5390: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
53a0: 6c 65 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  le. */.  unsigne
53b0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 73 69  d char aMagic[si
53c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
53d0: 69 63 31 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  ic1)];.  int rc;
53e0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
53f0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
5400: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
5410: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
5420: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
5430: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
5440: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
5450: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5460: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
5470: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
5480: 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  jfd, 0);.  rc = 
5490: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
54a0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
54b0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
54c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
54d0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
54e0: 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 7a  ck;.  }.  if( sz
54f0: 4a 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  J < sizeof(aMagi
5500: 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  c)+sizeof(Pgno) 
5510: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
5520: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
5530: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62 65 67   /* Read the beg
5540: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  inning of the jo
5550: 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61  urnal and trunca
5560: 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  te the.  ** data
5570: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
5580: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
5590: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
55a0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70   sqliteOsRead(&p
55b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
55c0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
55d0: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  c));.  if( rc!=S
55e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
55f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
5600: 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OCOL;.    goto e
5610: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
5620: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
5630: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
5640: 67 69 63 33 2c 20 73 69 7a 65 6f 66 28 61 4d 61  gic3, sizeof(aMa
5650: 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  gic))==0 ){.    
5660: 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c  format = JOURNAL
5670: 5f 46 4f 52 4d 41 54 5f 33 3b 0a 20 20 7d 65 6c  _FORMAT_3;.  }el
5680: 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  se if( memcmp(aM
5690: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
56a0: 67 69 63 32 2c 20 73 69 7a 65 6f 66 28 61 4d 61  gic2, sizeof(aMa
56b0: 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  gic))==0 ){.    
56c0: 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c  format = JOURNAL
56d0: 5f 46 4f 52 4d 41 54 5f 32 3b 0a 20 20 7d 65 6c  _FORMAT_2;.  }el
56e0: 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  se if( memcmp(aM
56f0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
5700: 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4d 61  gic1, sizeof(aMa
5710: 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  gic))==0 ){.    
5720: 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c  format = JOURNAL
5730: 5f 46 4f 52 4d 41 54 5f 31 3b 0a 20 20 7d 65 6c  _FORMAT_1;.  }el
5740: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
5750: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
5760: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
5770: 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ack;.  }.  if( f
5780: 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat>=JOURNAL_F
5790: 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 72  ORMAT_3 ){.    r
57a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
57b0: 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e  ormat, &pPager->
57c0: 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20 20  jfd, &nRec);.   
57d0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
57e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
57f0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5800: 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72  (format, &pPager
5810: 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
5820: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
5830: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
5840: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
5850: 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
5860: 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  ffff ){.      nR
5870: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
5880: 4e 41 4c 5f 48 44 52 5f 53 5a 28 33 29 29 2f 4a  NAL_HDR_SZ(3))/J
5890: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 33 29 3b  OURNAL_PG_SZ(3);
58a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
58b0: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
58c0: 2d 20 28 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  - (sizeof(aMagic
58d0: 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 29  )+sizeof(Pgno)))
58e0: 20 2f 20 73 69 7a 65 6f 66 28 50 61 67 65 52 65   / sizeof(PageRe
58f0: 63 6f 72 64 29 3b 0a 20 20 7d 0a 20 20 72 63 20  cord);.  }.  rc 
5900: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
5910: 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  mat, &pPager->jf
5920: 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28  d, &mxPg);.  if(
5930: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5940: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
5950: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
5960: 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e  c = sqliteOsTrun
5970: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  cate(&pPager->fd
5980: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
5990: 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b  ZE*(off_t)mxPg);
59a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
59b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
59c0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
59d0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
59e0: 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20  ize = mxPg;.  . 
59f0: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
5a00: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
5a10: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
5a20: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
5a30: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
5a40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
5a50: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ec; i++){.    rc
5a60: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
5a70: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
5a80: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  r, &pPager->jfd,
5a90: 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66   format);.    if
5aa0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
5ac0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
5ad0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
5ae0: 50 6c 61 79 62 61 63 6b 20 63 6f 6d 70 6c 65 74  Playback complet
5af0: 65 20 61 66 74 65 72 20 25 64 20 6f 66 20 25 64  e after %d of %d
5b00: 20 72 65 63 6f 72 64 73 5c 6e 22 2c 20 69 2c 20   records\n", i, 
5b10: 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 72  nRec);.        r
5b20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5b40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ak;.    }.  }...
5b50: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 23 69  end_playback:.#i
5b60: 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
5b70: 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
5b80: 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a 20  LITE_TEST).  /* 
5b90: 46 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 77  For pages that w
5ba0: 65 72 65 20 6e 65 76 65 72 20 77 72 69 74 74 65  ere never writte
5bb0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
5bc0: 61 6c 2c 20 72 65 73 74 6f 72 65 20 74 68 65 0a  al, restore the.
5bd0: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 70 79    ** memory copy
5be0: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
5bf0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
5c00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
5c10: 20 69 73 20 63 6f 64 65 20 69 73 20 75 73 65 64   is code is used
5c20: 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
5c30: 6f 6e 6c 79 2e 20 20 49 74 20 69 73 20 6e 65 63  only.  It is nec
5c40: 65 73 73 61 72 79 20 74 6f 0a 20 20 2a 2a 20 63  essary to.  ** c
5c50: 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 74 68  ompensate for th
5c60: 65 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  e sqliteOsTrunca
5c70: 74 65 28 29 20 63 61 6c 6c 20 69 6e 73 69 64 65  te() call inside
5c80: 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 70 61 67   .  ** sqlitepag
5c90: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  er_rollback().. 
5ca0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
5cb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
5cc0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 66  gHdr *pPg;.    f
5cd0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
5ce0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
5cf0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
5d00: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51      char zBuf[SQ
5d10: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  LITE_PAGE_SIZE];
5d20: 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29  .      if( (int)
5d30: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
5d40: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
5d50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5d60: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
5d70: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
5d80: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50  _SIZE*(off_t)(pP
5d90: 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20  g->pgno-1));.   
5da0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5db0: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
5dc0: 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45  fd, zBuf, SQLITE
5dd0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
5de0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
5df0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
5e00: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
5e10: 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  (zBuf, 0, SQLITE
5e20: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
5e30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5e40: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
5e50: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
5e60: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
5e70: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5e80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ) ){.        mem
5e90: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
5ea0: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 53 51  A(pPg), zBuf, SQ
5eb0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
5ec0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
5ed0: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
5ee0: 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
5ef0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
5f00: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
5f10: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
5f20: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
5f30: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5f40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5f50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65  E_OK ){.    page
5f60: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
5f70: 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
5f80: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
5f90: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b  GER_ERR_CORRUPT;
5fa0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5fb0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73  _CORRUPT;.  }els
5fc0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
5fd0: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
5fe0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
5ff0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6000: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 63 68   Playback the ch
6010: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
6020: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
6030: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
6040: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
6050: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
6060: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
6070: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
6080: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
6090: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
60a0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
60b0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
60c0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
60d0: 20 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74    the checkpoint
60e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
60f0: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 2c 20  ager->ckptSize, 
6100: 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
6110: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
6120: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
6130: 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
6140: 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
6150: 62 61 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f  back the checkpo
6160: 69 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  int journal, als
6170: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
6180: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
6190: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
61a0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
61b0: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
61c0: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
61d0: 2d 3e 63 6b 70 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->ckptJSize..*/.
61e0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
61f0: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 50  _ckpt_playback(P
6200: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6210: 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20   off_t szJ;     
6220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
6230: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
6240: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
6250: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
6260: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6270: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
6280: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
6290: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
62a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
62b0: 72 63 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61  rc;..  /* Trunca
62c0: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
62d0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
62e0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a  inal size..  */.
62f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54    rc = sqliteOsT
6300: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
6310: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
6320: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61  _SIZE*(off_t)pPa
6330: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a  ger->ckptSize);.
6340: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
6350: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53   = pPager->ckptS
6360: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ize;..  /* Figur
6370: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
6380: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
6390: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
63a0: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
63b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
63c0: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
63d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
63e0: 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28  .  sqliteOsSeek(
63f0: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30  &pPager->cpfd, 0
6400: 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
6410: 65 72 2d 3e 63 6b 70 74 4e 52 65 63 3b 0a 20 20  er->ckptNRec;.  
6420: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
6430: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
6440: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
6450: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
6460: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
6470: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
6480: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 68 65  ote that the che
6490: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
64a0: 61 6c 77 61 79 73 20 75 73 65 73 20 66 6f 72 6d  always uses form
64b0: 61 74 0a 20 20 2a 2a 20 32 20 69 6e 73 74 65 61  at.  ** 2 instea
64c0: 64 20 6f 66 20 66 6f 72 6d 61 74 20 33 20 73 69  d of format 3 si
64d0: 6e 63 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  nce it does not 
64e0: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  need to be conce
64f0: 72 6e 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 70  rned with.  ** p
6500: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 63 6f  ower failures co
6510: 72 72 75 70 74 69 6e 67 20 74 68 65 20 6a 6f 75  rrupting the jou
6520: 72 6e 61 6c 20 61 6e 64 20 63 61 6e 20 74 68 75  rnal and can thu
6530: 73 20 6f 6d 69 74 20 74 68 65 20 63 68 65 63 6b  s omit the check
6540: 73 75 6d 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sums..  */.  for
6550: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
6560: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
6570: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
6580: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
6590: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 32  &pPager->cpfd, 2
65a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
65b0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
65c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
65d0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
65e0: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
65f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
6600: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
6610: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
6620: 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
6630: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
6640: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a   ** journal..  *
6650: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  /.  rc = sqliteO
6660: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
6670: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  fd, pPager->ckpt
6680: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
6690: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
66a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
66b0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
66c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
66d0: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
66e0: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
66f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6700: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
6710: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  ckpt_playback;. 
6720: 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a   }.  nRec = (szJ
6730: 20 2d 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a   - pPager->ckptJ
6740: 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  Size)/JOURNAL_PG
6750: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
6760: 61 74 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65  at);.  for(i=nRe
6770: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
6780: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
6790: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
67a0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
67b0: 72 2d 3e 6a 66 64 2c 20 6a 6f 75 72 6e 61 6c 5f  r->jfd, journal_
67c0: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28  format);.    if(
67d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
67e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
67f0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
6800: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
6810: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
6820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e  .    }.  }.  .en
6830: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3a  d_ckpt_playback:
6840: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6850: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
6860: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
6870: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
6880: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
6890: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  E_CORRUPT;.  }. 
68a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
68b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
68c0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
68d0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
68e0: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
68f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  ed..**.** The ma
6900: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20  ximum number is 
6910: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
6920: 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65  ue of the mxPage
6930: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49   parameter..** I
6940: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
6950: 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63  tive, the noSync
6960: 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65   flag is also se
6970: 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73  t.  noSync bypas
6980: 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ses.** calls to 
6990: 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 29 2e 20  sqliteOsSync(). 
69a0: 20 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20   The pager runs 
69b0: 6d 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68  much faster with
69c0: 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62   noSync on,.** b
69d0: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
69e0: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
69f0: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61  es or there is a
6a00: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a  n abrupt power .
6a10: 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  ** failure, the 
6a20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69  database file mi
6a30: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61  ght be left in a
6a40: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
6a50: 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62  nd.** unrepairab
6a60: 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76  le state.  .*/.v
6a70: 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  oid sqlitepager_
6a80: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
6a90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
6aa0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
6ab0: 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  mxPage>=0 ){.   
6ac0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
6ad0: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
6ae0: 6c 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  le;.  }else{.   
6af0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
6b00: 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20  = 1;.    mxPage 
6b10: 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20  = -mxPage;.  }. 
6b20: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
6b30: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
6b40: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
6b50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
6b60: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
6b70: 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61  e.  Write the na
6b80: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  me of the file i
6b90: 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e  nto zName.** (zN
6ba0: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ame must be at l
6bb0: 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50  east SQLITE_TEMP
6bc0: 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20  NAME_SIZE bytes 
6bd0: 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a  long.)  Write.**
6be0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
6bf0: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
6c00: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
6c10: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
6c20: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
6c30: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
6c40: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
6c50: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
6c60: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
6c70: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
6c80: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
6c90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
6ca0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70  t sqlitepager_op
6cb0: 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69  entemp(char *zFi
6cc0: 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b  le, OsFile *fd){
6cd0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
6ce0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a    int rc;.  do{.
6cf0: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
6d00: 71 6c 69 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e  qliteOsTempFileN
6d10: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
6d20: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65  rc = sqliteOsOpe
6d30: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
6d40: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
6d50: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
6d60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
6d70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6d80: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
6d90: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
6da0: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
6db0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
6dc0: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
6dd0: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
6de0: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
6df0: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
6e00: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
6e10: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
6e20: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70   call to sqlitep
6e30: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
6e40: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
6e50: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
6e60: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
6e70: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
6e80: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
6e90: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
6ea0: 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
6eb0: 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
6ec0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
6ed0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
6ee0: 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
6ef0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
6f00: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
6f10: 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
6f20: 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
6f30: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  it is closed..*/
6f40: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
6f50: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
6f60: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
6f70: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
6f80: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
6f90: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
6fa0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
6fb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6fc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6fd0: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
6fe0: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
6ff0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
7000: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
7010: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
7020: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
7030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
7040: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
7050: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7060: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
7070: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20   useJournal     
7080: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
7090: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
70a0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
70b0: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
70c0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
70d0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
70e0: 65 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  e;.  int nameLen
70f0: 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20  ;.  OsFile fd;. 
7100: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74   int rc;.  int t
7110: 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  empFile;.  int r
7120: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63  eadOnly = 0;.  c
7130: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
7140: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
7150: 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  ..  *ppPager = 0
7160: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  ;.  if( sqlite_m
7170: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
7180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7190: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
71a0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a  f( zFilename ){.
71b0: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
71c0: 65 20 3d 20 73 71 6c 69 74 65 4f 73 46 75 6c 6c  e = sqliteOsFull
71d0: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
71e0: 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  me);.    rc = sq
71f0: 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72  liteOsOpenReadWr
7200: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
7210: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
7220: 79 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  y);.    tempFile
7230: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7240: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
7250: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
7260: 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46  mp, &fd);.    zF
7270: 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b  ilename = zTemp;
7280: 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61  .    zFullPathna
7290: 6d 65 20 3d 20 73 71 6c 69 74 65 4f 73 46 75 6c  me = sqliteOsFul
72a0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
72b0: 61 6d 65 29 3b 0a 20 20 20 20 74 65 6d 70 46 69  ame);.    tempFi
72c0: 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  le = 1;.  }.  if
72d0: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
72e0: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
72f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
7300: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  M;.  }.  if( rc!
7310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7320: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
7330: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
7340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7350: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e  ANTOPEN;.  }.  n
7360: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
7370: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
7380: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
7390: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
73a0: 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
73b0: 65 6e 2a 32 20 2b 20 33 30 20 29 3b 0a 20 20 69  en*2 + 30 );.  i
73c0: 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  f( pPager==0 ){.
73d0: 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73      sqliteOsClos
73e0: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
73f0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
7400: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
7410: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7420: 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28    }.  SET_PAGER(
7430: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
7440: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
7450: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
7460: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
7470: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
7480: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
7490: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
74a0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
74b0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
74c0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
74d0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75  r->zJournal, zFu
74e0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
74f0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
7500: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
7510: 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
7520: 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22  rnal[nameLen], "
7530: 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50  -journal");.  pP
7540: 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
7550: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7560: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
7570: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
7580: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70   useJournal;.  p
7590: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
75a0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  = 0;.  pPager->c
75b0: 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  kptInUse = 0;.  
75c0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
75d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
75e0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
75f0: 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 30 3b  r->ckptSize = 0;
7600: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  .  pPager->ckptJ
7610: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
7620: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
7630: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
7640: 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50  = mxPage>5 ? mxP
7650: 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67  age : 10;.  pPag
7660: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
7670: 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  TE_UNLOCK;.  pPa
7680: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
7690: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  ;.  pPager->temp
76a0: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
76b0: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
76c0: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
76d0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
76e0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
76f0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
7700: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
7710: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
7720: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
7730: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
7740: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
7750: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
7760: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  0;.  pPager->nEx
7770: 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20  tra = nExtra;.  
7780: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
7790: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
77a0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
77b0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
77c0: 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
77d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
77e0: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
77f0: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
7800: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
7810: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
7820: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
7830: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
7840: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
7850: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
7860: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
7870: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
7880: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
7890: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
78a0: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
78b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
78c0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
78d0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
78e0: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
78f0: 65 73 75 6c 74 20 73 71 6c 69 74 65 70 61 67 65  esult sqlitepage
7900: 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  r_close().  .** 
7910: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
7920: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
7930: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
7940: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
7950: 74 65 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74  tepager_set_dest
7960: 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
7970: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
7980: 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a 20 20 70  sc)(void*)){.  p
7990: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
79a0: 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
79b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
79c0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
79d0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
79e0: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
79f0: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
7a00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
7a10: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
7a20: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7a30: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
7a40: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
7a50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
7a60: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
7a70: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
7a80: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
7a90: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
7aa0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  e(&pPager->fd, &
7ab0: 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  n)!=SQLITE_OK ){
7ac0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
7ad0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
7ae0: 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75  R_DISK;.    retu
7af0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d  rn 0;.  }.  n /=
7b00: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
7b10: 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  E;.  if( pPager-
7b20: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
7b30: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
7b40: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
7b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
7b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
7b70: 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
7b80: 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
7b90: 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
7ba0: 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
7bb0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
7bc0: 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
7bd0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
7be0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
7bf0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
7c00: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
7c10: 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
7c20: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
7c30: 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
7c40: 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
7c50: 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
7c60: 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
7c70: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
7c80: 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
7c90: 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
7ca0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
7cb0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
7cc0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
7cd0: 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ump..*/.int sqli
7ce0: 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  tepager_close(Pa
7cf0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7d00: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
7d10: 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50  xt;.  switch( pP
7d20: 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20  ager->state ){. 
7d30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
7d40: 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20  RITELOCK: {.    
7d50: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
7d60: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
7d70: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e        sqliteOsUn
7d80: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
7d90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
7da0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7db0: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Open==0 );.     
7dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7dd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
7de0: 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20  ADLOCK: {.      
7df0: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
7e00: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
7e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e20: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7e30: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
7e40: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
7e50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
7e60: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
7e70: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
7e80: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
7e90: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
7ea0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
7eb0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  pPg);.  }.  sqli
7ec0: 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  teOsClose(&pPage
7ed0: 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74  r->fd);.  assert
7ee0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7ef0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a  lOpen==0 );.  /*
7f00: 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
7f10: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
7f20: 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
7f30: 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
7f40: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
7f50: 2a 20 20 20 73 71 6c 69 74 65 4f 73 44 65 6c 65  *   sqliteOsDele
7f60: 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
7f70: 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
7f80: 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70  */.  CLR_PAGER(p
7f90: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
7fa0: 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
7fb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7fc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7fd0: 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
7fe0: 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
7ff0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
8000: 6e 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  no sqlitepager_p
8010: 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
8020: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
8030: 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
8040: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
8050: 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
8060: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
8070: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
8080: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
8090: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 0a   If the page is.
80a0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  ** currently on 
80b0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
80c0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
80d0: 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
80e0: 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
80f0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
8100: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 5f  */.#define page_
8110: 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
8120: 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
8130: 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
8140: 52 65 66 2b 2b 29 0a 73 74 61 74 69 63 20 76 6f  Ref++).static vo
8150: 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48  id _page_ref(PgH
8160: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
8170: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
8180: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8190: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
81a0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
81b0: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
81c0: 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70   if( pPg==pPg->p
81d0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
81e0: 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ced ){.      PgH
81f0: 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
8200: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68  xtFree;.      wh
8210: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
8220: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
8230: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
8240: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
8250: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
8260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8270: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
8280: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
8290: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
82a0: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
82b0: 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
82c0: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
82d0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
82e0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
82f0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
8300: 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20  extFree ){.     
8310: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
8320: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
8330: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
8340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
8350: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  g->pPager->pLast
8360: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
8370: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  e;.    }.    pPg
8380: 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
8390: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
83a0: 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f++;.  REFINFO(p
83b0: 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  Pg);.}../*.** In
83c0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
83d0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
83e0: 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
83f0: 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
8400: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
8410: 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
8420: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
8430: 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
8440: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
8450: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
8460: 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
8470: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
8480: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8490: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
84a0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 6e  journal and then
84b0: 20 77 72 69 74 65 20 61 6c 6c 20 66 72 65 65 20   write all free 
84c0: 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
84d0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
84e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69  ile..**.** Writi
84f0: 6e 67 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74  ng all free dirt
8500: 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
8510: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 74 68  atabase after th
8520: 65 20 73 79 6e 63 20 69 73 20 61 0a 2a 2a 20 6e  e sync is a.** n
8530: 6f 6e 2d 6f 62 76 69 6f 75 73 20 6f 70 74 69 6d  on-obvious optim
8540: 69 7a 61 74 69 6f 6e 2e 20 20 66 73 79 6e 63 28  ization.  fsync(
8550: 29 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  ) is an expensiv
8560: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 6f 20 77  e operation so w
8570: 65 0a 2a 2a 20 77 61 6e 74 20 74 6f 20 6d 69 6e  e.** want to min
8580: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
8590: 20 6f 74 20 74 69 6d 65 73 20 69 74 20 69 73 20   ot times it is 
85a0: 63 61 6c 6c 65 64 2e 20 41 66 74 65 72 20 61 6e  called. After an
85b0: 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2c 0a 2a   fsync() call,.*
85c0: 2a 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f  * we are free to
85d0: 20 77 72 69 74 65 20 64 69 72 74 79 20 70 61 67   write dirty pag
85e0: 65 73 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  es back to the d
85f0: 61 74 61 62 61 73 65 2e 20 20 49 74 20 69 73 20  atabase.  It is 
8600: 62 65 73 74 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  best.** to go ah
8610: 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 61 73  ead and write as
8620: 20 6d 61 6e 79 20 64 69 72 74 79 20 70 61 67 65   many dirty page
8630: 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  s as possible to
8640: 20 6d 69 6e 69 6d 69 7a 65 20 0a 2a 2a 20 74 68   minimize .** th
8650: 65 20 72 69 73 6b 20 6f 66 20 68 61 76 69 6e 67  e risk of having
8660: 20 74 6f 20 64 6f 20 61 6e 6f 74 68 65 72 20 66   to do another f
8670: 73 79 6e 63 28 29 20 6c 61 74 65 72 20 6f 6e 2e  sync() later on.
8680: 20 20 57 72 69 74 69 6e 67 20 64 69 72 74 79 0a    Writing dirty.
8690: 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 6e  ** free pages in
86a0: 20 74 68 69 73 20 77 61 79 20 77 61 73 20 6f 62   this way was ob
86b0: 73 65 72 76 65 64 20 74 6f 20 6d 61 6b 65 20 64  served to make d
86c0: 61 74 61 62 61 73 65 20 6f 70 65 72 61 74 69 6f  atabase operatio
86d0: 6e 73 20 67 6f 0a 2a 2a 20 75 70 20 74 6f 20 31  ns go.** up to 1
86e0: 30 20 74 69 6d 65 73 20 66 61 73 74 65 72 2e 0a  0 times faster..
86f0: 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  **.** If we are 
8700: 77 72 69 74 69 6e 67 20 74 6f 20 74 65 6d 70 6f  writing to tempo
8710: 72 61 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  rary database, t
8720: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
8730: 74 6f 20 70 72 65 73 65 72 76 65 0a 2a 2a 20 74  to preserve.** t
8740: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
8750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8760: 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
8770: 20 74 69 6d 65 20 61 6e 64 20 73 6b 69 70 20 74   time and skip t
8780: 68 65 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 0a 2a  he.** fsync()..*
8790: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
87a0: 63 41 6c 6c 50 61 67 65 73 28 50 61 67 65 72 20  cAllPages(Pager 
87b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
87c0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
87d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
87e0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
87f0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
8800: 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
8810: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
8820: 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
8830: 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
8840: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
8850: 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
8860: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
8870: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
8880: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
8890: 7b 0a 20 20 20 20 20 20 6f 66 66 5f 74 20 73 7a  {.      off_t sz
88a0: 4a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  J;.      assert(
88b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
88c0: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  Open );.      as
88d0: 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e  sert( !pPager->n
88e0: 6f 53 79 6e 63 20 29 3b 0a 23 69 66 6e 64 65 66  oSync );.#ifndef
88f0: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
8900: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 68 64          off_t hd
8910: 72 53 7a 2c 20 70 67 53 7a 3b 0a 20 20 20 20 20  rSz, pgSz;.     
8920: 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f 55 52 4e     hdrSz = JOURN
8930: 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61  AL_HDR_SZ(journa
8940: 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20  l_format);.     
8950: 20 20 20 70 67 53 7a 20 3d 20 4a 4f 55 52 4e 41     pgSz = JOURNA
8960: 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
8970: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20 20  format);.       
8980: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
8990: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
89a0: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 79  jfd, &pPager->sy
89b0: 6e 63 4a 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ncJSize);.      
89c0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
89d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
89e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
89f0: 3e 6e 52 65 63 2a 70 67 53 7a 2b 68 64 72 53 7a  >nRec*pgSz+hdrSz
8a00: 3d 3d 70 50 61 67 65 72 2d 3e 73 79 6e 63 4a 53  ==pPager->syncJS
8a10: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ize );.      }.#
8a20: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
8a30: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
8a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43   ){.        TRAC
8a50: 45 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20  E1("SYNC\n");.  
8a60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8a70: 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  eOsSync(&pPager-
8a80: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  >jfd);.        i
8a90: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
8aa0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
8ab0: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
8ac0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73  (&pPager->jfd, s
8ad0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8ae0: 67 69 63 31 29 29 3b 0a 20 20 20 20 20 20 77 72  gic1));.      wr
8af0: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
8b00: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
8b10: 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 73 7a 4a  nRec);.      szJ
8b20: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
8b30: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
8b40: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) +.            
8b50: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a     pPager->nRec*
8b60: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f  JOURNAL_PG_SZ(jo
8b70: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20  urnal_format);. 
8b80: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65       sqliteOsSee
8b90: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
8ba0: 73 7a 4a 29 3b 0a 20 20 20 20 20 20 54 52 41 43  szJ);.      TRAC
8bb0: 45 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20  E1("SYNC\n");.  
8bc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
8bd0: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a  sSync(&pPager->j
8be0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
8bf0: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
8c00: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8c10: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
8c20: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
8c30: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
8c40: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
8c50: 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
8c60: 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
8c70: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
8c80: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
8c90: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
8ca0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
8cb0: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
8cc0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
8cd0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8ce0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8cf0: 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
8d00: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
8d10: 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
8d20: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
8d30: 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
8d40: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
8d50: 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
8d60: 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
8d70: 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
8d80: 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
8d90: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
8da0: 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
8db0: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
8dc0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8dd0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
8de0: 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
8df0: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
8e00: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
8e10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8e20: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
8e30: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
8e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
8e50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8e60: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
8e70: 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
8e80: 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
8e90: 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
8ea0: 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
8eb0: 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
8ec0: 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
8ed0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
8ee0: 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
8ef0: 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
8f00: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
8f10: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
8f20: 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
8f30: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
8f40: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
8f50: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
8f60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
8f70: 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
8f80: 67 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  ger;.  while( pL
8f90: 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
8fa0: 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
8fb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53  );.    sqliteOsS
8fc0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
8fd0: 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
8fe0: 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50  *(off_t)SQLITE_P
8ff0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72  AGE_SIZE);.    r
9000: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
9010: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  e(&pPager->fd, P
9020: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
9030: 73 74 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  st), SQLITE_PAGE
9040: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
9050: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9060: 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
9070: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
9080: 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
9090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
90a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
90b0: 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
90c0: 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
90d0: 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
90e0: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
90f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
9100: 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
9110: 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
9120: 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
9130: 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
9140: 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
9150: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
9160: 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
9170: 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
9180: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
9190: 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
91a0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
91b0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
91c0: 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
91d0: 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
91e0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
91f0: 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
9200: 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
9210: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9220: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
9230: 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
9240: 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
9250: 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
9260: 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
9270: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
9280: 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
9290: 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
92a0: 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
92b0: 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
92c0: 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
92d0: 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
92e0: 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
92f0: 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
9300: 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
9310: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
9320: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9330: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
9340: 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
9350: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
9360: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
9370: 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
9380: 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
9390: 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
93a0: 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
93b0: 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
93c0: 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
93d0: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
93e0: 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
93f0: 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
9400: 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
9410: 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
9420: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
9430: 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
9440: 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
9450: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
9460: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
9470: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
9480: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
9490: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
94a0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
94b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f   sqlitepager_loo
94c0: 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
94d0: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
94e0: 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
94f0: 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
9500: 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
9510: 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
9520: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
9530: 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
9540: 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
9550: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
9560: 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
9570: 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
9580: 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
9590: 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
95a0: 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
95b0: 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
95c0: 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
95d0: 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
95e0: 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
95f0: 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
9600: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
9610: 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
9620: 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
9630: 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
9640: 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
9650: 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
9660: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
9670: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9680: 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
9690: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
96a0: 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
96b0: 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
96c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
96d0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
96e0: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
96f0: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
9700: 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
9710: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
9720: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
9730: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9740: 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
9750: 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
9760: 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
9770: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
9780: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
9790: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
97a0: 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
97b0: 74 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20  then get a read 
97c0: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
97d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
97e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
97f0: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
9800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
9810: 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
9820: 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  >fd);.    if( rc
9830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9840: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
9850: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9860: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
9870: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
9880: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20  ITE_READLOCK;.. 
9890: 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
98a0: 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
98b0: 74 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62  try to play it b
98c0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
98d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
98e0: 6f 75 72 6e 61 6c 20 26 26 20 73 71 6c 69 74 65  ournal && sqlite
98f0: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
9900: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29  ger->zJournal) )
9910: 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 2c  {.       int rc,
9920: 20 64 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 20   dummy;..       
9930: 2f 2a 20 47 65 74 20 61 20 77 72 69 74 65 20 6c  /* Get a write l
9940: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9950: 61 73 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ase.       */.  
9960: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9970: 4f 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61  OsWriteLock(&pPa
9980: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
9990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
99a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69  OK ){.         i
99b0: 66 28 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63  f( sqliteOsUnloc
99c0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d  k(&pPager->fd)!=
99d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
99e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
99f0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
9a00: 70 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20 20  pen! */.        
9a10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
9a20: 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  NTERNAL;.       
9a30: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 2a 70 70    }.         *pp
9a40: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
9a50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
9a60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
9a70: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
9a80: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a  LITE_WRITELOCK;.
9a90: 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .       /* Open 
9aa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
9ab0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
9ac0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
9ad0: 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
9ae0: 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74  ** we cannot get
9af0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
9b00: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
9b10: 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a   file. .       *
9b20: 2a 0a 20 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  *.       ** Even
9b30: 20 74 68 6f 75 67 68 20 77 65 20 77 69 6c 6c 20   though we will 
9b40: 6f 6e 6c 79 20 62 65 20 72 65 61 64 69 6e 67 20  only be reading 
9b50: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9b60: 2c 20 6e 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20  , not writing,. 
9b70: 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65        ** we have
9b80: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
9b90: 72 6e 61 6c 20 66 6f 72 20 77 72 69 74 69 6e 67  rnal for writing
9ba0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6f 62 74   in order to obt
9bb0: 61 69 6e 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a  ain an.       **
9bc0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
9bd0: 73 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  s lock..       *
9be0: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
9bf0: 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72  liteOsOpenReadWr
9c00: 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ite(pPager->zJou
9c10: 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
9c20: 66 64 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  fd, &dummy);.   
9c30: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9c40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9c50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55    rc = sqliteOsU
9c60: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
9c70: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73  d);.         ass
9c80: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
9c90: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 2a  OK );.         *
9ca0: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
9cb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9cc0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
9cd0: 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
9ce0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
9cf0: 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
9d00: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
9d10: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  = 0;..       /* 
9d20: 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
9d30: 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
9d40: 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
9d50: 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
9d60: 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
9d70: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
9d80: 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
9d90: 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
9da0: 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
9db0: 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  r);.       if( r
9dc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9dd0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9de0: 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
9df0: 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a   }.    pPg = 0;.
9e00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
9e10: 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20  Search for page 
9e20: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
9e30: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
9e40: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
9e50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
9e60: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
9e70: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
9e80: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
9e90: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
9ea0: 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67   int h;.    pPag
9eb0: 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20  er->nMiss++;.   
9ec0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
9ed0: 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
9ee0: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
9ef0: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
9f00: 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
9f10: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50  page */.      pP
9f20: 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
9f30: 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
9f40: 29 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ) + SQLITE_PAGE_
9f50: 53 49 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20  SIZE .          
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
9f80: 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
9f90: 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ra );.      if( 
9fa0: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
9fb0: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
9fc0: 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77         pager_unw
9fd0: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
9fe0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
9ff0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
a000: 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20  ER_ERR_MEM;.    
a010: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a020: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
a030: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
a040: 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
a050: 67 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g));.      pPg->
a060: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
a070: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
a080: 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
a090: 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70  All;.      if( p
a0a0: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
a0b0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
a0c0: 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20  All->pPrevAll = 
a0d0: 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pPg;.      }.   
a0e0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c     pPg->pPrevAll
a0f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
a100: 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
a110: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
a120: 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  age++;.    }else
a130: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20  {.      /* Find 
a140: 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
a150: 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
a160: 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
a170: 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
a180: 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
a190: 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
a1a0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  he journal..    
a1b0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d    */.      pPg =
a1c0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
a1d0: 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ynced;..      /*
a1e0: 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
a1f0: 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
a200: 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
a210: 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
a220: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f      ** on the jo
a230: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
a240: 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
a250: 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
a260: 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79   a.      ** very
a270: 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
a280: 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
a290: 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
a2a0: 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20  ut sometimes.   
a2b0: 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62     ** it can't b
a2c0: 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20  e helped..      
a2d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
a2e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
a2f0: 6e 74 20 72 63 20 3d 20 73 79 6e 63 41 6c 6c 50  nt rc = syncAllP
a300: 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
a310: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
a320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a330: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
a340: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
a350: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
a360: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
a370: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
a380: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a390: 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
a3a0: 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
a3b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a3c0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
a3d0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
a3e0: 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
a3f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
a400: 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
a410: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
a420: 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
a430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a440: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
a450: 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
a460: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
a470: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
a480: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
a490: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
a4a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a4b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a4c0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
a4d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
a4e0: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
a4f0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a500: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
a510: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a520: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a530: 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
a540: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
a550: 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
a560: 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
a570: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
a580: 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ack, then.      
a590: 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
a5a0: 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
a5b0: 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
a5c0: 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  bling the.      
a5d0: 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72  ** sqlite_dont_r
a5e0: 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
a5f0: 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
a600: 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
a610: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
a620: 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
a630: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
a640: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
a650: 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
a660: 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67  ack.      ** mig
a670: 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
a680: 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
a690: 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
a6a0: 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
a6b0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  er.      ** that
a6c0: 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
a6d0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
a6e0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
a6f0: 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
a700: 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65       ** be marke
a710: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
a720: 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
a730: 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   out..      */. 
a740: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c       if( pPg->al
a750: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
a760: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a770: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
a780: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
a790: 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65     /* Unlink the
a7a0: 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
a7b0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
a7c0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
a7d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
a7e0: 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
a7f0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
a800: 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
a810: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
a820: 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e;.        while
a830: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
a840: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
a850: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
a860: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
a870: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
a880: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
a890: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
a8a0: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72          pPg->pPr
a8b0: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
a8c0: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
a8d0: 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ee;.      }else{
a8e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a8f0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
a900: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
a910: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
a920: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
a930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a940: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
a950: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
a960: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
a970: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
a980: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  revFree;.      }
a990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
a9a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
a9b0: 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
a9c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
a9d0: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
a9e0: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ee;.      }.    
a9f0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
aa00: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
aa10: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
aa20: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
aa30: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
aa40: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
aa50: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
aa60: 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  vHash;.      }. 
aa70: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50       if( pPg->pP
aa80: 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 20  revHash ){.     
aa90: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
aaa0: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
aab0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
aac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aad0: 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
aae0: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
aaf0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ab00: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
ab10: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
ab20: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
ab30: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
ab40: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
ab50: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
ab60: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
ab70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
ab80: 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20  er->nOvfl++;.   
ab90: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
aba0: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
abb0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
abc0: 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
abd0: 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
abe0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
abf0: 6c 69 74 65 43 68 65 63 6b 4d 65 6d 6f 72 79 28  liteCheckMemory(
ac00: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
ac10: 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
ac20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ac30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
ac40: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
ac50: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
ac60: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
ac70: 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
ac80: 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
ac90: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
aca0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
acb0: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
acc0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
acd0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
ace0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
acf0: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 26  Pager->aInCkpt &
ad00: 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
ad10: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 0a 20 20  ger->ckptSize.  
ad20: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
ad30: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
ad40: 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
ad50: 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
ad60: 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
ad70: 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  ckpt_list(pPg);.
ad80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad90: 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
ada0: 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29  m_ckpt_list(pPg)
adb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
adc0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
add0: 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
ade0: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
adf0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
ae00: 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67  f++;.    h = pag
ae10: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
ae20: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
ae30: 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
ae40: 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
ae50: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
ae60: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
ae70: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
ae80: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
ae90: 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
aea0: 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
aeb0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
aec0: 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
aed0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
aee0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
aef0: 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61  ) sqlitepager_pa
af00: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
af10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
af20: 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e  >dbSize<(int)pgn
af30: 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
af40: 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
af50: 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f  pPg), 0, SQLITE_
af60: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
af70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
af80: 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
af90: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
afa0: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f  >fd, (pgno-1)*(o
afb0: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
afc0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63  _SIZE);.      rc
afd0: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
afe0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
aff0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
b000: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
b010: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
b020: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b030: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c         off_t fil
b040: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
b050: 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53  f( sqliteOsFileS
b060: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
b070: 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49  &fileSize)!=SQLI
b080: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
b090: 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65       || fileSize
b0a0: 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41  >=pgno*SQLITE_PA
b0b0: 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
b0c0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
b0d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b0e0: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
b0f0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
b100: 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
b110: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
b120: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b130: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
b140: 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
b150: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
b160: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
b170: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
b180: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
b190: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
b1a0: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
b1b0: 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
b1c0: 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  e. */.    pPager
b1d0: 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61  ->nHit++;.    pa
b1e0: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
b1f0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48  .  *ppPage = PGH
b200: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
b210: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b220: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
b230: 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
b240: 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
b250: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
b260: 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
b270: 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
b280: 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
b290: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b2a0: 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
b2b0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
b2c0: 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
b2d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
b2e0: 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 2e 20  itepager_get(). 
b2f0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
b300: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
b310: 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
b320: 74 65 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  tepager_get() is
b330: 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
b340: 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
b350: 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
b360: 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
b370: 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
b380: 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
b390: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
b3a0: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
b3b0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
b3c0: 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
b3d0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
b3e0: 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
b3f0: 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
b400: 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75  qlitepager_looku
b410: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
b420: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
b430: 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
b440: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
b450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
b460: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
b470: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
b480: 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
b490: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b4a0: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 28 20  0;.  }.  /* if( 
b4b0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
b4c0: 29 7b 0a 20 20 2a 2a 20 20 72 65 74 75 72 6e 20  ){.  **  return 
b4d0: 30 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20  0;.  ** }.  */. 
b4e0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
b4f0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
b500: 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
b510: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61  ) return 0;.  pa
b520: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
b530: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
b540: 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
b550: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
b560: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
b570: 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
b580: 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
b590: 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
b5a0: 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
b5b0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
b5c0: 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
b5d0: 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
b5e0: 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
b5f0: 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
b600: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
b610: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
b620: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
b630: 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
b640: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  t sqlitepager_un
b650: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
b660: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
b670: 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
b680: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
b690: 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
b6a0: 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44  e.  */.  pPg = D
b6b0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
b6c0: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
b6d0: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
b6e0: 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
b6f0: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
b700: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
b710: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
b720: 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
b730: 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
b740: 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
b750: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
b760: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
b770: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
b780: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
b790: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
b7a0: 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
b7b0: 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
b7c0: 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
b7d0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
b7e0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
b7f0: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
b800: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
b810: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
b820: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
b830: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
b840: 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
b850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
b860: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
b870: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
b880: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
b890: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
b8a0: 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
b8b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
b8c0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
b8d0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
b8e0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
b8f0: 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
b900: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
b910: 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  r(pData);.    }.
b920: 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
b930: 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
b940: 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
b950: 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
b960: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
b970: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
b980: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
b990: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
b9a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
b9b0: 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
b9c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
b9d0: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
b9e0: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
b9f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ba00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ba10: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
ba20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
ba30: 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
ba40: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
ba50: 20 61 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b   a write.** lock
ba60: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
ba70: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
ba80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ba90: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
baa0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
bab0: 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
bac0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
bad0: 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
bae0: 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
baf0: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
bb00: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
bb10: 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
bb20: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
bb30: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
bb40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bb50: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
bb60: 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61  WRITELOCK );.  a
bb70: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
bb80: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
bb90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bba0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
bbb0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
bbc0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
bbd0: 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
bbe0: 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
bbf0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
bc00: 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
bc10: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
bc20: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
bc30: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
bc40: 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c  e = SQLITE_READL
bc50: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
bc60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bc70: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  }.  rc = sqliteO
bc80: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
bc90: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
bca0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50   &pPager->jfd,pP
bcb0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
bcc0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
bcd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
bce0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
bcf0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
bd00: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
bd10: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  al = 0;.    sqli
bd20: 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50  teOsReadLock(&pP
bd30: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70  ager->fd);.    p
bd40: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
bd50: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a  QLITE_READLOCK;.
bd60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bd70: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
bd80: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bd90: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
bda0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
bdb0: 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
bdc0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
bdd0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
bde0: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
bdf0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
be00: 30 3b 0a 20 20 73 71 6c 69 74 65 70 61 67 65 72  0;.  sqlitepager
be10: 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
be20: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72  r);.  pPager->or
be30: 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
be40: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28  r->dbSize;.  if(
be50: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d   journal_format=
be60: 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
be70: 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  3 ){.    rc = sq
be80: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
be90: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
bea0: 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66  alMagic3, sizeof
beb0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 29  (aJournalMagic3)
bec0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bee0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
bef0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
bf00: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
bf10: 65 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  e ? 0xffffffff :
bf20: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
bf30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bf40: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bf50: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 28 75  ->cksumInit = (u
bf60: 33 32 29 73 71 6c 69 74 65 52 61 6e 64 6f 6d 49  32)sqliteRandomI
bf70: 6e 74 65 67 65 72 28 29 3b 0a 20 20 20 20 20 20  nteger();.      
bf80: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
bf90: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
bfa0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
bfb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
bfc0: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
bfd0: 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52  mat==JOURNAL_FOR
bfe0: 4d 41 54 5f 32 20 29 7b 0a 20 20 20 20 72 63 20  MAT_2 ){.    rc 
bff0: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
c000: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
c010: 6f 75 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73 69  ournalMagic2, si
c020: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
c030: 69 63 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ic2));.  }else{.
c040: 20 20 20 20 61 73 73 65 72 74 28 20 6a 6f 75 72      assert( jour
c050: 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52  nal_format==JOUR
c060: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 3b 0a  NAL_FORMAT_1 );.
c070: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
c080: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
c090: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
c0a0: 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  ic1, sizeof(aJou
c0b0: 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b 0a 20 20  rnalMagic1));.  
c0c0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c0d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c0e0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
c0f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
c100: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
c110: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
c120: 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  kptAutoopen && r
c130: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c140: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
c150: 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e 28  ager_ckpt_begin(
c160: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
c170: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c180: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
c190: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
c1a0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
c1b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c1c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c1d0: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
c1e0: 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
c1f0: 47 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  G.  pPager->sync
c200: 4a 53 69 7a 65 20 3d 20 30 3b 0a 23 65 6e 64 69  JSize = 0;.#endi
c210: 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  f.  return rc;  
c220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
c230: 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
c240: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
c250: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d   The lock is rem
c260: 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  oved when.** the
c270: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
c280: 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a  owing happen:.**
c290: 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70  .**   *  sqlitep
c2a0: 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
c2b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
c2c0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
c2d0: 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
c2e0: 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
c2f0: 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  epager_close() i
c300: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
c310: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e    sqlitepager_un
c320: 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ref() is called 
c330: 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73  to on every outs
c340: 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a  tanding page..**
c350: 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65  .** The paramete
c360: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
c370: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
c380: 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
c390: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
c3a0: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
c3b0: 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
c3c0: 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
c3d0: 20 75 73 65 64 20 6d 65 72 65 6c 79 0a 2a 2a 20   used merely.** 
c3e0: 74 6f 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  to acquire a poi
c3f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
c400: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
c410: 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
c420: 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ere.** is alread
c430: 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
c440: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
c450: 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66  *.** A journal f
c460: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ile is opened if
c470: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
c480: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
c490: 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  For.** temporary
c4a0: 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e   files, the open
c4b0: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
c4c0: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
c4d0: 72 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  red until.** the
c4e0: 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20  re is an actual 
c4f0: 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  need to write to
c500: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
c510: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
c520: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 77  ase is already w
c530: 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20 74 68 69  rite-locked, thi
c540: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
c550: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
c560: 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28 76  itepager_begin(v
c570: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
c580: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
c590: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
c5a0: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
c5b0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
c5c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c5d0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
c5e0: 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
c5f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c600: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
c610: 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
c620: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53  pPager->state==S
c630: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29  QLITE_READLOCK )
c640: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
c650: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
c660: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
c670: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63  sqliteOsWriteLoc
c680: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
c690: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c6a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c6b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
c6c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
c6d0: 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  e = SQLITE_WRITE
c6e0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
c6f0: 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 30 3b  ->dirtyFile = 0;
c700: 0a 20 20 20 20 54 52 41 43 45 31 28 22 54 52 41  .    TRACE1("TRA
c710: 4e 53 41 43 54 49 4f 4e 5c 6e 22 29 3b 0a 20 20  NSACTION\n");.  
c720: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
c730: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
c740: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
c750: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
c760: 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
c770: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
c780: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c790: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
c7a0: 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
c7b0: 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
c7c0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
c7d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
c7e0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
c7f0: 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
c800: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
c810: 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
c820: 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
c830: 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
c840: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
c850: 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
c860: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
c870: 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
c880: 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
c890: 64 20 61 63 71 75 69 72 65 73 20 61 20 77 72 69  d acquires a wri
c8a0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
c8b0: 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
c8c0: 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 63   write.** lock c
c8d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
c8e0: 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
c8f0: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
c900: 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
c910: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
c920: 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
c930: 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
c940: 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
c950: 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
c960: 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
c970: 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
c980: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
c990: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
c9a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
c9b0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
c9c0: 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
c9d0: 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
c9e0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
c9f0: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
ca00: 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
ca10: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
ca20: 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
ca30: 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
ca40: 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
ca50: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
ca60: 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
ca70: 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
ca80: 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  tepager_commit()
ca90: 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72 5f   or sqlitepager_
caa0: 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  rollback() to.**
cab0: 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73   reset..*/.int s
cac0: 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74 65  qlitepager_write
cad0: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
cae0: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
caf0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
cb00: 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
cb10: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
cb20: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
cb30: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
cb40: 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
cb50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
cb60: 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20  r->errMask ){ . 
cb70: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
cb80: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
cb90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
cba0: 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
cbb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cbc0: 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _PERM;.  }..  /*
cbd0: 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
cbe0: 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
cbf0: 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
cc00: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
cc10: 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
cc20: 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
cc30: 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
cc40: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69  ..  */.  pPg->di
cc50: 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  rty = 1;.  if( p
cc60: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
cc70: 20 28 70 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c   (pPg->inCkpt ||
cc80: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
cc90: 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
cca0: 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20  ager->dirtyFile 
ccb0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
ccc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
ccd0: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
cce0: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
ccf0: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
cd00: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a  needs to be.  **
cd10: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
cd20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
cd30: 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
cd40: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
cd50: 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  ** or both..  **
cd60: 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63  .  ** First chec
cd70: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
cd80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
cd90: 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
cda0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20  .  ** create it 
cdb0: 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
cdc0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
cdd0: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
cde0: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  LITE_UNLOCK );. 
cdf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
ce00: 72 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a  r_begin(pData);.
ce10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ce20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
ce30: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
ce40: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
ce50: 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e==SQLITE_WRITEL
ce60: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 21 70 50  OCK );.  if( !pP
ce70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
ce80: 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
ce90: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
cea0: 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
ceb0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
cec0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ced0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cee0: 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
cef0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cf00: 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
cf10: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
cf20: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
cf30: 6c 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68  le = 1;..  /* Th
cf40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
cf50: 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
cf60: 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 77   and we have a w
cf70: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
cf80: 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62  .  ** main datab
cf90: 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
cfa0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
cfb0: 65 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  e to the transac
cfc0: 74 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  tion .  ** journ
cfd0: 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
cfe0: 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
cff0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e   */.  if( !pPg->
d000: 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 70 50 61  inJournal && pPa
d010: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
d020: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  ){.    if( (int)
d030: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
d040: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
d050: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50  ){.      int szP
d060: 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61 76  g;.      u32 sav
d070: 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 6f  ed;.      if( jo
d080: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f  urnal_format>=JO
d090: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29  URNAL_FORMAT_3 )
d0a0: 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
d0b0: 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
d0c0: 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  m(pPager, pPg->p
d0d0: 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  gno, pData);.   
d0e0: 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
d0f0: 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
d100: 52 41 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  RA(pPg);.       
d110: 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73   store32bits(cks
d120: 75 6d 2c 20 70 50 67 2c 20 53 51 4c 49 54 45 5f  um, pPg, SQLITE_
d130: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
d140: 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54      szPg = SQLIT
d150: 45 5f 50 41 47 45 5f 53 49 5a 45 2b 38 3b 0a 20  E_PAGE_SIZE+8;. 
d160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d170: 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54      szPg = SQLIT
d180: 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 3b 0a 20  E_PAGE_SIZE+4;. 
d190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 6f       }.      sto
d1a0: 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
d1b0: 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
d1c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
d1d0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
d1e0: 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44  jfd, &((char*)pD
d1f0: 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b  ata)[-4], szPg);
d200: 0a 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72 6e  .      if( journ
d210: 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e  al_format>=JOURN
d220: 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20  AL_FORMAT_3 ){. 
d230: 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47         *(u32*)PG
d240: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
d250: 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20  ) = saved;.     
d260: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
d270: 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRec++;.      i
d280: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d290: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d2a0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
d2b0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
d2c0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
d2d0: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
d2e0: 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ULL;.        ret
d2f0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
d300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
d310: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
d320: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  !=0 );.      pPa
d330: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
d340: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
d350: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
d360: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
d370: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
d380: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 70  >noSync;.      p
d390: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
d3a0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  1;.      if( pPa
d3b0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29  ger->ckptInUse )
d3c0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
d3d0: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
d3e0: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
d3f0: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
d400: 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
d410: 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  ckpt_list(pPg);.
d420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
d430: 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
d440: 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
d450: 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
d460: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d470: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
d480: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
d490: 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
d4a0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
d4b0: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 41 50        TRACE3("AP
d4c0: 50 45 4e 44 20 25 64 20 25 64 5c 6e 22 2c 20 70  PEND %d %d\n", p
d4d0: 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
d4e0: 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
d4f0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
d500: 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  dSync ){.      p
d510: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
d520: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
d530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
d540: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  kpoint journal i
d550: 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
d560: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
d570: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74  ,.  ** then writ
d580: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
d590: 67 65 20 74 6f 20 74 68 65 20 63 68 65 63 6b 70  ge to the checkp
d5a0: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  oint journal.  N
d5b0: 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ote that.  ** th
d5c0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
d5d0: 72 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65 73  rnal always uses
d5e0: 20 74 68 65 20 73 69 6d 70 6c 69 65 72 20 66 6f   the simplier fo
d5f0: 72 6d 61 74 20 32 20 74 68 61 74 20 6c 61 63 6b  rmat 2 that lack
d600: 73 0a 20 20 2a 2a 20 63 68 65 63 6b 73 75 6d 73  s.  ** checksums
d610: 2e 20 20 54 68 65 20 68 65 61 64 65 72 20 69 73  .  The header is
d620: 20 61 6c 73 6f 20 6f 6d 69 74 74 65 64 20 66 72   also omitted fr
d630: 6f 6d 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  om the checkpoin
d640: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
d650: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b    if( pPager->ck
d660: 70 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  ptInUse && !pPg-
d670: 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29  >inCkpt && (int)
d680: 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
d690: 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20  r->ckptSize ){. 
d6a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
d6b0: 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
d6c0: 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
d6d0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
d6e0: 3b 0a 20 20 20 20 73 74 6f 72 65 33 32 62 69 74  ;.    store32bit
d6f0: 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
d700: 2c 20 2d 34 29 3b 0a 20 20 20 20 72 63 20 3d 20  , -4);.    rc = 
d710: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
d720: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 26 28 28  Pager->cpfd, &((
d730: 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d  char*)pData)[-4]
d740: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
d750: 5a 45 2b 34 29 3b 0a 20 20 20 20 69 66 28 20 72  ZE+4);.    if( r
d760: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
d780: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
d790: 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
d7a0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
d7b0: 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20  ER_ERR_FULL;.   
d7c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d7d0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
d7e0: 63 6b 70 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  ckptNRec++;.    
d7f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d800: 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20  aInCkpt!=0 );.  
d810: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
d820: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
d830: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
d840: 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
d850: 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50  _to_ckpt_list(pP
d860: 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  g);.  }..  /* Up
d870: 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
d880: 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
d890: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
d8a0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
d8b0: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
d8c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
d8d0: 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
d8e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d8f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d900: 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
d910: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
d920: 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
d930: 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
d940: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77  to sqlitepager_w
d950: 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
d960: 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
d970: 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
d980: 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
d990: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
d9a0: 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
d9b0: 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69 74  litepager_iswrit
d9c0: 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
d9d0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
d9e0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
d9f0: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
da00: 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
da10: 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
da20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
da30: 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
da40: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
da50: 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
da60: 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
da70: 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
da80: 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
da90: 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
daa0: 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
dab0: 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
dac0: 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
dad0: 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
dae0: 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
daf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
db00: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
db10: 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
db20: 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
db30: 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
db40: 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
db50: 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
db60: 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
db70: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
db80: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
db90: 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
dba0: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
dbb0: 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
dbc0: 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f  qlitepager_dont_
dbd0: 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  rollback() below
dbe0: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
dbf0: 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
dc00: 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
dc10: 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
dc20: 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
dc30: 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
dc40: 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
dc50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
dc60: 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
dc70: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
dc80: 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
dc90: 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
dca0: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
dcb0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
dcc0: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
dcd0: 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
dce0: 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
dcf0: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
dd00: 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
dd10: 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
dd20: 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
dd30: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
dd40: 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
dd50: 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
dd60: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
dd70: 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
dd80: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
dd90: 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
dda0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
ddb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
ddc0: 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
ddd0: 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
dde0: 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
ddf0: 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
de00: 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
de10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
de20: 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
de30: 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c  .** the dont_rol
de40: 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
de50: 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
de60: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
de70: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69   contains.** cri
de80: 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
de90: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
dea0: 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c  sure it gets rol
deb0: 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
dec0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74  e.** of the dont
ded0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  _rollback() call
dee0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
def0: 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
df00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
df10: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
df20: 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67  Hdr *pPg;..  pPg
df30: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
df40: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
df50: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
df60: 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
df70: 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74  pPg && pPg->dirt
df80: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
df90: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
dfa0: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
dfb0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
dfc0: 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
dfd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
dfe0: 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
dff0: 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
e000: 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
e010: 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
e020: 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
e030: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
e040: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
e050: 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
e060: 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
e070: 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
e080: 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
e090: 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
e0a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
e0b0: 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
e0c0: 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
e0d0: 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
e0e0: 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
e0f0: 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
e100: 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
e110: 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
e120: 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
e130: 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
e140: 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
e150: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
e160: 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
e170: 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
e180: 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
e190: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
e1a0: 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
e1b0: 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
e1c0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
e1d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
e1e0: 52 41 43 45 32 28 22 44 4f 4e 54 5f 57 52 49 54  RACE2("DONT_WRIT
e1f0: 45 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a  E %d\n", pgno);.
e200: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
e210: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
e220: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
e230: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
e240: 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
e250: 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
e260: 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
e270: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e280: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
e290: 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
e2a0: 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
e2b0: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
e2c0: 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
e2d0: 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
e2e0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
e2f0: 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
e300: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69   journal..*/.voi
e310: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f  d sqlitepager_do
e320: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64  nt_rollback(void
e330: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
e340: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
e350: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
e360: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
e370: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
e380: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
e390: 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te!=SQLITE_WRITE
e3a0: 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
e3b0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
e3c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e3d0: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
e3e0: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
e3f0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 20 72  waysRollback ) r
e400: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
e410: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
e420: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
e430: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
e440: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
e450: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
e460: 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
e470: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
e480: 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
e490: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
e4a0: 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
e4b0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
e4c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b    if( pPager->ck
e4d0: 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  ptInUse ){.     
e4e0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
e4f0: 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
e500: 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
e510: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  );.      page_ad
e520: 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70  d_to_ckpt_list(p
e530: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  Pg);.    }.    T
e540: 52 41 43 45 32 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE2("DONT_ROLL
e550: 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 67 2d  BACK %d\n", pPg-
e560: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66  >pgno);.  }.  if
e570: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  ( pPager->ckptIn
e580: 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 43  Use && !pPg->inC
e590: 6b 70 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  kpt && (int)pPg-
e5a0: 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63  >pgno<=pPager->c
e5b0: 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  kptSize ){.    a
e5c0: 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
e5d0: 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
e5e0: 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
e5f0: 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
e600: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e610: 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a  ->aInCkpt!=0 );.
e620: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43      pPager->aInC
e630: 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  kpt[pPg->pgno/8]
e640: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
e650: 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
e660: 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28  dd_to_ckpt_list(
e670: 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pPg);.  }.}../*.
e680: 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
e690: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
e6a0: 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
e6b0: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
e6c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
e6d0: 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
e6e0: 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
e6f0: 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
e700: 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
e710: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
e720: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
e730: 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
e740: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
e750: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
e760: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d   sqlitepager_com
e770: 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
e780: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
e790: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
e7a0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
e7b0: 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk==PAGER_ERR_FU
e7c0: 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LL ){.    rc = s
e7d0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
e7e0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
e7f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e800: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
e810: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
e820: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
e830: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
e840: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
e850: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
e860: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
e870: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
e880: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
e890: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
e8a0: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20  E_WRITELOCK ){. 
e8b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e8c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52  _ERROR;.  }.  TR
e8d0: 41 43 45 31 28 22 43 4f 4d 4d 49 54 5c 6e 22 29  ACE1("COMMIT\n")
e8e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e8f0: 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 29 7b 0a  dirtyFile==0 ){.
e900: 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c      /* Exit earl
e910: 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  y (without doing
e920: 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d   the time-consum
e930: 69 6e 67 20 73 71 6c 69 74 65 4f 73 53 79 6e 63  ing sqliteOsSync
e940: 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a  () calls).    **
e950: 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62   if there have b
e960: 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
e970: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
e980: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
e990: 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
e9a0: 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Sync==0 );.    r
e9b0: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
e9c0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
e9d0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
e9e0: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
e9f0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
ea00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
ea10: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69 66  rnalOpen );.  if
ea20: 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
ea30: 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79  nc && sqliteOsSy
ea40: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
ea50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ea60: 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
ea70: 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 70 50 67 20  bort;.  }.  pPg 
ea80: 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
ea90: 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
eaa0: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  er);.  if( pPg )
eab0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
eac0: 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
ead0: 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
eae0: 20 7c 7c 20 28 21 70 50 61 67 65 72 2d 3e 6e 6f   || (!pPager->no
eaf0: 53 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73  Sync && sqliteOs
eb00: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64  Sync(&pPager->fd
eb10: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  )!=SQLITE_OK) ){
eb20: 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  .      goto comm
eb30: 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  it_abort;.    }.
eb40: 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72    }.  rc = pager
eb50: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
eb60: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
eb70: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
eb80: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
eb90: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79  Jump here if any
eba0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
ebb0: 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
ebc0: 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  it process..  */
ebd0: 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20  .commit_abort:. 
ebe0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
ebf0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
ec00: 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
ec10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ec20: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
ec30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ec40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
ec50: 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
ec60: 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
ec70: 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 72 65 61  alls back to rea
ec80: 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a 20  d-only mode..** 
ec90: 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
eca0: 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
ecb0: 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
ecc0: 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
ecd0: 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
ece0: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
ecf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ed00: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
ed10: 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
ed20: 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
ed30: 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
ed40: 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
ed50: 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50  otocol (SQLITE_P
ed60: 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65  ROTOCOL) or unle
ed70: 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
ed80: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
ed90: 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
eda0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
edb0: 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
edc0: 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
edd0: 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
ede0: 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
edf0: 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
ee00: 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
ee10: 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
ee20: 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
ee30: 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
ee40: 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
ee50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ee60: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
ee70: 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
ee80: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
ee90: 72 63 3b 0a 20 20 54 52 41 43 45 31 28 22 52 4f  rc;.  TRACE1("RO
eea0: 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20 20 69 66  LLBACK\n");.  if
eeb0: 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
eec0: 46 69 6c 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  File || !pPager-
eed0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
eee0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
eef0: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
ef00: 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
ef10: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
ef20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
ef30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
ef40: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
ef50: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20 20  fined(NDEBUG).  
ef60: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
ef70: 6a 6f 75 72 6e 61 6c 20 74 6f 20 74 68 65 20 73  journal to the s
ef80: 69 7a 65 20 69 74 20 77 61 73 20 61 74 20 74 68  ize it was at th
ef90: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
efa0: 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 73 71  the.  ** last sq
efb0: 6c 69 74 65 4f 73 53 79 6e 63 28 29 20 63 61 6c  liteOsSync() cal
efc0: 6c 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  l.  This is real
efd0: 6c 79 20 61 6e 20 65 72 72 6f 72 20 63 68 65 63  ly an error chec
efe0: 6b 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  k.  If the.  ** 
eff0: 72 6f 6c 6c 62 61 63 6b 20 73 74 69 6c 6c 20 77  rollback still w
f000: 6f 72 6b 73 2c 20 69 74 20 6d 65 61 6e 73 20 74  orks, it means t
f010: 68 61 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hat the rollback
f020: 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 73 6f   would have also
f030: 0a 20 20 2a 2a 20 77 6f 72 6b 65 64 20 69 66 20  .  ** worked if 
f040: 69 74 20 68 61 64 20 6f 63 63 75 72 72 65 64 20  it had occurred 
f050: 61 66 74 65 72 20 61 6e 20 4f 53 20 63 72 61 73  after an OS cras
f060: 68 20 6f 72 20 75 6e 65 78 70 65 63 74 65 64 20  h or unexpected 
f070: 70 6f 77 65 72 0a 20 20 2a 2a 20 6c 6f 73 73 2e  power.  ** loss.
f080: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
f090: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
f0a0: 20 20 20 69 6e 74 20 6d 20 3d 20 4a 4f 55 52 4e     int m = JOURN
f0b0: 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61  AL_HDR_SZ(journa
f0c0: 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 61  l_format);.    a
f0d0: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
f0e0: 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
f0f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  if( pPager->sync
f100: 4a 53 69 7a 65 3c 6d 20 29 7b 0a 20 20 20 20 20  JSize<m ){.     
f110: 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 4a 53 69   pPager->syncJSi
f120: 7a 65 20 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20  ze = m;.    }.  
f130: 20 20 54 52 41 43 45 32 28 22 54 52 55 4e 43 41    TRACE2("TRUNCA
f140: 54 45 20 4a 4f 55 52 4e 41 4c 20 25 6c 6c 64 5c  TE JOURNAL %lld\
f150: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  n", pPager->sync
f160: 4a 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  JSize);.    rc =
f170: 20 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61    sqliteOsTrunca
f180: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
f190: 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 4a 53 69   pPager->syncJSi
f1a0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ze);.    if( rc 
f1b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
f1c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
f1d0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
f1e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
f1f0: 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
f200: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
f210: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
f220: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
f230: 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate>=SQLITE_WRIT
f240: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  ELOCK ){.      p
f250: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
f260: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
f270: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
f280: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
f290: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
f2a0: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57  >state!=SQLITE_W
f2b0: 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RITELOCK ){.    
f2c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f2d0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67  ;.  }.  rc = pag
f2e0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
f2f0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
f300: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f310: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
f320: 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  UPT;.    pPager-
f330: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
f340: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
f350: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
f360: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
f370: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f380: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
f390: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f3a0: 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
f3b0: 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
f3c0: 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
f3d0: 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
f3e0: 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
f3f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
f400: 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61  er_isreadonly(Pa
f410: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
f420: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
f430: 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
f440: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f450: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
f460: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
f470: 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
f480: 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74 73 28  litepager_stats(
f490: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
f4a0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
f4b0: 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
f4c0: 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
f4d0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
f4e0: 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
f4f0: 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
f500: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
f510: 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
f520: 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
f530: 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
f540: 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
f550: 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
f560: 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
f570: 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
f580: 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
f590: 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
f5a0: 2a 20 53 65 74 20 74 68 65 20 63 68 65 63 6b 70  * Set the checkp
f5b0: 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
f5c0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
f5d0: 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
f5e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
f5f0: 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
f600: 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63  * open.  A new c
f610: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
f620: 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
f630: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
f640: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
f650: 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
f660: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
f670: 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
f680: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
f690: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
f6a0: 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70  t_begin(Pager *p
f6b0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
f6c0: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
f6d0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
f6e0: 49 5a 45 5d 3b 0a 20 20 69 66 28 20 21 70 50 61  IZE];.  if( !pPa
f6f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
f700: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f710: 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  ckptAutoopen = 1
f720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
f730: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
f740: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f750: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61  urnalOpen );.  a
f760: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
f770: 63 6b 70 74 49 6e 55 73 65 20 29 3b 0a 20 20 70  ckptInUse );.  p
f780: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d  Pager->aInCkpt =
f790: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
f7a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
f7b0: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
f7c0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20  ger->aInCkpt==0 
f7d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52  ){.    sqliteOsR
f7e0: 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
f7f0: 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >fd);.    return
f800: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f810: 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
f820: 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  G.  rc = sqliteO
f830: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
f840: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
f850: 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >ckptJSize);.  i
f860: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70  f( rc ) goto ckp
f870: 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
f880: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f890: 2d 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 3d 20 0a  ->ckptJSize == .
f8a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
f8b0: 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a  *JOURNAL_PG_SZ(j
f8c0: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a  ournal_format)+J
f8d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f  OURNAL_HDR_SZ(jo
f8e0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b  urnal_format) );
f8f0: 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
f900: 2d 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 70 50  ->ckptJSize = pP
f910: 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e  ager->nRec*JOURN
f920: 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c  AL_PG_SZ(journal
f930: 5f 66 6f 72 6d 61 74 29 0a 20 20 20 20 20 20 20  _format).       
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f    + JOURNAL_HDR_
f960: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
f970: 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  t);.  pPager->ck
f980: 70 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ptSize = pPager-
f990: 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21  >dbSize;.  if( !
f9a0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e  pPager->ckptOpen
f9b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
f9c0: 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  itepager_opentem
f9d0: 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
f9e0: 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28  ->cpfd);.    if(
f9f0: 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f   rc ) goto ckpt_
fa00: 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
fa10: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70    pPager->ckptOp
fa20: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
fa30: 65 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30  er->ckptNRec = 0
fa40: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
fa50: 63 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  ckptInUse = 1;. 
fa60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fa70: 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f  K;. .ckpt_begin_
fa80: 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
fa90: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b  ager->aInCkpt ){
faa0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
fab0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29  pPager->aInCkpt)
fac0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
fad0: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nCkpt = 0;.  }. 
fae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
faf0: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68  *.** Commit a ch
fb00: 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  eckpoint..*/.int
fb10: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
fb20: 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
fb30: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
fb40: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
fb50: 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
fb60: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
fb70: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
fb80: 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a  ager->cpfd, 0);.
fb90: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 4f 73 54      /* sqliteOsT
fba0: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
fbb0: 3e 63 70 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >cpfd, 0); */.  
fbc0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52    pPager->ckptNR
fbd0: 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
fbe0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
fbf0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  0;.    sqliteFre
fc00: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  e( pPager->aInCk
fc10: 70 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pt );.    pPager
fc20: 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20  ->aInCkpt = 0;. 
fc30: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
fc40: 72 2d 3e 70 43 6b 70 74 3b 20 70 50 67 3b 20 70  r->pCkpt; pPg; p
fc50: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
fc60: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
fc70: 65 78 74 43 6b 70 74 3b 0a 20 20 20 20 20 20 61  extCkpt;.      a
fc80: 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 43 6b  ssert( pPg->inCk
fc90: 70 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  pt );.      pPg-
fca0: 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20  >inCkpt = 0;.   
fcb0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70     pPg->pPrevCkp
fcc0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  t = pPg->pNextCk
fcd0: 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pt = 0;.    }.  
fce0: 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20    pPager->pCkpt 
fcf0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
fd00: 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20  r->ckptAutoopen 
fd10: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
fd20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fd30: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 63 68 65  * Rollback a che
fd40: 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  ckpoint..*/.int 
fd50: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
fd60: 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
fd70: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
fd80: 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
fd90: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20  ->ckptInUse ){. 
fda0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 63 6b     rc = pager_ck
fdb0: 70 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  pt_playback(pPag
fdc0: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 70  er);.    sqlitep
fdd0: 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74  ager_ckpt_commit
fde0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
fdf0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
fe00: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
fe10: 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65  ger->ckptAutoope
fe20: 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
fe30: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
fe40: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
fe50: 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
fe60: 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
fe70: 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
fe80: 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
fe90: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
fea0: 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
feb0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
fec0: 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
fed0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
fee0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
fef0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
ff00: 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
ff10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69  ontinue;.    pri
ff20: 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
ff30: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
ff40: 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
ff50: 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47  g->pgno, (int)PG
ff60: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
ff70: 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
ff80: 7d 0a 7d 0a 23 65 6e 64 69 66 0a                 }.}.#endif.