/ Hex Artifact Content
Login

Artifact ca24fced1ca4c2b8ea519d5fe8ec69a2d846276f:


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 39 31  : pager.c,v 1.91
0350: 20 32 30 30 33 2f 31 32 2f 31 37 20 32 33 3a 35   2003/12/17 23:5
0360: 37 3a 33 35 20 64 72 68 20 45 78 70 20 24 0a 2a  7:35 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
10b0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
10e0: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
10f0: 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   */.  /* SQLITE_
1100: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
1110: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1120: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1130: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1140: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1150: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1160: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1170: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
1180: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1190: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
11a0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
11b0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
11c0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
11d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
11e0: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
11f0: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
1200: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
1210: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
1220: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
1230: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
1240: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
1250: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1260: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f  E_PAGE_SIZE])../
1270: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1280: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1290: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
12a0: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
12b0: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
12c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
12d0: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
12e0: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
12f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1300: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1310: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1320: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1330: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1340: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1350: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1360: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1370: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1380: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1390: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
13a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
13d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
13f0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1400: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
1410: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
1420: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
1430: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
1440: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73  al files */.  Os
1450: 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20  File fd, jfd;   
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1470: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
1480: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
1490: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69  ournal */.  OsFi
14a0: 6c 65 20 63 70 66 64 3b 20 20 20 20 20 20 20 20  le cpfd;        
14b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
14c0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
14d0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
14e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 64  urnal */.  int d
14f0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
1500: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1510: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1520: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
1530: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
1540: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
1550: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
1560: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
1570: 69 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20 20 20  int ckptSize;   
1580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1590: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
15a0: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 63 6b  (in pages) at ck
15b0: 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  pt_begin() */.  
15c0: 6f 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a 65 3b  off_t ckptJSize;
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15e0: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
15f0: 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a  t ckpt_begin() *
1600: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1630: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
1640: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1650: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
1660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
1670: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
1680: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
1690: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
16a0: 74 20 63 6b 70 74 4e 52 65 63 3b 20 20 20 20 20  t ckptNRec;     
16b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16c0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
16d0: 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  n the checkpoint
16e0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
16f0: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
1700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1710: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1720: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
1730: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69  ry page */.  voi
1740: 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29  d (*xDestructor)
1750: 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c  (void*); /* Call
1760: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
1770: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
1780: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
17b0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
17c0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ages */.  int nR
17d0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
17e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17f0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
1800: 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52  es with PgHdr.nR
1810: 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ef>0 */.  int mx
1820: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1830: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
1840: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1850: 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68   to hold in cach
1860: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c  e */.  int nHit,
1870: 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20   nMiss, nOvfl;  
1880: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
1890: 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c  , missing, and L
18a0: 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a  RU overflows */.
18b0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
18c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18d0: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
18e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18f0: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
1900: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
1910: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
1920: 72 75 65 20 69 66 20 69 6e 69 74 69 61 6c 20 6d  rue if initial m
1930: 61 67 69 63 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  agic of journal 
1940: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75  is synced */.  u
1950: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
1960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1970: 20 6e 6f 74 20 75 73 65 20 61 20 72 6f 6c 6c 62   not use a rollb
1980: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
1990: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
19a0: 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20 20 20   ckptOpen;      
19b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19c0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f  e if the checkpo
19d0: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  int journal is o
19e0: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  pen */.  u8 ckpt
19f0: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
1a00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
1a10: 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b 70 6f  are in a checkpo
1a20: 69 6e 74 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  int */.  u8 ckpt
1a30: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
1a40: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6b 70       /* Open ckp
1a50: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
1a60: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
1a70: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
1a80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1a90: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1aa0: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1ab0: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
1ac0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
1ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1ae0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
1af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1b00: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
1b10: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
1b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
1b30: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52 45  LITE_UNLOCK, _RE
1b40: 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54 45  ADLOCK or _WRITE
1b50: 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65 72 72  LOCK */.  u8 err
1b60: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1b70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
1b80: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
1b90: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20   errors */.  u8 
1ba0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
1bc0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
1bd0: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
1be0: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
1bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c00: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
1c10: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
1c20: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c40: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
1c50: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
1c60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1c70: 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b 20 20   u8 dirtyFile;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c90: 54 72 75 65 20 69 66 20 64 61 74 61 62 61 73 65  True if database
1ca0: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
1cb0: 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a 2f 0a  d in any way */.
1cc0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
1cd0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
1ce0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
1cf0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
1d00: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 2a   pages */.  u8 *
1d10: 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  aInJournal;     
1d20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
1d30: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
1d40: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d50: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61   file */.  u8 *a
1d60: 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20  InCkpt;         
1d70: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
1d80: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
1d90: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1da0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
1db0: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
1dc0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
1dd0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
1de0: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
1df0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1e00: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
1e10: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
1e20: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
1e30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1e40: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
1e50: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
1e60: 64 72 20 2a 70 43 6b 70 74 3b 20 20 20 20 20 20  dr *pCkpt;      
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1e80: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1e90: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
1ea0: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
1eb0: 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d  aHash[N_PG_HASH]
1ec0: 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ;    /* Hash tab
1ed0: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
1ee0: 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72 20 2a  umber of PgHdr *
1ef0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  /.};../*.** Thes
1f00: 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20  e are bits that 
1f10: 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61  can be set in Pa
1f20: 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a  ger.errMask..*/.
1f30: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
1f40: 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20  R_FULL     0x01 
1f50: 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61   /* a write() fa
1f60: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
1f70: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20  PAGER_ERR_MEM   
1f80: 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c     0x02  /* mall
1f90: 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  oc() failed */.#
1fa0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
1fb0: 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20  _LOCK     0x04  
1fc0: 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  /* error in the 
1fd0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
1fe0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1ff0: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30  R_ERR_CORRUPT  0
2000: 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65  x08  /* database
2010: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   or journal corr
2020: 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e  uption */.#defin
2030: 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  e PAGER_ERR_DISK
2040: 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65       0x10  /* ge
2050: 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65  neral disk I/O e
2060: 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20  rror - bad hard 
2070: 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  drive? */../*.**
2080: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2090: 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 20  e contains page 
20a0: 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 66  records in the f
20b0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d  ollowing.** form
20c0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c  at..**.** Actual
20d0: 6c 79 2c 20 74 68 69 73 20 73 74 72 75 63 74 75  ly, this structu
20e0: 72 65 20 69 73 20 74 68 65 20 63 6f 6d 70 6c 65  re is the comple
20f0: 74 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 66  te page record f
2100: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66 6f 72 6d  or pager.** form
2110: 61 74 73 20 6c 65 73 73 20 74 68 61 6e 20 33 2e  ats less than 3.
2120: 20 20 42 65 67 69 6e 6e 69 6e 67 20 77 69 74 68    Beginning with
2130: 20 66 6f 72 6d 61 74 20 33 2c 20 74 68 69 73 20   format 3, this 
2140: 72 65 63 6f 72 64 20 69 73 20 73 75 72 72 6f 75  record is surrou
2150: 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77 6f 20 63  nded.** by two c
2160: 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74 79 70  hecksums..*/.typ
2170: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
2180: 52 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72  Record PageRecor
2190: 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65  d;.struct PageRe
21a0: 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67  cord {.  Pgno pg
21b0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
21c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
21d0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
21e0: 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54  char aData[SQLIT
21f0: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f  E_PAGE_SIZE];  /
2200: 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  * Original data 
2210: 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f  for page pgno */
2220: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  .};../*.** Journ
2230: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
2240: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
2250: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
2260: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
2270: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
2280: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
2290: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
22a0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
22b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
22c0: 74 68 72 65 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  three journal fo
22d0: 72 6d 61 74 73 20 28 73 6f 20 66 61 72 29 2e 20  rmats (so far). 
22e0: 54 68 65 20 31 73 74 20 6a 6f 75 72 6e 61 6c 20  The 1st journal 
22f0: 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a 2a 2a  format writes.**
2300: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73   32-bit integers
2310: 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f 72 64   in the byte-ord
2320: 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74 20 6d  er of the host m
2330: 61 63 68 69 6e 65 2e 20 20 4e 65 77 0a 2a 2a 20  achine.  New.** 
2340: 66 6f 72 6d 61 74 73 20 77 72 69 74 65 73 20 69  formats writes i
2350: 6e 74 65 67 65 72 73 20 61 73 20 62 69 67 2d 65  ntegers as big-e
2360: 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65 77 20  ndian.  All new 
2370: 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74 68 65  journals use the
2380: 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74 2c 20  .** new format, 
2390: 62 75 74 20 77 65 20 68 61 76 65 20 74 6f 20 62  but we have to b
23a0: 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 61  e able to read a
23b0: 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c 20  n older journal 
23c0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 72  in order.** to r
23d0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 73  ollback journals
23e0: 20 63 72 65 61 74 65 64 20 62 79 20 6f 6c 64 65   created by olde
23f0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  r versions of th
2400: 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a  e library..**.**
2410: 20 54 68 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c   The 3rd journal
2420: 20 66 6f 72 6d 61 74 20 28 61 64 64 65 64 20 66   format (added f
2430: 6f 72 20 32 2e 38 2e 30 29 20 61 64 64 73 20 61  or 2.8.0) adds a
2440: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
2450: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
2460: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
2470: 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 65  journal.  If the
2480: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
2490: 6c 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  le the.** journa
24a0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
24b0: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
24c0: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
24d0: 68 74 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20  ht appear in.** 
24e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
24f0: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
2500: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
2510: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
2520: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
2530: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
2540: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
2550: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
2560: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
2570: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
2580: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
2590: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
25a0: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
25b0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
25c0: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
25d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
25e0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
25f0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
2600: 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   3rd journal for
2610: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
2620: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
2630: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
2640: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
2650: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
2660: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
2670: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
2680: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
2690: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
26a0: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
26b0: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
26c0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
26d0: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
26e0: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
26f0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
2700: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
2710: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
2720: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
2730: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
2740: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
2750: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
2760: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
2770: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
2780: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
2790: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
27a0: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
27b0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
27c0: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
27d0: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
27e0: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
27f0: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
2800: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
2810: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
2820: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
2830: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
2840: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
2850: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
2860: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
2870: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
2880: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
2890: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
28a0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
28b0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
28c0: 72 6e 61 6c 4d 61 67 69 63 31 5b 5d 20 3d 20 7b  rnalMagic1[] = {
28d0: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
28e0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
28f0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
2900: 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63 6f 6e  4,.};.static con
2910: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2920: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32 5b   aJournalMagic2[
2930: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
2940: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
2950: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
2960: 2c 20 30 78 64 35 2c 0a 7d 3b 0a 73 74 61 74 69  , 0xd5,.};.stati
2970: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
2980: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
2990: 67 69 63 33 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  gic3[] = {.  0xd
29a0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
29b0: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
29c0: 20 30 78 36 33 2c 20 30 78 64 36 2c 0a 7d 3b 0a   0x63, 0xd6,.};.
29d0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
29e0: 46 4f 52 4d 41 54 5f 31 20 31 0a 23 64 65 66 69  FORMAT_1 1.#defi
29f0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  ne JOURNAL_FORMA
2a00: 54 5f 32 20 32 0a 23 64 65 66 69 6e 65 20 4a 4f  T_2 2.#define JO
2a10: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 33  URNAL_FORMAT_3 3
2a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2a30: 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20 64 65  owing integer de
2a40: 74 65 72 6d 69 6e 65 73 20 77 68 61 74 20 66 6f  termines what fo
2a50: 72 6d 61 74 20 74 6f 20 75 73 65 20 77 68 65 6e  rmat to use when
2a60: 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20 6e 65 77   creating.** new
2a70: 20 70 72 69 6d 61 72 79 20 6a 6f 75 72 6e 61 6c   primary journal
2a80: 20 66 69 6c 65 73 2e 20 20 42 79 20 64 65 66 61   files.  By defa
2a90: 75 6c 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  ult we always us
2aa0: 65 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a 20 57  e format 3..** W
2ab0: 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 77 65 20  hen testing, we 
2ac0: 63 61 6e 20 73 65 74 20 74 68 69 73 20 76 61 6c  can set this val
2ad0: 75 65 20 74 6f 20 6f 6c 64 65 72 20 6a 6f 75 72  ue to older jour
2ae0: 6e 61 6c 20 66 6f 72 6d 61 74 73 20 69 6e 20 6f  nal formats in o
2af0: 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  rder to.** make 
2b00: 73 75 72 65 20 74 68 61 74 20 6e 65 77 65 72 20  sure that newer 
2b10: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
2b20: 6c 69 62 72 61 72 79 20 61 72 65 20 61 62 6c 65  library are able
2b30: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 6c 64   to rollback old
2b40: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
2b50: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  les..**.** Note 
2b60: 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 20  that checkpoint 
2b70: 6a 6f 75 72 6e 61 6c 73 20 61 6c 77 61 79 73 20  journals always 
2b80: 75 73 65 20 66 6f 72 6d 61 74 20 32 20 61 6e 64  use format 2 and
2b90: 20 6f 6d 69 74 20 74 68 65 20 68 65 61 64 65 72   omit the header
2ba0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2bb0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 6a 6f 75 72  TE_TEST.int jour
2bc0: 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d 20 33 3b 0a  nal_format = 3;.
2bd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a  #else.# define j
2be0: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 33 0a  ournal_format 3.
2bf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2c00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
2c10: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
2c20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
2c30: 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63 63 6f  rnal varies acco
2c40: 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68 69 63  rding.** to whic
2c50: 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  h journal format
2c60: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
2c70: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
2c80: 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f 75 74  acros figure out
2c90: 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20 62 61  .** the sizes ba
2ca0: 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20 6e 75  sed on format nu
2cb0: 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  mbers..*/.#defin
2cc0: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
2cd0: 28 58 29 20 5c 0a 20 20 20 28 73 69 7a 65 6f 66  (X) \.   (sizeof
2ce0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29  (aJournalMagic1)
2cf0: 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20   + sizeof(Pgno) 
2d00: 2b 20 28 28 58 29 3e 3d 33 29 2a 32 2a 73 69 7a  + ((X)>=3)*2*siz
2d10: 65 6f 66 28 75 33 32 29 29 0a 23 64 65 66 69 6e  eof(u32)).#defin
2d20: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
2d30: 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54 45 5f  X) \.   (SQLITE_
2d40: 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69 7a 65  PAGE_SIZE + size
2d50: 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58 29 3e  of(Pgno) + ((X)>
2d60: 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32 29 29  =3)*sizeof(u32))
2d70: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
2d80: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
2d90: 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a 2a 2f  racking here:.*/
2da0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2db0: 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72 5f  EST.  int pager_
2dc0: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
2dd0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
2de0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
2df0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
2e00: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
2e10: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
2e20: 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  r_refinfo_enable
2e30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
2e40: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
2e50: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
2e60: 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e  0x%08x nRef=%d\n
2e70: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
2e80: 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f  o, (int)PGHDR_TO
2e90: 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65  _DATA(p), p->nRe
2ea0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
2eb0: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
2ec0: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
2ed0: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
2ee0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
2ef0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
2f00: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
2f10: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
2f20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2f30: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
2f40: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
2f50: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
2f60: 74 6f 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tor.*/.static in
2f70: 74 20 72 65 61 64 33 32 62 69 74 73 28 69 6e 74  t read32bits(int
2f80: 20 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c 65 20   format, OsFile 
2f90: 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  *fd, u32 *pRes){
2fa0: 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e  .  u32 res;.  in
2fb0: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
2fc0: 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20 26 72  iteOsRead(fd, &r
2fd0: 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29  es, sizeof(res))
2fe0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ff0: 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61 74 3e  TE_OK && format>
3000: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31  JOURNAL_FORMAT_1
3010: 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   ){.    unsigned
3020: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20   char ac[4];.   
3030: 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73   memcpy(ac, &res
3040: 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  , 4);.    res = 
3050: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
3060: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
3070: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
3080: 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65    }.  *pRes = re
3090: 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  s;.  return rc;.
30a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
30b0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
30c0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
30d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
30e0: 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73 20 61   Writing.** is a
30f0: 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69 6e 67  lways done using
3100: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
3110: 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74   format..*/.stat
3120: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
3130: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
3140: 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67  32 val){.  unsig
3150: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
3160: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
3170: 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 72  rmat<=1 ){.    r
3180: 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73 57 72  eturn sqliteOsWr
3190: 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20 34 29  ite(fd, &val, 4)
31a0: 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d 20  ;.  }.  ac[0] = 
31b0: 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66  (val>>24) & 0xff
31c0: 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c  ;.  ac[1] = (val
31d0: 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20  >>16) & 0xff;.  
31e0: 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29  ac[2] = (val>>8)
31f0: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d   & 0xff;.  ac[3]
3200: 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20   = val & 0xff;. 
3210: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73   return sqliteOs
3220: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29  Write(fd, ac, 4)
3230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3240: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3250: 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20 68 65  r into a page he
3260: 61 64 65 72 20 72 69 67 68 74 20 62 65 66 6f 72  ader right befor
3270: 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  e the.** page da
3280: 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6f  ta.  This will o
3290: 76 65 72 77 72 69 74 65 20 74 68 65 20 50 67 48  verwrite the PgH
32a0: 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
32b0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
32c0: 64 20 73 74 6f 72 65 33 32 62 69 74 73 28 75 33  d store32bits(u3
32d0: 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c  2 val, PgHdr *p,
32e0: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
32f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3300: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
3310: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
3320: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
3330: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 6a 6f 75  fset];.  if( jou
3340: 72 6e 61 6c 5f 66 6f 72 6d 61 74 3c 3d 31 20 29  rnal_format<=1 )
3350: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c  {.    memcpy(ac,
3360: 20 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d 65 6c   &val, 4);.  }el
3370: 73 65 7b 0a 20 20 20 20 61 63 5b 30 5d 20 3d 20  se{.    ac[0] = 
3380: 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66  (val>>24) & 0xff
3390: 3b 0a 20 20 20 20 61 63 5b 31 5d 20 3d 20 28 76  ;.    ac[1] = (v
33a0: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
33b0: 20 20 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c      ac[2] = (val
33c0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 20  >>8) & 0xff;.   
33d0: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
33e0: 78 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  xff;.  }.}.../*.
33f0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62  ** Convert the b
3400: 69 74 73 20 69 6e 20 74 68 65 20 70 50 61 67 65  its in the pPage
3410: 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20  r->errMask into 
3420: 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a  an approprate.**
3430: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f   return code..*/
3440: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3450: 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72 20  r_errcode(Pager 
3460: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
3470: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3480: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
3490: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
34a0: 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d  R_LOCK )    rc =
34b0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
34c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
34d0: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
34e0: 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63  ERR_DISK )    rc
34f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
3500: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
3510: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
3520: 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20  RR_FULL )    rc 
3530: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
3540: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
3550: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
3560: 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20  _MEM )     rc = 
3570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3580: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3590: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
35a0: 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20 53  CORRUPT ) rc = S
35b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
35c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35d0: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
35e0: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
35f0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
3600: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
3610: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   the.** checkpoi
3620: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
3630: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
3640: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
3650: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
3660: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
3670: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 70 6f 69  .** the checkpoi
3680: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69  nt journal.  Thi
3690: 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69  s helps the sqli
36a0: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d  tepager_ckpt_com
36b0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
36c0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
36d0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
36e0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
36f0: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
3700: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
3710: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
3720: 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  in the checkpoin
3730: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
3740: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
3750: 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28  dd_to_ckpt_list(
3760: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
3770: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
3780: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
3790: 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 20  ( pPg->inCkpt ) 
37a0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
37b0: 28 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74  ( pPg->pPrevCkpt
37c0: 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78  ==0 && pPg->pNex
37d0: 74 43 6b 70 74 3d 3d 30 20 29 3b 0a 20 20 70 50  tCkpt==0 );.  pP
37e0: 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30  g->pPrevCkpt = 0
37f0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
3800: 70 43 6b 70 74 20 29 7b 0a 20 20 20 20 70 50 61  pCkpt ){.    pPa
3810: 67 65 72 2d 3e 70 43 6b 70 74 2d 3e 70 50 72 65  ger->pCkpt->pPre
3820: 76 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20 20 7d  vCkpt = pPg;.  }
3830: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70  .  pPg->pNextCkp
3840: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 43 6b 70  t = pPager->pCkp
3850: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6b  t;.  pPager->pCk
3860: 70 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  pt = pPg;.  pPg-
3870: 3e 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 7d 0a 73  >inCkpt = 1;.}.s
3880: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
3890: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70 74  remove_from_ckpt
38a0: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
38b0: 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  ){.  if( !pPg->i
38c0: 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b 0a  nCkpt ) return;.
38d0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
38e0: 43 6b 70 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Ckpt ){.    asse
38f0: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 43 6b  rt( pPg->pPrevCk
3900: 70 74 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d 70  pt->pNextCkpt==p
3910: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
3920: 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78 74 43  PrevCkpt->pNextC
3930: 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  kpt = pPg->pNext
3940: 43 6b 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Ckpt;.  }else{. 
3950: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
3960: 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 3d 3d 70  pPager->pCkpt==p
3970: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
3980: 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70  Pager->pCkpt = p
3990: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20  Pg->pNextCkpt;. 
39a0: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
39b0: 65 78 74 43 6b 70 74 20 29 7b 0a 20 20 20 20 61  extCkpt ){.    a
39c0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
39d0: 74 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74  tCkpt->pPrevCkpt
39e0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
39f0: 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70 50 72  ->pNextCkpt->pPr
3a00: 65 76 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 50  evCkpt = pPg->pP
3a10: 72 65 76 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 70  revCkpt;.  }.  p
3a20: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20  Pg->pNextCkpt = 
3a30: 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 43  0;.  pPg->pPrevC
3a40: 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  kpt = 0;.  pPg->
3a50: 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  inCkpt = 0;.}../
3a60: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
3a70: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
3a80: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
3a90: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
3aa0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
3ab0: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
3ac0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
3ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
3ae0: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
3af0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
3b00: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
3b10: 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  r *p = pPager->a
3b20: 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
3b30: 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28  pgno)];.  while(
3b40: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
3b50: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
3b60: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
3b70: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3b80: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
3b90: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
3ba0: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
3bb0: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
3bc0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
3bd0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
3be0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
3bf0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
3c00: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
3c10: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
3c20: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
3c30: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
3c40: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
3c50: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
3c60: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
3c70: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
3c80: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
3c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3ca0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
3cb0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
3cc0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
3cd0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
3ce0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
3cf0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
3d00: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
3d10: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
3d20: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
3d30: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
3d40: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
3d50: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
3d60: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
3d70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
3d80: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  pAll = 0;.  mems
3d90: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
3da0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
3db0: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70  er->aHash));.  p
3dc0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
3dd0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
3de0: 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52  state>=SQLITE_WR
3df0: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  ITELOCK ){.    s
3e00: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
3e10: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
3e20: 0a 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63  .  sqliteOsUnloc
3e30: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
3e40: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
3e50: 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b  = SQLITE_UNLOCK;
3e60: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
3e70: 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72  e = -1;.  pPager
3e80: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73  ->nRef = 0;.  as
3e90: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
3ea0: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
3eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
3ec0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3ed0: 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
3ee0: 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  has the journal 
3ef0: 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a  file open and.**
3f00: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
3f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
3f20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c  This routine rel
3f30: 65 61 73 65 73 20 74 68 65 20 64 61 74 61 62 61  eases the databa
3f40: 73 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  se.** write lock
3f50: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
3f60: 72 65 61 64 20 6c 6f 63 6b 20 69 6e 20 69 74 73  read lock in its
3f70: 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75   place.  The jou
3f80: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
3f90: 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73  deleted and clos
3fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
3fb0: 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67  Consider keeping
3fc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3fd0: 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f  e open for tempo
3fe0: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  rary databases..
3ff0: 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69  ** This might gi
4000: 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
4010: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20   improvement on 
4020: 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70  windows where op
4030: 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20  ening.** a file 
4040: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
4050: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
4060: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
4070: 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72  nwritelock(Pager
4080: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
4090: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
40a0: 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  g;.  if( pPager-
40b0: 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f 57 52  >state<SQLITE_WR
40c0: 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e  ITELOCK ) return
40d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
40e0: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63  litepager_ckpt_c
40f0: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
4100: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
4110: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
4120: 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  iteOsClose(&pPag
4130: 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 70  er->cpfd);.    p
4140: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
4150: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
4160: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
4170: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
4180: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
4190: 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  >jfd);.    pPage
41a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
41b0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73   0;.    sqliteOs
41c0: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
41d0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
41e0: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
41f0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
4200: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
4210: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
4220: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
4230: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
4240: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
4250: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
4260: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
4270: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
4280: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
4290: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
42a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
42b0: 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
42c0: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  File==0 || pPage
42d0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
42e0: 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   );.  }.  rc = s
42f0: 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28  qliteOsReadLock(
4300: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
4310: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4320: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
4330: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
4340: 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  READLOCK;.  }els
4350: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
4360: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
4370: 66 20 61 20 70 72 6f 63 65 73 73 20 64 6f 65 73  f a process does
4380: 20 61 20 42 45 47 49 4e 2c 20 74 68 65 6e 20 66   a BEGIN, then f
4390: 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a 20 20 20  orks and the.   
43a0: 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63 65 73   ** child proces
43b0: 73 20 64 6f 65 73 20 74 68 65 20 43 4f 4d 4d 49  s does the COMMI
43c0: 54 2e 20 20 42 65 63 61 75 73 65 20 6f 66 20 74  T.  Because of t
43d0: 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20  he semantics of 
43e0: 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69 6c 65  unix.    ** file
43f0: 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20 75 6e   locking, the un
4400: 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c 2e 0a  lock will fail..
4410: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
4420: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
4430: 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  E_UNLOCK;.  }.  
4440: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4450: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
4460: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
4470: 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f  m for the page o
4480: 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  f data..*/.stati
4490: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
44a0: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
44b0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73   Pgno pgno, cons
44c0: 74 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a  t char *aData){.
44d0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
44e0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
44f0: 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  + pgno;.  return
4500: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
4510: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
4520: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
4530: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
4540: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
4550: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
4560: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
4570: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  age..**.** There
4580: 20 61 72 65 20 74 68 72 65 65 20 64 69 66 66 65   are three diffe
4590: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  rent journal for
45a0: 6d 61 74 73 2e 20 20 54 68 65 20 66 6f 72 6d 61  mats.  The forma
45b0: 74 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  t parameter dete
45c0: 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 69 63 68 20  rmines.** which 
45d0: 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64 20 62  format is used b
45e0: 79 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  y the journal th
45f0: 61 74 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  at is played bac
4600: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
4610: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
4620: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
4630: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
4640: 6a 66 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29  jfd, int format)
4650: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
4660: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
4670: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
4680: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
4690: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 61 67  e cache */.  Pag
46a0: 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b 0a 20  eRecord pgRec;. 
46b0: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 0a 20 20 72   u32 cksum;..  r
46c0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
46d0: 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 70 67 52  ormat, jfd, &pgR
46e0: 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  ec.pgno);.  if( 
46f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
4700: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
4710: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 6a  = sqliteOsRead(j
4720: 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61 74 61  fd, &pgRec.aData
4730: 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63 2e 61  , sizeof(pgRec.a
4740: 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 72 63  Data));.  if( rc
4750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
4760: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 53  turn rc;..  /* S
4770: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
4780: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
4790: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
47a0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
47b0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
47c0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
47d0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
47e0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
47f0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
4800: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
4810: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
4820: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
4830: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
4840: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
4850: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
4860: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
4870: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
4880: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
4890: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
48a0: 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20 29 7b  pgRec.pgno==0 ){
48b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
48c0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
48d0: 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e 28 75  f( pgRec.pgno>(u
48e0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
48f0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
4900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4910: 20 20 7d 0a 20 20 69 66 28 20 66 6f 72 6d 61 74    }.  if( format
4920: 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  >=JOURNAL_FORMAT
4930: 5f 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  _3 ){.    rc = r
4940: 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74  ead32bits(format
4950: 2c 20 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  , jfd, &cksum);.
4960: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
4970: 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
4980: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
4990: 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 2c 20  er, pgRec.pgno, 
49a0: 70 67 52 65 63 2e 61 44 61 74 61 29 21 3d 63 6b  pgRec.aData)!=ck
49b0: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
49c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
49d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
49e0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70 61   Playback the pa
49f0: 67 65 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ge.  Update the 
4a00: 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f  in-memory copy o
4a10: 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  f the page.  ** 
4a20: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
4a30: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
4a40: 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  e..  */.  pPg = 
4a50: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
4a60: 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29  ger, pgRec.pgno)
4a70: 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41 59  ;.  TRACE2("PLAY
4a80: 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 67 52 65  BACK %d\n", pgRe
4a90: 63 2e 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74  c.pgno);.  sqlit
4aa0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
4ab0: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
4ac0: 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54  -1)*(off_t)SQLIT
4ad0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
4ae0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
4af0: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
4b00: 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c  pgRec.aData, SQL
4b10: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
4b20: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
4b30: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
4b40: 6c 64 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65  ld ever be rolle
4b50: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
4b60: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f  n use, except fo
4b70: 72 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20  r page.    ** 1 
4b80: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
4b90: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
4ba0: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
4bb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
4bc0: 20 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20     ** active..  
4bd0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
4be0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
4bf0: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
4c00: 0a 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44  .    memcpy(PGHD
4c10: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
4c20: 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c  pgRec.aData, SQL
4c30: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
4c40: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
4c50: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
4c60: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
4c70: 61 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72  a);.    pPg->dir
4c80: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
4c90: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
4ca0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
4cc0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
4cd0: 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
4ce0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4cf0: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
4d00: 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
4d10: 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
4d20: 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
4d30: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
4d40: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
4d50: 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20 54 68 65  as follows:  The
4d60: 72 65 20 69 73 20 61 6e 20 69 6e 69 74 69 61 6c  re is an initial
4d70: 0a 2a 2a 20 66 69 6c 65 2d 74 79 70 65 20 73 74  .** file-type st
4d80: 72 69 6e 67 20 66 6f 72 20 73 61 6e 69 74 79 20  ring for sanity 
4d90: 63 68 65 63 6b 69 6e 67 2e 20 20 54 68 65 6e 20  checking.  Then 
4da0: 74 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  there is a singl
4db0: 65 0a 2a 2a 20 50 67 6e 6f 20 6e 75 6d 62 65 72  e.** Pgno number
4dc0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
4dd0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4de0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
4df0: 66 6f 72 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20  fore.** changes 
4e00: 77 65 72 65 20 6d 61 64 65 2e 20 20 54 68 65 20  were made.  The 
4e10: 64 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e  database is trun
4e20: 63 61 74 65 64 20 74 6f 20 74 68 69 73 20 73 69  cated to this si
4e30: 7a 65 2e 0a 2a 2a 20 4e 65 78 74 20 63 6f 6d 65  ze..** Next come
4e40: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   zero or more pa
4e50: 67 65 20 72 65 63 6f 72 64 73 20 77 68 65 72 65  ge records where
4e60: 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72   each page recor
4e70: 64 0a 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66  d.** consists of
4e80: 20 61 20 50 67 6e 6f 20 61 6e 64 20 53 51 4c 49   a Pgno and SQLI
4e90: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74  TE_PAGE_SIZE byt
4ea0: 65 73 20 6f 66 20 64 61 74 61 2e 20 20 53 65 65  es of data.  See
4eb0: 0a 2a 2a 20 74 68 65 20 50 61 67 65 52 65 63 6f  .** the PageReco
4ec0: 72 64 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  rd structure for
4ed0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
4ee0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
4ef0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
4f00: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
4f10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
4f20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 61 73 20  ournal file (as 
4f30: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f  determined by lo
4f40: 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 6d 61 67  oking at the mag
4f50: 69 63 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20  ic number.** at 
4f60: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 29 20 74  the beginning) t
4f70: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4f80: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4f90: 50 52 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20  PROTOCOL..** If 
4fa0: 61 6e 79 20 6f 74 68 65 72 20 65 72 72 6f 72 73  any other errors
4fb0: 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 70 6c   occur during pl
4fc0: 61 79 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  ayback, the data
4fd0: 62 61 73 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b  base will.** lik
4fe0: 65 6c 79 20 62 65 20 63 6f 72 72 75 70 74 65 64  ely be corrupted
4ff0: 2c 20 73 6f 20 74 68 65 20 50 41 47 45 52 5f 45  , so the PAGER_E
5000: 52 52 5f 43 4f 52 52 55 50 54 20 62 69 74 20 69  RR_CORRUPT bit i
5010: 73 20 73 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67  s set in.** pPag
5020: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20  er->errMask and 
5030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
5040: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
5050: 69 74 20 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c  it all.** works,
5060: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
5070: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
5080: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
5090: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
50a0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
50b0: 2c 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c  , int useJournal
50c0: 53 69 7a 65 29 7b 0a 20 20 6f 66 66 5f 74 20 73  Size){.  off_t s
50d0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
50e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
50f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
5100: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
5110: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
5120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5130: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
5140: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
5150: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5160: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5170: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
5180: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
5190: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
51a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
51b0: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
51c0: 69 6e 74 20 66 6f 72 6d 61 74 3b 20 20 20 20 20  int format;     
51d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d           /* Form
51e0: 61 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  at of the journa
51f0: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 75 6e 73  l file. */.  uns
5200: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
5210: 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  c[sizeof(aJourna
5220: 6c 4d 61 67 69 63 31 29 5d 3b 0a 20 20 69 6e 74  lMagic1)];.  int
5230: 20 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72   rc;..  /* Figur
5240: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
5250: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
5260: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
5270: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
5280: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
5290: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
52a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
52b0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
52c0: 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67  liteOsSeek(&pPag
52d0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72  er->jfd, 0);.  r
52e0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
52f0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
5300: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
5310: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5320: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
5330: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  ayback;.  }.  if
5340: 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28 61  ( szJ < sizeof(a
5350: 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67  Magic)+sizeof(Pg
5360: 6e 6f 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  no) ){.    goto 
5370: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
5380: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
5390: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
53a0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72  e journal and tr
53b0: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
53c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
53d0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
53e0: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
53f0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61  rc = sqliteOsRea
5400: 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  d(&pPager->jfd, 
5410: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
5420: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
5430: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
5440: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5450: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f  PROTOCOL;.    go
5460: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
5470: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d  .  }.  if( memcm
5480: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
5490: 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66  alMagic3, sizeof
54a0: 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a  (aMagic))==0 ){.
54b0: 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55      format = JOU
54c0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 3b 0a 20  RNAL_FORMAT_3;. 
54d0: 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d   }else if( memcm
54e0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
54f0: 61 6c 4d 61 67 69 63 32 2c 20 73 69 7a 65 6f 66  alMagic2, sizeof
5500: 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a  (aMagic))==0 ){.
5510: 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55      format = JOU
5520: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 3b 0a 20  RNAL_FORMAT_2;. 
5530: 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d   }else if( memcm
5540: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
5550: 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66  alMagic1, sizeof
5560: 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a  (aMagic))==0 ){.
5570: 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55      format = JOU
5580: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 3b 0a 20  RNAL_FORMAT_1;. 
5590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
55a0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
55b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
55c0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69  layback;.  }.  i
55d0: 66 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e  f( format>=JOURN
55e0: 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20  AL_FORMAT_3 ){. 
55f0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
5600: 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67  ts(format, &pPag
5610: 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b  er->jfd, &nRec);
5620: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
5630: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
5640: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
5650: 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50  bits(format, &pP
5660: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
5670: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
5680: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
5690: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
56a0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
56b0: 66 66 66 66 66 66 66 66 20 7c 7c 20 75 73 65 4a  ffffffff || useJ
56c0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
56d0: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
56e0: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
56f0: 28 33 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  (3))/JOURNAL_PG_
5700: 53 5a 28 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  SZ(3);.    }.  }
5710: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 63 20 3d  else{.    nRec =
5720: 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
5730: 48 44 52 5f 53 5a 28 32 29 29 2f 4a 4f 55 52 4e  HDR_SZ(2))/JOURN
5740: 41 4c 5f 50 47 5f 53 5a 28 32 29 3b 0a 20 20 20  AL_PG_SZ(2);.   
5750: 20 61 73 73 65 72 74 28 20 6e 52 65 63 2a 4a 4f   assert( nRec*JO
5760: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 32 29 2b 4a  URNAL_PG_SZ(2)+J
5770: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32 29  OURNAL_HDR_SZ(2)
5780: 3d 3d 73 7a 4a 20 29 3b 0a 20 20 7d 0a 20 20 72  ==szJ );.  }.  r
5790: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
57a0: 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e  ormat, &pPager->
57b0: 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69  jfd, &mxPg);.  i
57c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
57d0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
57e0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
57f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
5800: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
5810: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
5820: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
5830: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75  rc = sqliteOsTru
5840: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
5850: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
5860: 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29  IZE*(off_t)mxPg)
5870: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
5890: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
58a0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
58b0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a  Size = mxPg;.  .
58c0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
58d0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
58e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
58f0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
5900: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
5910: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
5920: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Rec; i++){.    r
5930: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
5940: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
5950: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
5960: 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69  , format);.    i
5970: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5980: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
5990: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
59a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
59b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
59c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
59d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61    }.  }..  /* Pa
59e0: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
59f0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
5a00: 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65  e journal but ne
5a10: 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  ver synced.  ** 
5a20: 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72  where not restor
5a30: 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
5a40: 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74  bove.  We have t
5a50: 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a  o restore those.
5a60: 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65    ** pages by re
5a70: 61 64 69 6e 67 20 74 68 65 20 62 61 63 6b 20 66  ading the back f
5a80: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
5a90: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
5aa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5ab0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
5ac0: 20 2a 70 50 67 3b 0a 20 20 20 20 66 6f 72 28 70   *pPg;.    for(p
5ad0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
5ae0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
5af0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
5b00: 63 68 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45  char zBuf[SQLITE
5b10: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20  _PAGE_SIZE];.   
5b20: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
5b30: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
5b40: 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
5b50: 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
5b60: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
5b70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f  .        sqliteO
5b80: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
5b90: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
5ba0: 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50 67 2d  IZE*(off_t)(pPg-
5bb0: 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20  >pgno-1));.     
5bc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
5bd0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
5be0: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
5bf0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
5c00: 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
5c10: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
5c20: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a          memset(z
5c30: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Buf, 0, SQLITE_P
5c40: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
5c50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
5c60: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d  ->nRef==0 || mem
5c70: 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f  cmp(zBuf, PGHDR_
5c80: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
5c90: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 20  LITE_PAGE_SIZE) 
5ca0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
5cb0: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
5cc0: 70 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49  pPg), zBuf, SQLI
5cd0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
5ce0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
5cf0: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
5d00: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
5d10: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
5d20: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
5d30: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  nc = 0;.      pP
5d40: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
5d50: 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61    }.  }..end_pla
5d60: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21  yback:.  if( rc!
5d70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5d80: 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c    pager_unwritel
5d90: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
5da0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
5db0: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
5dc0: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
5dd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
5de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
5df0: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
5e00: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
5e10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5e20: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
5e30: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
5e40: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
5e50: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
5e60: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
5e70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
5e80: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
5e90: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
5ea0: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
5eb0: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
5ec0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
5ed0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
5ee0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
5ef0: 20 20 20 20 20 20 20 20 74 68 65 20 63 68 65 63          the chec
5f00: 6b 70 6f 69 6e 74 20 69 73 20 73 74 6f 72 65 64  kpoint is stored
5f10: 20 69 6e 20 70 50 61 67 65 72 2d 3e 63 6b 70 74   in pPager->ckpt
5f20: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
5f30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
5f40: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
5f50: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
5f60: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
5f70: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 63  aying back the c
5f80: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
5f90: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
5fa0: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
5fb0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
5fc0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
5fd0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
5fe0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
5ff0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a  pPager->ckptJSiz
6000: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6010: 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79   pager_ckpt_play
6020: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
6030: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a  er){.  off_t szJ
6040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6050: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
6060: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
6070: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6090: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
60a0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
60d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
60e0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
60f0: 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
6100: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
6110: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
6120: 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70  iteOsTruncate(&p
6130: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
6140: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
6150: 5f 74 29 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  _t)pPager->ckptS
6160: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
6170: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
6180: 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >ckptSize;..  /*
6190: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
61a0: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
61b0: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
61c0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
61d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
61e0: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20  r->ckptInUse && 
61f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6200: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f  pen );.  sqliteO
6210: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63  sSeek(&pPager->c
6220: 70 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20  pfd, 0);.  nRec 
6230: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52  = pPager->ckptNR
6240: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
6250: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
6260: 6f 75 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b  out of the check
6270: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  point journal an
6280: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
6290: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
62a0: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
62b0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
62c0: 75 72 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65  urnal always use
62d0: 73 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 32 20  s format.  ** 2 
62e0: 69 6e 73 74 65 61 64 20 6f 66 20 66 6f 72 6d 61  instead of forma
62f0: 74 20 33 20 73 69 6e 63 65 20 69 74 20 64 6f 65  t 3 since it doe
6300: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
6310: 20 63 6f 6e 63 65 72 6e 65 64 20 77 69 74 68 0a   concerned with.
6320: 20 20 2a 2a 20 70 6f 77 65 72 20 66 61 69 6c 75    ** power failu
6330: 72 65 73 20 63 6f 72 72 75 70 74 69 6e 67 20 74  res corrupting t
6340: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 63  he journal and c
6350: 61 6e 20 74 68 75 73 20 6f 6d 69 74 20 74 68 65  an thus omit the
6360: 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2f   checksums..  */
6370: 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b  .  for(i=nRec-1;
6380: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
6390: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
63a0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
63b0: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 63  ager, &pPager->c
63c0: 70 66 64 2c 20 32 29 3b 0a 20 20 20 20 61 73 73  pfd, 2);.    ass
63d0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
63e0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
63f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6400: 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c  goto end_ckpt_pl
6410: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
6420: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
6430: 20 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64   many pages need
6440: 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75   to be copied ou
6450: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
6460: 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  tion.  ** journa
6470: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  l..  */.  rc = s
6480: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
6490: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
64a0: 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20  ->ckptJSize);.  
64b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
64c0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
64d0: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
64e0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
64f0: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
6500: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
6510: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6520: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
6530: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
6540: 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20  ack;.  }.  nRec 
6550: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
6560: 3e 63 6b 70 74 4a 53 69 7a 65 29 2f 4a 4f 55 52  >ckptJSize)/JOUR
6570: 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61  NAL_PG_SZ(journa
6580: 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 66 6f 72  l_format);.  for
6590: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
65a0: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
65b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
65c0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
65d0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 6f  &pPager->jfd, jo
65e0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20  urnal_format);. 
65f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6600: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
6610: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
6620: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
6630: 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61  oto end_ckpt_pla
6640: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
6650: 0a 20 20 0a 65 6e 64 5f 63 6b 70 74 5f 70 6c 61  .  .end_ckpt_pla
6660: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21  yback:.  if( rc!
6670: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6680: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
6690: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
66a0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ORRUPT;.    rc =
66b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
66c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
66d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
66e0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
66f0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
6700: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
6710: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20   allowed..**.** 
6720: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
6730: 65 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75  er is the absolu
6740: 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  te value of the 
6750: 6d 78 50 61 67 65 20 70 61 72 61 6d 65 74 65 72  mxPage parameter
6760: 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69  ..** If mxPage i
6770: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
6780: 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61  noSync flag is a
6790: 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63  lso set.  noSync
67a0: 20 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c   bypasses.** cal
67b0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 4f 73 53 79  ls to sqliteOsSy
67c0: 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67 65 72  nc().  The pager
67d0: 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65   runs much faste
67e0: 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e  r with noSync on
67f0: 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20  ,.** but if the 
6800: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
6810: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
6820: 65 20 69 73 20 61 6e 20 61 62 72 75 70 74 20 70  e is an abrupt p
6830: 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65  ower .** failure
6840: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
6850: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ile might be lef
6860: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
6870: 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65  tent and.** unre
6880: 70 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20  pairable state. 
6890: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
68a0: 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73  pager_set_caches
68b0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
68c0: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
68d0: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20    if( mxPage>=0 
68e0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
68f0: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
6900: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 7d 65 6c 73  tempFile;.  }els
6910: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
6920: 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d  oSync = 1;.    m
6930: 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b  xPage = -mxPage;
6940: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67  .  }.  if( mxPag
6950: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
6960: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
6970: 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  age;.  }.}../*.*
6980: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
6990: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
69a0: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
69b0: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
69c0: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
69d0: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
69e0: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
69f0: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
6a00: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6a10: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
6a20: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
6a30: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
6a40: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
6a50: 6c 69 74 65 4f 73 53 79 6e 63 28 29 20 69 73 20  liteOsSync() is 
6a60: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
6a70: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
6a80: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
6a90: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
6aa0: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
6ab0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
6ac0: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
6ad0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
6ae0: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
6af0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
6b00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
6b10: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
6b20: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
6b30: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
6b40: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
6b50: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
6b60: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
6b70: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
6b80: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
6b90: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
6ba0: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
6bb0: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
6bc0: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
6bd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6be0: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
6bf0: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
6c00: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
6c10: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
6c20: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
6c30: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
6c40: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
6c50: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
6c60: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
6c70: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
6c80: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
6c90: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
6ca0: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
6cb0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
6cc0: 6e 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  n being written.
6cd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
6ce0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
6cf0: 77 6f 20 73 79 6e 63 73 2e 20 20 49 66 20 77 65  wo syncs.  If we
6d00: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
6d10: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
6d20: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
6d30: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
6d40: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
6d50: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
6d70: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
6d80: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
6d90: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
6da0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
6db0: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
6dc0: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
6dd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
6de0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
6df0: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
6e00: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
6e10: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
6e20: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
6e30: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
6e40: 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  L=3..*/.void sql
6e50: 69 74 65 70 61 67 65 72 5f 73 65 74 5f 73 61 66  itepager_set_saf
6e60: 65 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20  ety_level(Pager 
6e70: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
6e80: 65 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  el){.  pPager->n
6e90: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
6ea0: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
6eb0: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
6ec0: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
6ed0: 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
6ee0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a  >tempFile;.}../*
6ef0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
6f00: 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74  rary file.  Writ
6f10: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
6f20: 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d  e file into zNam
6f30: 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74  e.** (zName must
6f40: 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c   be at least SQL
6f50: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
6f60: 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20  E bytes long.)  
6f70: 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c  Write.** the fil
6f80: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
6f90: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
6fa0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
6fb0: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
6fc0: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
6fd0: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
6fe0: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
6ff0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
7000: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
7010: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
7020: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
7030: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
7040: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
7050: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
7060: 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63  le *fd){.  int c
7070: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
7080: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  ;.  do{.    cnt-
7090: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54  -;.    sqliteOsT
70a0: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
70b0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
70c0: 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  iteOsOpenExclusi
70d0: 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29  ve(zFile, fd, 1)
70e0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e  ;.  }while( cnt>
70f0: 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 && rc!=SQLITE_
7100: 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  OK );.  return r
7110: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
7120: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
7130: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
7140: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
7150: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
7160: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
7170: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
7180: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
7190: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
71a0: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
71b0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
71c0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74   sqlitepager_get
71d0: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
71e0: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
71f0: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
7200: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
7210: 67 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  g sqlitepager_un
7220: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
7230: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
7240: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
7250: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
7260: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
7270: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
7280: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
7290: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
72a0: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
72b0: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
72c0: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
72d0: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
72e0: 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  itepager_open(. 
72f0: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
7300: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
7310: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
7320: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
7330: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
7340: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
7350: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7360: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
7370: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c  */.  int mxPage,
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7390: 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69   Max number of i
73a0: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
73b0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ages */.  int nE
73c0: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
73d0: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
73e0: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
73f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
7400: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
7410: 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nal           /*
7420: 20 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72   TRUE to use a r
7430: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
7440: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
7450: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
7460: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  er;.  char *zFul
7470: 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74  lPathname;.  int
7480: 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69   nameLen;.  OsFi
7490: 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 2c  le fd;.  int rc,
74a0: 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
74b0: 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e  le;.  int readOn
74c0: 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ly = 0;.  char z
74d0: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
74e0: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a  NAME_SIZE];..  *
74f0: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
7500: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
7510: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
7520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
7530: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
7540: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
7550: 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 7a  name[0] ){.    z
7560: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
7570: 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e  qliteOsFullPathn
7580: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
7590: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
75a0: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
75b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
75c0: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
75d0: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b     tempFile = 0;
75e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
75f0: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f   = sqlitepager_o
7600: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
7610: 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  fd);.    zFilena
7620: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
7630: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
7640: 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68  sqliteOsFullPath
7650: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
7660: 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
7670: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
7680: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
7690: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
76a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
76b0: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
76c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
76d0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
76e0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
76f0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
7700: 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65  EN;.  }.  nameLe
7710: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
7720: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
7730: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
7740: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
7750: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20  er) + nameLen*3 
7760: 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50  + 30 );.  if( pP
7770: 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ager==0 ){.    s
7780: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64  qliteOsClose(&fd
7790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
77a0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
77b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
77c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
77d0: 20 53 45 54 5f 50 41 47 45 52 28 70 50 61 67 65   SET_PAGER(pPage
77e0: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  r);.  pPager->zF
77f0: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
7800: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
7810: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
7820: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
7830: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
7840: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
7850: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
7860: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
7870: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
7880: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
7890: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
78a0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
78b0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
78c0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
78d0: 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
78e0: 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
78f0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
7900: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
7910: 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
7920: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
7930: 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28  ] = 0;.  strcpy(
7940: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
7950: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
7960: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
7970: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
7980: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
7990: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
79a0: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
79b0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
79c0: 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  fd;.  pPager->jo
79d0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
79e0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
79f0: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
7a00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
7a10: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
7a20: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
7a30: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
7a40: 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
7a50: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
7a60: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
7a70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7a80: 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  ckptJSize = 0;. 
7a90: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
7aa0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   0;.  pPager->mx
7ab0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20  Page = mxPage>5 
7ac0: 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20  ? mxPage : 10;. 
7ad0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7ae0: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a   SQLITE_UNLOCK;.
7af0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
7b00: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
7b10: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
7b20: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
7b30: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
7b40: 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nly;.  pPager->n
7b50: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
7b60: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
7b70: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
7b80: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
7b90: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
7ba0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
7bb0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
7bc0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
7bd0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7be0: 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
7bf0: 61 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  a;.  memset(pPag
7c00: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
7c10: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
7c20: 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72  sh));.  *ppPager
7c30: 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
7c40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7c50: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7c60: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
7c70: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
7c80: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
7c90: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
7ca0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
7cb0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
7cc0: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
7cd0: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
7ce0: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
7cf0: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
7d00: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
7d10: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
7d20: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
7d30: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
7d40: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
7d50: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
7d60: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
7d70: 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20  epager_close(). 
7d80: 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
7d90: 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
7da0: 20 62 79 20 73 71 6c 69 74 65 70 61 67 65 72 5f   by sqlitepager_
7db0: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
7dc0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74   sqlitepager_set
7dd0: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
7de0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
7df0: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 29 29  (*xDesc)(void*))
7e00: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
7e10: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
7e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7e30: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7e40: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
7e50: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
7e60: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
7e70: 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Pager..*/.int sq
7e80: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
7e90: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
7ea0: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20  r){.  off_t n;. 
7eb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
7ec0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
7ed0: 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
7ee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
7ef0: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
7f00: 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69    if( sqliteOsFi
7f10: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
7f20: 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f  fd, &n)!=SQLITE_
7f30: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
7f40: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
7f50: 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20  ER_ERR_DISK;.   
7f60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7f70: 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47   n /= SQLITE_PAG
7f80: 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70 50  E_SIZE;.  if( pP
7f90: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
7fa0: 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  ITE_UNLOCK ){.  
7fb0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7fc0: 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = n;.  }.  retu
7fd0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn n;.}../*.** F
7fe0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
7ff0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
8000: 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 50 61   syncAllPages(Pa
8010: 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  ger*);../*.** Tr
8020: 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
8030: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
8040: 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
8050: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
8060: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
8070: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
8080: 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
8090: 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
80a0: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20  ->dbSize<0 ){.  
80b0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61    sqlitepager_pa
80c0: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
80d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
80e0: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
80f0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
8100: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
8110: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8120: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
8130: 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
8140: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8160: 4b 3b 0a 20 20 7d 0a 20 20 73 79 6e 63 41 6c 6c  K;.  }.  syncAll
8170: 50 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  Pages(pPager);. 
8180: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72   rc = sqliteOsTr
8190: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
81a0: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
81b0: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e 50 61 67  SIZE*(off_t)nPag
81c0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
81d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
81e0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
81f0: 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nPage;.  }.  ret
8200: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8210: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
8220: 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
8230: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
8240: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
8250: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
8260: 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
8270: 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
8280: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8290: 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
82a0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
82b0: 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
82c0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
82d0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
82e0: 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
82f0: 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
8300: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
8310: 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
8320: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
8330: 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
8340: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
8350: 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
8360: 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
8370: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69  a coredump..*/.i
8380: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  nt sqlitepager_c
8390: 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
83a0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
83b0: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69  g, *pNext;.  swi
83c0: 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61  tch( pPager->sta
83d0: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  te ){.    case S
83e0: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a  QLITE_WRITELOCK:
83f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70   {.      sqlitep
8400: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
8410: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
8420: 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  iteOsUnlock(&pPa
8430: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
8440: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8450: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
8460: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8470: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
8480: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b  LITE_READLOCK: {
8490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55  .      sqliteOsU
84a0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
84b0: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
84c0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
84d0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
84e0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
84f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8500: 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50    }.  for(pPg=pP
8510: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
8520: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
8530: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
8540: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
8550: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
8560: 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65  .  sqliteOsClose
8570: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
8580: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8590: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
85a0: 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
85b0: 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
85c0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
85d0: 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
85e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
85f0: 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
8600: 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  eOsDelete(pPager
8610: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
8620: 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f  ** }.  */.  CLR_
8630: 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20  PAGER(pPager);. 
8640: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69   if( pPager->zFi
8650: 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29 26  lename!=(char*)&
8660: 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20 20  pPager[1] ){.   
8670: 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
8680: 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
8690: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
86a0: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
86b0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
86c0: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Free(pPager->zJo
86d0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
86e0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
86f0: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a  Directory);.  }.
8700: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
8710: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
8720: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8730: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
8740: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
8750: 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
8760: 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
8770: 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65  epager_pagenumbe
8780: 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  r(void *pData){.
8790: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54    PgHdr *p = DAT
87a0: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
87b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  );.  return p->p
87c0: 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  gno;.}../*.** In
87d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
87e0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
87f0: 61 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20  a page.  If the 
8800: 70 61 67 65 20 69 73 0a 2a 2a 20 63 75 72 72 65  page is.** curre
8810: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
8820: 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
8830: 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
8840: 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
8850: 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
8860: 65 65 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  eelist..*/.#defi
8870: 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
8880: 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
8890: 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
88a0: 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 73  d)(P)->nRef++).s
88b0: 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
88c0: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
88d0: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
88e0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
88f0: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
8900: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
8910: 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
8920: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
8930: 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
8940: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
8950: 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
8960: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
8970: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
8980: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
8990: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
89a0: 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
89b0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
89c0: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
89d0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
89e0: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
89f0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
8a00: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
8a10: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
8a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
8a30: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
8a40: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
8a50: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
8a60: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
8a70: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
8a80: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
8a90: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
8aa0: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
8ab0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
8ac0: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
8ad0: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
8ae0: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
8af0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
8b00: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
8b10: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a  EFINFO(pPg);.}..
8b20: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
8b30: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
8b40: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
8b50: 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
8b60: 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
8b70: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
8b80: 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
8b90: 6c 69 74 65 70 61 67 65 72 5f 72 65 66 28 76 6f  litepager_ref(vo
8ba0: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
8bb0: 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
8bc0: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
8bd0: 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
8be0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8bf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
8c00: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
8c10: 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 61  and then write a
8c20: 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20 70 61  ll free dirty pa
8c30: 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
8c40: 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a  ase.** file..**.
8c50: 2a 2a 20 57 72 69 74 69 6e 67 20 61 6c 6c 20 66  ** Writing all f
8c60: 72 65 65 20 64 69 72 74 79 20 70 61 67 65 73 20  ree dirty pages 
8c70: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
8c80: 61 66 74 65 72 20 74 68 65 20 73 79 6e 63 20 69  after the sync i
8c90: 73 20 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69 6f  s a.** non-obvio
8ca0: 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  us optimization.
8cb0: 20 20 66 73 79 6e 63 28 29 20 69 73 20 61 6e 20    fsync() is an 
8cc0: 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
8cd0: 69 6f 6e 20 73 6f 20 77 65 0a 2a 2a 20 77 61 6e  ion so we.** wan
8ce0: 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  t to minimize th
8cf0: 65 20 6e 75 6d 62 65 72 20 6f 74 20 74 69 6d 65  e number ot time
8d00: 73 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 20  s it is called. 
8d10: 41 66 74 65 72 20 61 6e 20 66 73 79 6e 63 28 29  After an fsync()
8d20: 20 63 61 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72 65   call,.** we are
8d30: 20 66 72 65 65 20 74 6f 20 77 72 69 74 65 20 64   free to write d
8d40: 69 72 74 79 20 70 61 67 65 73 20 62 61 63 6b 20  irty pages back 
8d50: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
8d60: 20 20 49 74 20 69 73 20 62 65 73 74 0a 2a 2a 20    It is best.** 
8d70: 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
8d80: 77 72 69 74 65 20 61 73 20 6d 61 6e 79 20 64 69  write as many di
8d90: 72 74 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  rty pages as pos
8da0: 73 69 62 6c 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  sible to minimiz
8db0: 65 20 0a 2a 2a 20 74 68 65 20 72 69 73 6b 20 6f  e .** the risk o
8dc0: 66 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61  f having to do a
8dd0: 6e 6f 74 68 65 72 20 66 73 79 6e 63 28 29 20 6c  nother fsync() l
8de0: 61 74 65 72 20 6f 6e 2e 20 20 57 72 69 74 69 6e  ater on.  Writin
8df0: 67 20 64 69 72 74 79 0a 2a 2a 20 66 72 65 65 20  g dirty.** free 
8e00: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 77 61  pages in this wa
8e10: 79 20 77 61 73 20 6f 62 73 65 72 76 65 64 20 74  y was observed t
8e20: 6f 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  o make database 
8e30: 6f 70 65 72 61 74 69 6f 6e 73 20 67 6f 0a 2a 2a  operations go.**
8e40: 20 75 70 20 74 6f 20 31 30 20 74 69 6d 65 73 20   up to 10 times 
8e50: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
8e60: 20 77 65 20 61 72 65 20 77 72 69 74 69 6e 67 20   we are writing 
8e70: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  to temporary dat
8e80: 61 62 61 73 65 2c 20 74 68 65 72 65 20 69 73 20  abase, there is 
8e90: 6e 6f 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65  no need to prese
8ea0: 72 76 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67  rve.** the integ
8eb0: 72 69 74 79 20 6f 66 20 74 68 65 20 6a 6f 75 72  rity of the jour
8ec0: 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 77 65 20  nal file, so we 
8ed0: 63 61 6e 20 73 61 76 65 20 74 69 6d 65 20 61 6e  can save time an
8ee0: 64 20 73 6b 69 70 20 74 68 65 0a 2a 2a 20 66 73  d skip the.** fs
8ef0: 79 6e 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ync()..*/.static
8f00: 20 69 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67 65   int syncAllPage
8f10: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
8f20: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
8f30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8f40: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
8f50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
8f60: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
8f70: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
8f80: 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
8f90: 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
8fa0: 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
8fb0: 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
8fc0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
8fd0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
8fe0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
8ff0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
9000: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9010: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
9020: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
9030: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a  ager->noSync );.
9040: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
9050: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6f       {.        o
9060: 66 66 5f 74 20 68 64 72 53 7a 2c 20 70 67 53 7a  ff_t hdrSz, pgSz
9070: 2c 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 68  , jSz;.        h
9080: 64 72 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  drSz = JOURNAL_H
9090: 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f  DR_SZ(journal_fo
90a0: 72 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20 70  rmat);.        p
90b0: 67 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47  gSz = JOURNAL_PG
90c0: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
90d0: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  at);.        rc 
90e0: 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  = sqliteOsFileSi
90f0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
9100: 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
9110: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
9120: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
9130: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
9140: 52 65 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d  Rec*pgSz+hdrSz==
9150: 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
9160: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
9170: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d  journal_format>=
9180: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66  3 ){.        off
9190: 5f 74 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20  _t szJ;.        
91a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
91b0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
91c0: 20 20 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e    TRACE1("SYNC\n
91d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ");.          rc
91e0: 20 3d 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28   = sqliteOsSync(
91f0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
9200: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
9210: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
9220: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9230: 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26    sqliteOsSeek(&
9240: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a  pPager->jfd, siz
9250: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9260: 63 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  c1));.        rc
9270: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
9280: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
9290: 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
92a0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
92b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
92c0: 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ = JOURNAL_HD
92d0: 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  R_SZ(journal_for
92e0: 6d 61 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20  mat) +.         
92f0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
9300: 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f  nRec*JOURNAL_PG_
9310: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
9320: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
9330: 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  teOsSeek(&pPager
9340: 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20  ->jfd, szJ);.   
9350: 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
9360: 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20  1("SYNC\n");.   
9370: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
9380: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
9390: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
93a0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
93b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
93c0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
93d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
93e0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
93f0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
9400: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
9410: 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
9420: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ge..    */.    f
9430: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
9440: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
9450: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
9460: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
9470: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
9480: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
9490: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
94a0: 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66  pFirst;.  }..#if
94b0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
94c0: 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
94d0: 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
94e0: 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
94f0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
9500: 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
9510: 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
9520: 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
9530: 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
9540: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
9550: 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
9560: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
9570: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
9580: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
9590: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
95a0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
95b0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
95c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
95d0: 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61  FirstSynced==pPa
95e0: 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20  ger->pFirst );. 
95f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
9600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9610: 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
9620: 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
9630: 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
9640: 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
9650: 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
9660: 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
9670: 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
9680: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
9690: 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
96a0: 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
96b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
96c0: 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
96d0: 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
96e0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
96f0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69  t rc;..  if( pLi
9700: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
9710: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
9720: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
9730: 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  er;.  while( pLi
9740: 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
9750: 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
9760: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65  ;.    sqliteOsSe
9770: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
9780: 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
9790: 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41  (off_t)SQLITE_PA
97a0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72 63  GE_SIZE);.    rc
97b0: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
97c0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  (&pPager->fd, PG
97d0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
97e0: 74 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  t), SQLITE_PAGE_
97f0: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIZE);.    if( r
9800: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9810: 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20     pList->dirty 
9820: 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  = 0;.    pList =
9830: 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
9840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9850: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9860: 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
9870: 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
9880: 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
9890: 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
98a0: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
98b0: 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
98c0: 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
98d0: 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
98e0: 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
98f0: 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
9900: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
9910: 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
9920: 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
9930: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20  r){.  PgHdr *p, 
9940: 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20  *pList;.  pList 
9950: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  = 0;.  for(p=pPa
9960: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
9970: 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
9980: 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29    if( p->dirty )
9990: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74  {.      p->pDirt
99a0: 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  y = pList;.     
99b0: 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20   pList = p;.    
99c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
99d0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
99e0: 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
99f0: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
9a00: 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
9a10: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
9a20: 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
9a30: 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
9a40: 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
9a50: 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
9a60: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
9a70: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
9a80: 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
9a90: 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
9aa0: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
9ab0: 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
9ac0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
9ad0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
9ae0: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
9af0: 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
9b00: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
9b10: 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
9b20: 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
9b30: 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
9b40: 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
9b50: 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
9b60: 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
9b70: 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
9b80: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
9b90: 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
9ba0: 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
9bb0: 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
9bc0: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
9bd0: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
9be0: 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
9bf0: 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
9c00: 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
9c10: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
9c20: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
9c30: 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
9c40: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
9c50: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
9c60: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
9c70: 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
9c80: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
9c90: 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
9ca0: 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
9cb0: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
9cc0: 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
9cd0: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
9ce0: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
9cf0: 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
9d00: 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
9d10: 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
9d20: 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
9d30: 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
9d40: 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
9d50: 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
9d60: 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
9d70: 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
9d80: 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
9d90: 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
9da0: 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
9db0: 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
9dc0: 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
9dd0: 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
9de0: 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
9df0: 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
9e00: 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
9e10: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
9e20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
9e30: 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
9e40: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
9e50: 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
9e60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
9e70: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
9e80: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
9e90: 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
9ea0: 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
9eb0: 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
9ec0: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
9ed0: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
9ee0: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
9ef0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
9f00: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
9f10: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
9f20: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
9f30: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
9f40: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
9f50: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
9f60: 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
9f70: 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f  en get a read lo
9f80: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
9f90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
9fa0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
9fb0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
9fc0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61  rc = sqliteOsRea
9fd0: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
9fe0: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
9ff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a000: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a010: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
a020: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
a030: 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a  EADLOCK;..    /*
a040: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
a050: 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79 20 74  le exists, try t
a060: 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a  o play it back..
a070: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
a080: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
a090: 6c 20 26 26 20 73 71 6c 69 74 65 4f 73 46 69 6c  l && sqliteOsFil
a0a0: 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
a0b0: 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
a0c0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
a0d0: 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72 69      /* Get a wri
a0e0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
a0f0: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 2a  atabase.       *
a100: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
a110: 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28  liteOsWriteLock(
a120: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
a130: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a140: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 55     if( sqliteOsU
a160: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
a170: 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  d)!=SQLITE_OK ){
a180: 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
a190: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
a1a0: 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20 20 20 20   happen! */.    
a1b0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
a1c0: 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
a1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a1e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a1f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
a200: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
a210: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20  TE_WRITELOCK;.. 
a220: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
a230: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
a240: 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
a250: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
a260: 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  if.       ** we 
a270: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
a280: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
a290: 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
a2a0: 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
a2b0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
a2c0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
a2d0: 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
a2e0: 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he.       ** jou
a2f0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
a300: 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
a310: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
a320: 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
a330: 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
a340: 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
a350: 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
a360: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
a370: 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
a380: 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
a390: 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
a3a0: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
a3b0: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
a3c0: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64  sqliteOsOpenRead
a3d0: 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
a3e0: 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
a3f0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  jfd);.       if(
a400: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a410: 7b 0a 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  {.         rc = 
a420: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
a430: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
a440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
a450: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a460: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a470: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a480: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
a490: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
a4a0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 1;.       pPag
a4b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
a4c0: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  ed = 0;..       
a4d0: 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
a4e0: 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
a4f0: 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
a500: 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
a510: 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
a520: 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
a530: 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
a540: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70  */.       rc = p
a550: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
a560: 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
a570: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a580: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  OK ){.         r
a590: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
a5a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
a5b0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
a5c0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
a5d0: 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a   page in cache *
a5e0: 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
a5f0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
a600: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
a610: 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
a620: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
a630: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
a640: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
a650: 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
a660: 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b    pPager->nMiss+
a670: 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
a680: 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
a690: 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
a6a0: 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 29 7b 0a  r->pFirst==0 ){.
a6b0: 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
a6c0: 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
a6d0: 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
a6e0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
a6f0: 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54 45  f(*pPg) + SQLITE
a700: 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
a730: 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
a740: 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20 20 20 20  ->nExtra );.    
a750: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
a760: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
a770: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
a780: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
a790: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
a7a0: 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
a7b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a7c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a7d0: 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
a7e0: 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
a7f0: 50 67 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  Pg));.      pPg-
a800: 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
a810: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
a820: 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
a830: 70 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  pAll;.      if( 
a840: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
a850: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a860: 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d  pAll->pPrevAll =
a870: 20 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20   pPg;.      }.  
a880: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 41 6c      pPg->pPrevAl
a890: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  l = 0;.      pPa
a8a0: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
a8b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
a8c0: 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  Page++;.    }els
a8d0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  e{.      /* Find
a8e0: 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
a8f0: 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
a900: 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
a910: 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
a920: 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
a930: 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
a940: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  the journal..   
a950: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20     */.      pPg 
a960: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
a970: 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f  Synced;..      /
a980: 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
a990: 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
a9a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
a9b0: 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
a9c0: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a       ** on the j
a9d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
a9e0: 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
a9f0: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
aa00: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72  s a.      ** ver
aa10: 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
aa20: 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
aa30: 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
aa40: 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
aa50: 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20      ** it can't 
aa60: 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20  be helped..     
aa70: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
aa80: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
aa90: 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 41 6c 6c  int rc = syncAll
aaa0: 50 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  Pages(pPager);. 
aab0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
aac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
aad0: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
aae0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
aaf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ab00: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
ab10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
ab20: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
ab30: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
ab40: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
ab50: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ef==0 );..      
ab60: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
ab70: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
ab80: 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
ab90: 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  dirty..      */.
aba0: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64        if( pPg->d
abb0: 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
abc0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
abd0: 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
abe0: 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
abf0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
ac00: 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
ac10: 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
ac20: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
ac30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ac40: 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
ac50: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
ac60: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
ac70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
ac80: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
ac90: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
aca0: 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  t( pPg->dirty==0
acb0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
acc0: 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
acd0: 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
ace0: 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
acf0: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20  llback, then.   
ad00: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c     ** set the gl
ad10: 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
ad20: 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
ad30: 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20  isabling the.   
ad40: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e     ** sqlite_don
ad50: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  t_rollback() opt
ad60: 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
ad70: 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
ad80: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
ad90: 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
ada0: 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
adb0: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
adc0: 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
add0: 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
ade0: 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
adf0: 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
ae00: 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
ae10: 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
ae20: 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  ember.      ** t
ae30: 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
ae40: 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
ae50: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
ae60: 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
ae70: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61  t.      ** be ma
ae80: 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
ae90: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
aea0: 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a   on out..      *
aeb0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  /.      if( pPg-
aec0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
aed0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
aee0: 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
aef0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  k = 1;.      }..
af00: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20        /* Unlink 
af10: 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
af20: 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
af30: 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
af40: 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
af50: 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
af60: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
af70: 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
af80: 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
af90: 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 77 68  Free;.        wh
afa0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
afb0: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
afc0: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
afd0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
afe0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
aff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b000: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
b010: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
b020: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
b030: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
b040: 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tFree;.      }el
b050: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
b060: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
b070: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  st==pPg );.     
b080: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
b090: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
b0a0: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ee;.      }.    
b0b0: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
b0c0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
b0d0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
b0e0: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
b0f0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
b100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b110: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b120: 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
b130: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
b140: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
b150: 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20  vFree;.      }. 
b160: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
b170: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
b180: 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
b190: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
b1a0: 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  sh ){.        pP
b1b0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
b1c0: 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
b1d0: 50 72 65 76 48 61 73 68 3b 0a 20 20 20 20 20 20  PrevHash;.      
b1e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
b1f0: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
b200: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
b210: 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
b220: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
b230: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b240: 20 20 20 20 20 20 20 68 20 3d 20 70 61 67 65 72         h = pager
b250: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
b260: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b270: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
b280: 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  h]==pPg );.     
b290: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
b2a0: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
b2b0: 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Hash;.      }.  
b2c0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
b2d0: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
b2e0: 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ash = 0;.      p
b2f0: 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a  Pager->nOvfl++;.
b300: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
b310: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
b320: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
b330: 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
b340: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
b350: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
b360: 20 73 71 6c 69 74 65 43 68 65 63 6b 4d 65 6d 6f   sqliteCheckMemo
b370: 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
b380: 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
b390: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
b3a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b3b0: 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
b3c0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
b3d0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
b3e0: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
b3f0: 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
b400: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
b410: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
b420: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
b430: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
b440: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
b450: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
b460: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
b470: 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
b480: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
b490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
b4a0: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70   (pPager->aInCkp
b4b0: 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
b4c0: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
b4d0: 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
b4e0: 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67  to_ckpt_list(pPg
b4f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b500: 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
b510: 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 70  from_ckpt_list(p
b520: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
b530: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
b540: 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
b550: 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
b560: 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  g);.    pPager->
b570: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20  nRef++;.    h = 
b580: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
b590: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
b5a0: 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
b5b0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
b5c0: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
b5d0: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
b5e0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
b5f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
b600: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
b610: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
b620: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
b630: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
b640: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
b650: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
b660: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
b670: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
b680: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
b690: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
b6a0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
b6b0: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c  ->dbSize<0 ) sql
b6c0: 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75  itepager_pagecou
b6d0: 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
b6e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
b6f0: 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask!=0 ){.      
b700: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
b710: 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
b720: 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20  pPg));.      rc 
b730: 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
b740: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
b750: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
b760: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b770: 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f  dbSize<(int)pgno
b780: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
b790: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
b7a0: 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
b7b0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
b7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
b7d0: 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
b7e0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
b7f0: 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66  fd, (pgno-1)*(of
b800: 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f  f_t)SQLITE_PAGE_
b810: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20  SIZE);.      rc 
b820: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26  = sqliteOsRead(&
b830: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
b840: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
b850: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
b860: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b870: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b880: 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65        off_t file
b890: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
b8a0: 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  ( sqliteOsFileSi
b8b0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26  ze(&pPager->fd,&
b8c0: 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54  fileSize)!=SQLIT
b8d0: 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
b8e0: 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e      || fileSize>
b8f0: 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47  =pgno*SQLITE_PAG
b900: 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
b910: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
b920: 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
b930: 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
b940: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
b950: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b960: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
b970: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
b980: 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
b990: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
b9a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b9b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
b9c0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
b9d0: 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
b9e0: 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
b9f0: 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b    pPager->nHit++
ba00: 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
ba10: 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
ba20: 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ge = PGHDR_TO_DA
ba30: 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  TA(pPg);.  retur
ba40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ba50: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
ba60: 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
ba70: 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
ba80: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
ba90: 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
baa0: 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
bab0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
bac0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
bad0: 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
bae0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
baf0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
bb00: 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72  also sqlitepager
bb10: 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
bb20: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
bb30: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
bb40: 61 6e 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  and sqlitepager_
bb50: 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
bb60: 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
bb70: 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
bb80: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
bb90: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
bba0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
bbb0: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
bbc0: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
bbd0: 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
bbe0: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
bbf0: 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
bc00: 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
bc10: 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
bc20: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 70 61 67  .void *sqlitepag
bc30: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
bc40: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
bc50: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
bc60: 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
bc70: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
bc80: 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
bc90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bca0: 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
bcb0: 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
bcc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
bcd0: 20 2f 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   /* if( pPager->
bce0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 2a 2a 20  nRef==0 ){.  ** 
bcf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 2a 20   return 0;.  ** 
bd00: 7d 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  }.  */.  pPg = p
bd10: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
bd20: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
bd30: 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
bd40: 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
bd50: 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
bd60: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
bd70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
bd80: 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
bd90: 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
bda0: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
bdb0: 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
bdc0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
bdd0: 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
bde0: 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
bdf0: 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
be00: 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
be10: 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
be20: 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
be30: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
be40: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
be50: 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
be60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
be70: 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64  pager_unref(void
be80: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
be90: 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65  r *pPg;..  /* De
bea0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
beb0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
bec0: 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
bed0: 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50   pPg = DATA_TO_P
bee0: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61  GHDR(pData);.  a
bef0: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
bf00: 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  >0 );.  pPg->nRe
bf10: 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
bf20: 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
bf30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
bf40: 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
bf50: 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
bf60: 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
bf70: 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
bf80: 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
bf90: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
bfa0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
bfb0: 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
bfc0: 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ger;.    pPager 
bfd0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
bfe0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
bff0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  e = 0;.    pPg->
c000: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67  pPrevFree = pPag
c010: 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70  er->pLast;.    p
c020: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
c030: 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
c040: 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
c050: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
c060: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
c070: 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pPg;.    }else{.
c080: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
c090: 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  irst = pPg;.    
c0a0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
c0b0: 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  eedSync==0 && pP
c0c0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
c0d0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ed==0 ){.      p
c0e0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
c0f0: 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ced = pPg;.    }
c100: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c110: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
c120: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
c130: 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 29  estructor(pData)
c140: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
c150: 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
c160: 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
c170: 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
c180: 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
c190: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
c1a0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
c1b0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
c1c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
c1d0: 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
c1e0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c1f0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
c200: 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
c210: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
c220: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c230: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
c240: 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
c250: 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
c260: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
c270: 72 65 61 64 79 20 62 65 20 61 20 77 72 69 74 65  ready be a write
c280: 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
c290: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
c2a0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
c2b0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
c2c0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c2d0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
c2e0: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
c2f0: 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
c300: 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
c310: 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
c320: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
c330: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c340: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
c350: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c360: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
c370: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
c380: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
c390: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
c3a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c3b0: 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
c3c0: 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
c3d0: 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74  urnal );.  sqlit
c3e0: 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  epager_pagecount
c3f0: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
c400: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
c410: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
c420: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
c430: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
c440: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
c450: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c460: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
c470: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61  er->fd);.    pPa
c480: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
c490: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
c4a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c4b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
c4c0: 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78  = sqliteOsOpenEx
c4d0: 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
c4e0: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
c4f0: 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74  r->jfd,pPager->t
c500: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
c510: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c520: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
c530: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
c540: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
c550: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
c560: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61  .    sqliteOsRea
c570: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
c580: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
c590: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
c5a0: 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  EADLOCK;.    ret
c5b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
c5c0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PEN;.  }.  sqlit
c5d0: 65 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  eOsOpenDirectory
c5e0: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
c5f0: 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ory, &pPager->jf
c600: 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  d);.  pPager->jo
c610: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
c620: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c630: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
c640: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
c650: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
c660: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
c670: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
c680: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
c690: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
c6a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
c6b0: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
c6c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
c6d0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
c6e0: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
c6f0: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69  ger->dbSize;.  i
c700: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
c710: 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t==JOURNAL_FORMA
c720: 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  T_3 ){.    rc = 
c730: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
c740: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
c750: 72 6e 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65  rnalMagic3, size
c760: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
c770: 33 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  3));.    if( rc=
c780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c790: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
c7a0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
c7b0: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  d, pPager->noSyn
c7c0: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
c7d0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
c7e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c7f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
c800: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 28 75  ->cksumInit = (u
c810: 33 32 29 73 71 6c 69 74 65 52 61 6e 64 6f 6d 49  32)sqliteRandomI
c820: 6e 74 65 67 65 72 28 29 3b 0a 20 20 20 20 20 20  nteger();.      
c830: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
c840: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
c850: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
c860: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
c870: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
c880: 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52  mat==JOURNAL_FOR
c890: 4d 41 54 5f 32 20 29 7b 0a 20 20 20 20 72 63 20  MAT_2 ){.    rc 
c8a0: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
c8b0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
c8c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73 69  ournalMagic2, si
c8d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
c8e0: 69 63 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ic2));.  }else{.
c8f0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 6f 75 72      assert( jour
c900: 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52  nal_format==JOUR
c910: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 3b 0a  NAL_FORMAT_1 );.
c920: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
c930: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
c940: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
c950: 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  ic1, sizeof(aJou
c960: 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b 0a 20 20  rnalMagic1));.  
c970: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c980: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c990: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
c9a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
c9b0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
c9c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
c9d0: 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  kptAutoopen && r
c9e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c9f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
ca00: 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e 28  ager_ckpt_begin(
ca10: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
ca20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ca30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
ca40: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
ca50: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
ca60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ca70: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ca80: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
ca90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
caa0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69   .}../*.** Acqui
cab0: 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
cac0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
cad0: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
cae0: 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
caf0: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
cb00: 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
cb10: 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
cb20: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69  pager_commit() i
cb30: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
cb40: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
cb50: 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
cb60: 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
cb70: 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  tepager_close() 
cb80: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
cb90: 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75  *  sqlitepager_u
cba0: 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
cbb0: 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
cbc0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
cbd0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
cbe0: 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
cbf0: 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
cc00: 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
cc10: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
cc20: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
cc30: 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
cc40: 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
cc50: 73 20 75 73 65 64 20 6d 65 72 65 6c 79 0a 2a 2a  s used merely.**
cc60: 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 70 6f   to acquire a po
cc70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
cc80: 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
cc90: 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
cca0: 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61  here.** is alrea
ccb0: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
ccc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
ccd0: 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
cce0: 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
ccf0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
cd00: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
cd10: 20 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72 61 72   For.** temporar
cd20: 79 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  y files, the ope
cd30: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
cd40: 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
cd50: 72 72 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  rred until.** th
cd60: 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c  ere is an actual
cd70: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
cd80: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
cd90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
cda0: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
cdb0: 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20 74 68  write-locked, th
cdc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
cdd0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
cde0: 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28  litepager_begin(
cdf0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
ce00: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
ce10: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
ce20: 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
ce30: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
ce40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ce50: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
ce60: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
ce70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ce80: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
ce90: 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
cea0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
ceb0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20  SQLITE_READLOCK 
cec0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ced0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
cee0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
cef0: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f   sqliteOsWriteLo
cf00: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
cf10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
cf20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
cf30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
cf40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
cf50: 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54  te = SQLITE_WRIT
cf60: 45 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  ELOCK;.    pPage
cf70: 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 30  r->dirtyFile = 0
cf80: 3b 0a 20 20 20 20 54 52 41 43 45 31 28 22 54 52  ;.    TRACE1("TR
cf90: 41 4e 53 41 43 54 49 4f 4e 5c 6e 22 29 3b 0a 20  ANSACTION\n");. 
cfa0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
cfb0: 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
cfc0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
cfd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
cfe0: 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
cff0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
d000: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d010: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
d020: 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
d030: 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
d040: 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
d050: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
d060: 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
d070: 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
d080: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
d090: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
d0a0: 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
d0b0: 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
d0c0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
d0d0: 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
d0e0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
d0f0: 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
d100: 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
d110: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 77 72  nd acquires a wr
d120: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
d130: 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
d140: 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20  e write.** lock 
d150: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
d160: 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
d170: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
d180: 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
d190: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
d1a0: 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
d1b0: 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
d1c0: 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
d1d0: 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
d1e0: 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
d1f0: 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
d200: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
d210: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
d220: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d230: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
d240: 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
d250: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
d260: 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
d270: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
d280: 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
d290: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
d2a0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
d2b0: 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
d2c0: 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
d2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
d2e0: 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
d2f0: 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
d300: 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  itepager_commit(
d310: 29 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72  ) or sqlitepager
d320: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
d330: 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
d340: 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74  sqlitepager_writ
d350: 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
d360: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
d370: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
d380: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
d390: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
d3a0: 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
d3b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
d3c0: 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
d3d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
d3e0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a  er->errMask ){ .
d3f0: 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
d400: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
d410: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
d420: 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
d430: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d440: 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  E_PERM;.  }..  /
d450: 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
d460: 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
d470: 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
d480: 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
d490: 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
d4a0: 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
d4b0: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
d4c0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64  y..  */.  pPg->d
d4d0: 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  irty = 1;.  if( 
d4e0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
d4f0: 26 20 28 70 50 67 2d 3e 69 6e 43 6b 70 74 20 7c  & (pPg->inCkpt |
d500: 7c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  | pPager->ckptIn
d510: 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
d520: 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65  Pager->dirtyFile
d530: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
d540: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d550: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
d560: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
d570: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
d580: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a   needs to be.  *
d590: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
d5a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
d5b0: 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
d5c0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
d5d0: 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a   ** or both..  *
d5e0: 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65  *.  ** First che
d5f0: 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
d600: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
d610: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
d620: 64 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74  d.  ** create it
d630: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
d640: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d650: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
d660: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  QLITE_UNLOCK );.
d670: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
d680: 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b  er_begin(pData);
d690: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d6a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
d6b0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
d6c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
d6d0: 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te==SQLITE_WRITE
d6e0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 21 70  LOCK );.  if( !p
d6f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
d700: 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
d710: 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
d720: 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
d730: 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
d740: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d750: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
d760: 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
d770: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d780: 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
d790: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
d7a0: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46    pPager->dirtyF
d7b0: 69 6c 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54  ile = 1;..  /* T
d7c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
d7d0: 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
d7e0: 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
d7f0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
d800: 65 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61  e.  ** main data
d810: 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
d820: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
d830: 67 65 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ge to the transa
d840: 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72  ction .  ** jour
d850: 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
d860: 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
d870: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d    */.  if( !pPg-
d880: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 70 50  >inJournal && pP
d890: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
d8a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74   ){.    if( (int
d8b0: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
d8c0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
d8d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
d8e0: 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61  Pg;.      u32 sa
d8f0: 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  ved;.      if( j
d900: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a  ournal_format>=J
d910: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20  OURNAL_FORMAT_3 
d920: 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
d930: 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
d940: 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  um(pPager, pPg->
d950: 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20  pgno, pData);.  
d960: 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
d970: 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
d980: 54 52 41 28 70 50 67 29 3b 0a 20 20 20 20 20 20  TRA(pPg);.      
d990: 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b    store32bits(ck
d9a0: 73 75 6d 2c 20 70 50 67 2c 20 53 51 4c 49 54 45  sum, pPg, SQLITE
d9b0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
d9c0: 20 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49       szPg = SQLI
d9d0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 38 3b 0a  TE_PAGE_SIZE+8;.
d9e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d9f0: 20 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49       szPg = SQLI
da00: 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 3b 0a  TE_PAGE_SIZE+4;.
da10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
da20: 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
da30: 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
da40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
da50: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
da60: 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  >jfd, &((char*)p
da70: 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29  Data)[-4], szPg)
da80: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72  ;.      if( jour
da90: 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52  nal_format>=JOUR
daa0: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a  NAL_FORMAT_3 ){.
dab0: 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50          *(u32*)P
dac0: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
dad0: 67 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20  g) = saved;.    
dae0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
daf0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
db00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67         sqlitepag
db10: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
db20: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
db30: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
db40: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
db50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
db60: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
db70: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
db80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
db90: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
dba0: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  l!=0 );.      pP
dbb0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
dbc0: 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
dbd0: 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
dbe0: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  );.      pPg->ne
dbf0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
dc00: 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
dc10: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
dc20: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   1;.      if( pP
dc30: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
dc40: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
dc50: 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e  r->aInCkpt[pPg->
dc60: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
dc70: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
dc80: 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
dc90: 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b  _ckpt_list(pPg);
dca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
dcb0: 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
dcc0: 64 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  d %d\n", pPg->pg
dcd0: 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
dce0: 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c);.    }else{. 
dcf0: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
dd00: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
dd10: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
dd20: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
dd30: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 41  .      TRACE3("A
dd40: 50 50 45 4e 44 20 25 64 20 25 64 5c 6e 22 2c 20  PPEND %d %d\n", 
dd50: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
dd60: 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
dd70: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
dd80: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
dd90: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
dda0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
ddb0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65  .  /* If the che
ddc0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
ddd0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
dde0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
ddf0: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  t,.  ** then wri
de00: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
de10: 61 67 65 20 74 6f 20 74 68 65 20 63 68 65 63 6b  age to the check
de20: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  point journal.  
de30: 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  Note that.  ** t
de40: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
de50: 75 72 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65  urnal always use
de60: 73 20 74 68 65 20 73 69 6d 70 6c 69 65 72 20 66  s the simplier f
de70: 6f 72 6d 61 74 20 32 20 74 68 61 74 20 6c 61 63  ormat 2 that lac
de80: 6b 73 0a 20 20 2a 2a 20 63 68 65 63 6b 73 75 6d  ks.  ** checksum
de90: 73 2e 20 20 54 68 65 20 68 65 61 64 65 72 20 69  s.  The header i
dea0: 73 20 61 6c 73 6f 20 6f 6d 69 74 74 65 64 20 66  s also omitted f
deb0: 72 6f 6d 20 74 68 65 20 63 68 65 63 6b 70 6f 69  rom the checkpoi
dec0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
ded0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
dee0: 6b 70 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  kptInUse && !pPg
def0: 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74  ->inCkpt && (int
df00: 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
df10: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a  er->ckptSize ){.
df20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
df30: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
df40: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
df50: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
df60: 29 3b 0a 20 20 20 20 73 74 6f 72 65 33 32 62 69  );.    store32bi
df70: 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ts(pPg->pgno, pP
df80: 67 2c 20 2d 34 29 3b 0a 20 20 20 20 72 63 20 3d  g, -4);.    rc =
df90: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
dfa0: 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 26 28  pPager->cpfd, &(
dfb0: 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
dfc0: 5d 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ], SQLITE_PAGE_S
dfd0: 49 5a 45 2b 34 29 3b 0a 20 20 20 20 69 66 28 20  IZE+4);.    if( 
dfe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67  .      sqlitepag
e000: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
e010: 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
e020: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
e030: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
e040: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e050: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
e060: 3e 63 6b 70 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >ckptNRec++;.   
e070: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
e080: 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20  >aInCkpt!=0 );. 
e090: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
e0a0: 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  pt[pPg->pgno/8] 
e0b0: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
e0c0: 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
e0d0: 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70  d_to_ckpt_list(p
e0e0: 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  Pg);.  }..  /* U
e0f0: 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
e100: 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
e110: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
e120: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
e130: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
e140: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
e150: 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
e160: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e180: 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
e190: 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
e1a0: 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
e1b0: 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
e1c0: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
e1d0: 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  write().  In oth
e1e0: 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
e1f0: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
e200: 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
e210: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
e220: 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e page..*/.int s
e230: 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69  qlitepager_iswri
e240: 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
e250: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
e260: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
e270: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
e280: 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
e290: 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ../*.** Replace 
e2a0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
e2b0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
e2c0: 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
e2d0: 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
e2e0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
e2f0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f  nt sqlitepager_o
e300: 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
e310: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
e320: 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
e330: 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
e340: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
e350: 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65  = sqlitepager_ge
e360: 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
e370: 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
e380: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e390: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
e3a0: 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
e3b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e3c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e3d0: 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
e3e0: 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  pData, SQLITE_PA
e3f0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  GE_SIZE);.    }.
e400: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
e410: 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
e420: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e430: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
e440: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
e450: 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
e460: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
e470: 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
e480: 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
e490: 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
e4a0: 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
e4b0: 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
e4c0: 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
e4d0: 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
e4e0: 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
e4f0: 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
e500: 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
e510: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
e520: 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
e530: 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
e540: 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
e550: 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
e560: 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
e570: 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
e580: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
e590: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
e5a0: 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
e5b0: 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
e5c0: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
e5d0: 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
e5e0: 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74  sqlitepager_dont
e5f0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
e600: 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
e610: 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
e620: 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
e630: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
e640: 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
e650: 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
e660: 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
e670: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e680: 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
e690: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
e6a0: 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
e6b0: 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
e6c0: 73 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  s to sqlitepager
e6d0: 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
e6e0: 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
e6f0: 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
e700: 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
e710: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
e720: 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
e730: 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
e740: 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
e750: 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
e760: 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
e770: 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
e780: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
e790: 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
e7a0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
e7b0: 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
e7c0: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
e7d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
e7e0: 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
e7f0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
e800: 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
e810: 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
e820: 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
e830: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e840: 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
e850: 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f  ,.** the dont_ro
e860: 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
e870: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
e880: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
e890: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72  e contains.** cr
e8a0: 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
e8b0: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
e8c0: 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f   sure it gets ro
e8d0: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
e8e0: 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e  te.** of the don
e8f0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  t_rollback() cal
e900: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
e910: 65 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74  epager_dont_writ
e920: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
e930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
e940: 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50  gHdr *pPg;..  pP
e950: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
e960: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
e970: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
e980: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
e990: 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
e9a0: 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ty ){.    if( pP
e9b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
e9c0: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
e9d0: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
e9e0: 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
e9f0: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
ea00: 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
ea10: 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
ea20: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
ea30: 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
ea40: 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
ea50: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
ea60: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
ea70: 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
ea80: 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
ea90: 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
eaa0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
eab0: 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
eac0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
ead0: 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
eae0: 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
eaf0: 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
eb00: 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
eb10: 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
eb20: 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
eb30: 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
eb40: 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
eb50: 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
eb60: 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
eb70: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
eb80: 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
eb90: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
eba0: 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
ebb0: 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
ebc0: 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
ebd0: 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
ebe0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
ebf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ec00: 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 57 52 49  TRACE2("DONT_WRI
ec10: 54 45 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b  TE %d\n", pgno);
ec20: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
ec30: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 0;.    }.  }
ec40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
ec50: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
ec60: 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
ec70: 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
ec80: 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
ec90: 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
eca0: 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
ecb0: 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
ecc0: 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
ecd0: 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
ece0: 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
ecf0: 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
ed00: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
ed10: 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
ed20: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f  k journal..*/.vo
ed30: 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64  id sqlitepager_d
ed40: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69  ont_rollback(voi
ed50: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
ed60: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
ed70: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
ed80: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
ed90: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
eda0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
edb0: 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
edc0: 45 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  ELOCK || pPager-
edd0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
ede0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
edf0: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
ee00: 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
ee10: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 20  lwaysRollback ) 
ee20: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
ee30: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
ee40: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
ee50: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
ee60: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
ee70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
ee80: 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
ee90: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
eea0: 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
eeb0: 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
eec0: 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
eed0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
eee0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63     if( pPager->c
eef0: 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  kptInUse ){.    
ef00: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
ef10: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
ef20: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
ef30: 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
ef40: 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28  dd_to_ckpt_list(
ef50: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
ef60: 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE2("DONT_ROL
ef70: 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 67  LBACK %d\n", pPg
ef80: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  ->pgno);.  }.  i
ef90: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
efa0: 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
efb0: 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70 50 67  Ckpt && (int)pPg
efc0: 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
efd0: 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  ckptSize ){.    
efe0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
eff0: 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
f000: 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
f010: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
f020: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f030: 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b  r->aInCkpt!=0 );
f040: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
f050: 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Ckpt[pPg->pgno/8
f060: 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
f070: 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
f080: 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74  add_to_ckpt_list
f090: 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  (pPg);.  }.}../*
f0a0: 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
f0b0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
f0c0: 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
f0d0: 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
f0e0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
f0f0: 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
f100: 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
f110: 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
f120: 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
f130: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
f140: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
f150: 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
f160: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
f170: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
f180: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f  t sqlitepager_co
f190: 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
f1a0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
f1b0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
f1c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
f1d0: 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask==PAGER_ERR_F
f1e0: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
f1f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
f200: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
f210: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f220: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
f230: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
f240: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
f250: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
f260: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
f270: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
f280: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
f290: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
f2a0: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
f2b0: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
f2c0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
f2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f2e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  E_ERROR;.  }.  T
f2f0: 52 41 43 45 31 28 22 43 4f 4d 4d 49 54 5c 6e 22  RACE1("COMMIT\n"
f300: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f310: 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 29 7b  >dirtyFile==0 ){
f320: 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72  .    /* Exit ear
f330: 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e  ly (without doin
f340: 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75  g the time-consu
f350: 6d 69 6e 67 20 73 71 6c 69 74 65 4f 73 53 79 6e  ming sqliteOsSyn
f360: 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a  c() calls).    *
f370: 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  * if there have 
f380: 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
f390: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f3a0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
f3b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
f3c0: 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
f3d0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
f3e0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
f3f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
f400: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
f410: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
f420: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f430: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69  urnalOpen );.  i
f440: 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
f450: 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53  ync && sqliteOsS
f460: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
f470: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
f480: 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
f490: 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 70 50 67  abort;.  }.  pPg
f4a0: 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
f4b0: 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
f4c0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 67 20  ger);.  if( pPg 
f4d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
f4e0: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
f4f0: 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
f500: 63 20 7c 7c 20 28 21 70 50 61 67 65 72 2d 3e 6e  c || (!pPager->n
f510: 6f 53 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f  oSync && sqliteO
f520: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
f530: 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  d)!=SQLITE_OK) )
f540: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d  {.      goto com
f550: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d  mit_abort;.    }
f560: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
f570: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
f580: 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
f590: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
f5a0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
f5b0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e   Jump here if an
f5c0: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f5d0: 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  g during the com
f5e0: 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  mit process..  *
f5f0: 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a  /.commit_abort:.
f600: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
f610: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
f620: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  er);.  if( rc==S
f630: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f640: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
f650: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
f660: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
f670: 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
f680: 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
f690: 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 72 65  falls back to re
f6a0: 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a  ad-only mode..**
f6b0: 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
f6c0: 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
f6d0: 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
f6e0: 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
f6f0: 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
f700: 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
f710: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f720: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
f730: 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
f740: 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
f750: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
f760: 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
f770: 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f  rotocol (SQLITE_
f780: 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c  PROTOCOL) or unl
f790: 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
f7a0: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
f7b0: 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
f7c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f7d0: 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
f7e0: 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
f7f0: 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
f800: 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
f810: 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
f820: 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
f830: 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
f840: 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
f850: 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
f860: 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
f870: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
f880: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
f890: 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  r_rollback(Pager
f8a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
f8b0: 20 72 63 3b 0a 20 20 54 52 41 43 45 31 28 22 52   rc;.  TRACE1("R
f8c0: 4f 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20 20 69  OLLBACK\n");.  i
f8d0: 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
f8e0: 79 46 69 6c 65 20 7c 7c 20 21 70 50 61 67 65 72  yFile || !pPager
f8f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
f900: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
f910: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
f920: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
f930: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
f940: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
f950: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
f960: 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50  errMask!=0 && pP
f970: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50  ager->errMask!=P
f980: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
f990: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
f9a0: 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57  >state>=SQLITE_W
f9b0: 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RITELOCK ){.    
f9c0: 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
f9d0: 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
f9e0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61   }.    return pa
f9f0: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
fa00: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
fa10: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
fa20: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
fa30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fa40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
fa50: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
fa60: 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
fa70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fa80: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
fa90: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
faa0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
fab0: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
fac0: 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50  ORRUPT;.  }.  pP
fad0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
fae0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
faf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fb00: 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
fb10: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
fb20: 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
fb30: 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
fb40: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
fb50: 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
fb60: 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
fb70: 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 72 65  sqlitepager_isre
fb80: 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
fb90: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
fba0: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
fbb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
fbc0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
fbd0: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
fbe0: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
fbf0: 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 70 61 67  /.int *sqlitepag
fc00: 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a  er_stats(Pager *
fc10: 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
fc20: 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b  c int a[9];.  a[
fc30: 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
fc40: 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
fc50: 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
fc60: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
fc70: 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
fc80: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
fc90: 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
fca0: 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
fcb0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20  ager->errMask;. 
fcc0: 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
fcd0: 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
fce0: 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
fcf0: 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
fd00: 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  Ovfl;.  return a
fd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
fd20: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a  he checkpoint..*
fd30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fd40: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
fd50: 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
fd60: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
fd70: 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
fd80: 20 20 41 20 6e 65 77 20 63 68 65 63 6b 70 6f 69    A new checkpoi
fd90: 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
fda0: 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
fdb0: 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
fdc0: 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
fdd0: 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
fde0: 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
fdf0: 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
fe00: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
fe10: 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e  pager_ckpt_begin
fe20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
fe30: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
fe40: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
fe50: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
fe60: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
fe70: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
fe80: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74   pPager->ckptAut
fe90: 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
fea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
feb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
fec0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
fed0: 65 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  en );.  assert( 
fee0: 21 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55  !pPager->ckptInU
fef0: 73 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  se );.  pPager->
ff00: 61 49 6e 43 6b 70 74 20 3d 20 73 71 6c 69 74 65  aInCkpt = sqlite
ff10: 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
ff20: 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
ff30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
ff40: 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nCkpt==0 ){.    
ff50: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
ff60: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
ff70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ff80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
ff90: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
ffa0: 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  = sqliteOsFileSi
ffb0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
ffc0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53   &pPager->ckptJS
ffd0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
ffe0: 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e   goto ckpt_begin
fff0: 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
10000 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  t( pPager->ckptJ
10010 53 69 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50 61  Size == .    pPa
10020 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41  ger->nRec*JOURNA
10030 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
10040 66 6f 72 6d 61 74 29 2b 4a 4f 55 52 4e 41 4c 5f  format)+JOURNAL_
10050 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66  HDR_SZ(journal_f
10060 6f 72 6d 61 74 29 20 29 3b 0a 23 65 6e 64 69 66  ormat) );.#endif
10070 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  .  pPager->ckptJ
10080 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Size = pPager->n
10090 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
100a0 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
100b0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
100c0 20 20 20 20 20 20 20 20 20 20 20 2b 20 4a 4f 55             + JOU
100d0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72  RNAL_HDR_SZ(jour
100e0 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 70  nal_format);.  p
100f0 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20  Pager->ckptSize 
10100 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
10110 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
10120 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >ckptOpen ){.   
10130 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
10140 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
10150 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29  , &pPager->cpfd)
10160 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
10170 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66  oto ckpt_begin_f
10180 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
10190 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 31 3b  r->ckptOpen = 1;
101a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
101b0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
101c0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
101d0 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
101e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 63 6b   SQLITE_OK;. .ck
101f0 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  pt_begin_failed:
10200 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
10210 49 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20 73 71  InCkpt ){.    sq
10220 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
10230 3e 61 49 6e 43 6b 70 74 29 3b 0a 20 20 20 20 70  >aInCkpt);.    p
10240 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d  Pager->aInCkpt =
10250 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
10260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
10270 6d 6d 69 74 20 61 20 63 68 65 63 6b 70 6f 69 6e  mmit a checkpoin
10280 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10290 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69  pager_ckpt_commi
102a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
102b0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
102c0 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  ckptInUse ){.   
102d0 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
102e0 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  ext;.    sqliteO
102f0 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63  sSeek(&pPager->c
10300 70 66 64 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  pfd, 0);.    /* 
10310 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65  sqliteOsTruncate
10320 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
10330 30 29 3b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  0); */.    pPage
10340 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b  r->ckptNRec = 0;
10350 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
10360 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
10370 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
10380 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 3b 0a 20  er->aInCkpt );. 
10390 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
103a0 70 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  pt = 0;.    for(
103b0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 43 6b 70  pPg=pPager->pCkp
103c0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
103d0 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
103e0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  = pPg->pNextCkpt
103f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10400 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 3b 0a 20  pPg->inCkpt );. 
10410 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74       pPg->inCkpt
10420 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
10430 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70 50 67  >pPrevCkpt = pPg
10440 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 30 3b  ->pNextCkpt = 0;
10450 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
10460 72 2d 3e 70 43 6b 70 74 20 3d 20 30 3b 0a 20 20  r->pCkpt = 0;.  
10470 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  }.  pPager->ckpt
10480 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
10490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
104a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
104b0 61 63 6b 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  ack a checkpoint
104c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
104d0 61 67 65 72 5f 63 6b 70 74 5f 72 6f 6c 6c 62 61  ager_ckpt_rollba
104e0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
104f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
10500 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
10510 6e 55 73 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  nUse ){.    rc =
10520 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79   pager_ckpt_play
10530 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
10540 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b    sqlitepager_ck
10550 70 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72  pt_commit(pPager
10560 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10580 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b    }.  pPager->ck
10590 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  ptAutoopen = 0;.
105a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
105b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
105c0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
105d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
105e0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
105f0 61 72 20 2a 73 71 6c 69 74 65 70 61 67 65 72 5f  ar *sqlitepager_
10600 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
10610 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
10620 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
10630 61 6d 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ame;.}..#ifdef S
10640 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
10650 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
10660 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
10670 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
10680 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
10690 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
106a0 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
106b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
106c0 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
106d0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
106e0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
106f0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
10700 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
10710 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72  continue;.    pr
10720 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
10730 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d  ddr=0x%08x nRef=
10740 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
10750 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50  Pg->pgno, (int)P
10760 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
10770 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
10780 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a               }.}.#endif.