/ Hex Artifact Content
Login

Artifact df4c81350cbd80c1ab48341ae0768ba78d99ad49:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 38 31  : pager.c,v 1.81
0350: 20 32 30 30 33 2f 30 34 2f 30 36 20 32 30 3a 35   2003/04/06 20:5
0360: 32 3a 33 32 20 64 72 68 20 45 78 70 20 24 0a 2a  2:32 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
10b0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
10e0: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
10f0: 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   */.  /* SQLITE_
1100: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
1110: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1120: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1130: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1140: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1150: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1160: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1170: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
1180: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1190: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
11a0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
11b0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
11c0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
11d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
11e0: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
11f0: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
1200: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
1210: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
1220: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
1230: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
1240: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
1250: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1260: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f  E_PAGE_SIZE])../
1270: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1280: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1290: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
12a0: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
12b0: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
12c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
12d0: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
12e0: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
12f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1300: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1310: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1320: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1330: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1340: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1350: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1360: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1370: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1380: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1390: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
13a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
13d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
13f0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1400: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1420: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1430: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
1440: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
1450: 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20 20 20  File cpfd;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1480: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1490: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
14a0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
14b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14c0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14d0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
14e0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1500: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1510: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1520: 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20    int ckptSize; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1550: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1560: 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  ckpt_begin() */.
1570: 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a    off_t ckptJSiz
1580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1590: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
15a0: 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29   at ckpt_begin()
15b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15e0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
15f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1600: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1620: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
1630: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
1640: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
1650: 69 6e 74 20 63 6b 70 74 4e 52 65 63 3b 20 20 20  int ckptNRec;   
1660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1670: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
1680: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
1690: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
16a0: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
16d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
16e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
16f0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
1700: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61  r)(void*); /* Ca
1710: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1720: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1730: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  es */.  int nPag
1740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1750: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1760: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
1770: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1780: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17a0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
17b0: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
17c0: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
17d0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
17e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
17f0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
1800: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
1810: 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69  che */.  int nHi
1820: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
1830: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
1840: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
1850: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
1860: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
1870: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1880: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
1890: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18a0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
18b0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
18c0: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
18d0: 20 54 72 75 65 20 69 66 20 69 6e 69 74 69 61 6c   True if initial
18e0: 20 6d 61 67 69 63 20 6f 66 20 6a 6f 75 72 6e 61   magic of journa
18f0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
1900: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 44 6f 20 6e 6f 74 20 75 73 65 20 61 20 72 6f 6c  Do not use a rol
1930: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
1940: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1950: 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20  u8 ckptOpen;    
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1970: 72 75 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  rue if the check
1980: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  point journal is
1990: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b   open */.  u8 ck
19a0: 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  ptInUse;        
19b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
19c0: 65 20 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b  e are in a check
19d0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 63 6b  point */.  u8 ck
19e0: 70 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  ptAutoopen;     
19f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
1a00: 6b 70 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  kpt journal when
1a10: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
1a20: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
1a30: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
1a40: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a50: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
1a60: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
1a70: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1a90: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
1aa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1ab0: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
1ac0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f  SQLITE_UNLOCK, _
1af0: 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49  READLOCK or _WRI
1b00: 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65  TELOCK */.  u8 e
1b10: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
1b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
1b50: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1b70: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
1b80: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
1b90: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
1bc0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1bd0: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
1c00: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
1c10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c20: 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b  .  u8 dirtyFile;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62 61  * True if databa
1c50: 73 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  se file has chan
1c60: 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a  ged in any way *
1c70: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c80: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c90: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1ca0: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  rollback() for a
1cb0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1cc0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
1cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1ce0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
1cf0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1d00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
1d10: 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20  *aInCkpt;       
1d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1d30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
1d40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1d50: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  e */.  PgHdr *pF
1d60: 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20  irst, *pLast;   
1d70: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1d80: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
1d90: 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65  Hdr *pFirstSynce
1da0: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d;        /* Fir
1db0: 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74  st free page wit
1dc0: 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  h PgHdr.needSync
1dd0: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
1de0: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
1df0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e00: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
1e10: 67 48 64 72 20 2a 70 43 6b 70 74 3b 20 20 20 20  gHdr *pCkpt;    
1e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1e30: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
1e40: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
1e50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
1e60: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
1e70: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
1e80: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
1e90: 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72   number of PgHdr
1ea0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1eb0: 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61  ese are bits tha
1ec0: 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20  t can be set in 
1ed0: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a  Pager.errMask..*
1ee0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1ef0: 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30  ERR_FULL     0x0
1f00: 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20  1  /* a write() 
1f10: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
1f20: 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20  e PAGER_ERR_MEM 
1f30: 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61       0x02  /* ma
1f40: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f  lloc() failed */
1f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1f60: 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34  RR_LOCK     0x04
1f70: 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68    /* error in th
1f80: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
1f90: 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ol */.#define PA
1fa0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
1fb0: 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61   0x08  /* databa
1fc0: 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f  se or journal co
1fd0: 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  rruption */.#def
1fe0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49  ine PAGER_ERR_DI
1ff0: 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20  SK     0x10  /* 
2000: 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f  general disk I/O
2010: 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72   error - bad har
2020: 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a  d drive? */../*.
2030: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
2040: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67  ile contains pag
2050: 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
2060: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f   following.** fo
2070: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75  rmat..**.** Actu
2080: 61 6c 6c 79 2c 20 74 68 69 73 20 73 74 72 75 63  ally, this struc
2090: 74 75 72 65 20 69 73 20 74 68 65 20 63 6f 6d 70  ture is the comp
20a0: 6c 65 74 65 20 70 61 67 65 20 72 65 63 6f 72 64  lete page record
20b0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66 6f   for pager.** fo
20c0: 72 6d 61 74 73 20 6c 65 73 73 20 74 68 61 6e 20  rmats less than 
20d0: 33 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20 77 69  3.  Beginning wi
20e0: 74 68 20 66 6f 72 6d 61 74 20 33 2c 20 74 68 69  th format 3, thi
20f0: 73 20 72 65 63 6f 72 64 20 69 73 20 73 75 72 72  s record is surr
2100: 6f 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77 6f  ounded.** by two
2110: 20 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74   checksums..*/.t
2120: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
2130: 67 65 52 65 63 6f 72 64 20 50 61 67 65 52 65 63  geRecord PageRec
2140: 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65  ord;.struct Page
2150: 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20  Record {.  Pgno 
2160: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2180: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2190: 20 20 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c    char aData[SQL
21a0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20  ITE_PAGE_SIZE]; 
21b0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74   /* Original dat
21c0: 61 20 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20  a for page pgno 
21d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  */.};../*.** Jou
21e0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
21f0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
2200: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
2210: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
2220: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2230: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
2240: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
2250: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
2260: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2270: 65 20 74 68 72 65 65 20 6a 6f 75 72 6e 61 6c 20  e three journal 
2280: 66 6f 72 6d 61 74 73 20 28 73 6f 20 66 61 72 29  formats (so far)
2290: 2e 20 54 68 65 20 31 73 74 20 6a 6f 75 72 6e 61  . The 1st journa
22a0: 6c 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a  l format writes.
22b0: 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ** 32-bit intege
22c0: 72 73 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f  rs in the byte-o
22d0: 72 64 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74  rder of the host
22e0: 20 6d 61 63 68 69 6e 65 2e 20 20 4e 65 77 0a 2a   machine.  New.*
22f0: 2a 20 66 6f 72 6d 61 74 73 20 77 72 69 74 65 73  * formats writes
2300: 20 69 6e 74 65 67 65 72 73 20 61 73 20 62 69 67   integers as big
2310: 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65  -endian.  All ne
2320: 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74  w journals use t
2330: 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74  he.** new format
2340: 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 74 6f  , but we have to
2350: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64   be able to read
2360: 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61   an older journa
2370: 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  l in order.** to
2380: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2390: 6c 73 20 63 72 65 61 74 65 64 20 62 79 20 6f 6c  ls created by ol
23a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
23b0: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a  the library..**.
23c0: 2a 2a 20 54 68 65 20 33 72 64 20 6a 6f 75 72 6e  ** The 3rd journ
23d0: 61 6c 20 66 6f 72 6d 61 74 20 28 61 64 64 65 64  al format (added
23e0: 20 66 6f 72 20 32 2e 38 2e 30 29 20 61 64 64 73   for 2.8.0) adds
23f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
2400: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
2410: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2420: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
2430: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
2440: 68 69 6c 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  hile the.** jour
2450: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
2460: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
2470: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
2480: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 0a 2a  ight appear in.*
2490: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
24a0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
24b0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
24c0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
24d0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
24e0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
24f0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2500: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
2510: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
2520: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
2530: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
2540: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
2550: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
2560: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
2570: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
2580: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
2590: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
25a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
25b0: 68 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66  he 3rd journal f
25c0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
25d0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
25e0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
25f0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
2600: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
2610: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
2620: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
2630: 65 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e SQLITE_PAGE_SI
2640: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
2650: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
2660: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
2670: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
2680: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
2690: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
26a0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
26b0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
26c0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
26d0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
26e0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
26f0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
2700: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
2710: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2720: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
2730: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
2740: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
2750: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
2760: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
2770: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
2780: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
2790: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
27a0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
27b0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
27c0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
27d0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
27e0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
27f0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
2800: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
2810: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
2820: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
2830: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
2840: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
2850: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2860: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
2870: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 5b 5d 20 3d  ournalMagic1[] =
2880: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
2890: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
28a0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
28b0: 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63  xd4,.};.static c
28c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
28d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
28e0: 32 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  2[] = {.  0xd9, 
28f0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
2900: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
2910: 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 73 74 61  63, 0xd5,.};.sta
2920: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
2930: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
2940: 4d 61 67 69 63 33 5b 5d 20 3d 20 7b 0a 20 20 30  Magic3[] = {.  0
2950: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
2960: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
2970: 31 2c 20 30 78 36 33 2c 20 30 78 64 36 2c 0a 7d  1, 0x63, 0xd6,.}
2980: 3b 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  ;.#define JOURNA
2990: 4c 5f 46 4f 52 4d 41 54 5f 31 20 31 0a 23 64 65  L_FORMAT_1 1.#de
29a0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  fine JOURNAL_FOR
29b0: 4d 41 54 5f 32 20 32 0a 23 64 65 66 69 6e 65 20  MAT_2 2.#define 
29c0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33  JOURNAL_FORMAT_3
29d0: 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   3../*.** The fo
29e0: 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20  llowing integer 
29f0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 61 74 20  determines what 
2a00: 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 77 68  format to use wh
2a10: 65 6e 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20 6e  en creating.** n
2a20: 65 77 20 70 72 69 6d 61 72 79 20 6a 6f 75 72 6e  ew primary journ
2a30: 61 6c 20 66 69 6c 65 73 2e 20 20 42 79 20 64 65  al files.  By de
2a40: 66 61 75 6c 74 20 77 65 20 61 6c 77 61 79 73 20  fault we always 
2a50: 75 73 65 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a  use format 3..**
2a60: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 77   When testing, w
2a70: 65 20 63 61 6e 20 73 65 74 20 74 68 69 73 20 76  e can set this v
2a80: 61 6c 75 65 20 74 6f 20 6f 6c 64 65 72 20 6a 6f  alue to older jo
2a90: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 69 6e  urnal formats in
2aa0: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b   order to.** mak
2ab0: 65 20 73 75 72 65 20 74 68 61 74 20 6e 65 77 65  e sure that newe
2ac0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  r versions of th
2ad0: 65 20 6c 69 62 72 61 72 79 20 61 72 65 20 61 62  e library are ab
2ae0: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  le to rollback o
2af0: 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  lder.** journal 
2b00: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  files..**.** Not
2b10: 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e  e that checkpoin
2b20: 74 20 6a 6f 75 72 6e 61 6c 73 20 61 6c 77 61 79  t journals alway
2b30: 73 20 75 73 65 20 66 6f 72 6d 61 74 20 32 20 61  s use format 2 a
2b40: 6e 64 20 6f 6d 69 74 20 74 68 65 20 68 65 61 64  nd omit the head
2b50: 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  er..*/.#ifdef SQ
2b60: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 6a 6f  LITE_TEST.int jo
2b70: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d 20 33  urnal_format = 3
2b80: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2b90: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20   journal_format 
2ba0: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
2bb0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
2bc0: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
2bd0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
2be0: 6f 75 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63  ournal varies ac
2bf0: 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68  cording.** to wh
2c00: 69 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ich journal form
2c10: 61 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  at is being used
2c20: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2c30: 20 6d 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f   macros figure o
2c40: 75 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20  ut.** the sizes 
2c50: 62 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20  based on format 
2c60: 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66  numbers..*/.#def
2c70: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
2c80: 53 5a 28 58 29 20 5c 0a 20 20 20 28 73 69 7a 65  SZ(X) \.   (size
2c90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2ca0: 31 29 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f  1) + sizeof(Pgno
2cb0: 29 20 2b 20 28 28 58 29 3e 3d 33 29 2a 32 2a 73  ) + ((X)>=3)*2*s
2cc0: 69 7a 65 6f 66 28 75 33 32 29 29 0a 23 64 65 66  izeof(u32)).#def
2cd0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
2ce0: 5a 28 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54  Z(X) \.   (SQLIT
2cf0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69  E_PAGE_SIZE + si
2d00: 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58  zeof(Pgno) + ((X
2d10: 29 3e 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32  )>=3)*sizeof(u32
2d20: 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  ))../*.** Enable
2d30: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2d40: 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a   tracking here:.
2d50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2d60: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
2d70: 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  r_refinfo_enable
2d80: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
2d90: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
2da0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
2db0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
2dc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
2dd0: 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  ger_refinfo_enab
2de0: 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  le ) return;.   
2df0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20   printf(.       
2e00: 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64  "REFCNT: %4d add
2e10: 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
2e20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
2e30: 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f  gno, (int)PGHDR_
2e40: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
2e50: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
2e60: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
2e70: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
2e80: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
2e90: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
2ea0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
2eb0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
2ec0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
2ed0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
2ee0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
2ef0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
2f00: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
2f10: 69 70 74 6f 72 0a 2a 2f 0a 73 74 61 74 69 63 20  iptor.*/.static 
2f20: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 69  int read32bits(i
2f30: 6e 74 20 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c  nt format, OsFil
2f40: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
2f50: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
2f60: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
2f70: 71 6c 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20  qliteOsRead(fd, 
2f80: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
2f90: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
2fa0: 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61  LITE_OK && forma
2fb0: 74 3e 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  t>JOURNAL_FORMAT
2fc0: 5f 31 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  _1 ){.    unsign
2fd0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
2fe0: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
2ff0: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
3000: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
3010: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
3020: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
3030: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
3040: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
3050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3060: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3070: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
3080: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3090: 2e 20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73  .  Writing.** is
30a0: 20 61 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69   always done usi
30b0: 6e 67 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  ng the new journ
30c0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74  al format..*/.st
30d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
30e0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
30f0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
3100: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
3110: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
3120: 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20  format<=1 ){.   
3130: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73   return sqliteOs
3140: 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20  Write(fd, &val, 
3150: 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20  4);.  }.  ac[0] 
3160: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3170: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
3180: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
3190: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
31a0: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
31b0: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
31c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
31d0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
31e0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  4);.}../*.** Wri
31f0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
3200: 67 65 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20  ger into a page 
3210: 68 65 61 64 65 72 20 72 69 67 68 74 20 62 65 66  header right bef
3220: 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ore the.** page 
3230: 64 61 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c  data.  This will
3240: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 50   overwrite the P
3250: 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
3260: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
3270: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
3280: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
3290: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
32a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32b0: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 63  *ac;.  ac = &((c
32c0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
32d0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
32e0: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
32f0: 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 6d  rmat<=1 ){.    m
3300: 65 6d 63 70 79 28 61 63 2c 20 26 76 61 6c 2c 20  emcpy(ac, &val, 
3310: 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
3320: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
3330: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  4) & 0xff;.    a
3340: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
3350: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b   & 0xff;.    ac[
3360: 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20  2] = (val>>8) & 
3370: 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 33 5d 20  0xff;.    ac[3] 
3380: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3390: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  }.}.../*.** Conv
33a0: 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  ert the bits in 
33b0: 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  the pPager->errM
33c0: 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ask into an appr
33d0: 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e  oprate.** return
33e0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
33f0: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f   int pager_errco
3400: 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
3410: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3420: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
3430: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3440: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3450: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
3460: 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28  _PROTOCOL;.  if(
3470: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3480: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53   & PAGER_ERR_DIS
3490: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
34a0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20  TE_IOERR;.  if( 
34b0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
34c0: 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  & PAGER_ERR_FULL
34d0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
34e0: 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50  E_FULL;.  if( pP
34f0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3500: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20  PAGER_ERR_MEM ) 
3510: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3520: 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61  NOMEM;.  if( pPa
3530: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3540: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3550: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
3560: 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e  ORRUPT;.  return
3570: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
3580: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
3590: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
35a0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
35b0: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
35c0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
35d0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
35e0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
35f0: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
3600: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
3610: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
3620: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
3630: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
3640: 20 74 68 65 20 73 71 6c 69 74 65 70 61 67 65 72   the sqlitepager
3650: 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _ckpt_commit().*
3660: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
3670: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
3680: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
3690: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
36a0: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
36b0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
36c0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
36d0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
36e0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
36f0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63  id page_add_to_c
3700: 6b 70 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  kpt_list(PgHdr *
3710: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
3720: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
3730: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
3740: 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b  inCkpt ) return;
3750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
3760: 70 50 72 65 76 43 6b 70 74 3d 3d 30 20 26 26 20  pPrevCkpt==0 && 
3770: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d  pPg->pNextCkpt==
3780: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
3790: 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20 69 66 28  vCkpt = 0;.  if(
37a0: 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 29   pPager->pCkpt )
37b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43  {.    pPager->pC
37c0: 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d  kpt->pPrevCkpt =
37d0: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
37e0: 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 61  >pNextCkpt = pPa
37f0: 67 65 72 2d 3e 70 43 6b 70 74 3b 0a 20 20 70 50  ger->pCkpt;.  pP
3800: 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50  ager->pCkpt = pP
3810: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74  g;.  pPg->inCkpt
3820: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
3830: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
3840: 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 50  from_ckpt_list(P
3850: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
3860: 28 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29  ( !pPg->inCkpt )
3870: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3880: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 29 7b  Pg->pPrevCkpt ){
3890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
38a0: 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65  ->pPrevCkpt->pNe
38b0: 78 74 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  xtCkpt==pPg );. 
38c0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70     pPg->pPrevCkp
38d0: 74 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70  t->pNextCkpt = p
38e0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20  Pg->pNextCkpt;. 
38f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3900: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
3910: 3e 70 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  >pCkpt==pPg );. 
3920: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
3930: 70 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pCkpt = pPg->pNe
3940: 78 74 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 69 66  xtCkpt;.  }.  if
3950: 28 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  ( pPg->pNextCkpt
3960: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3970: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e  pPg->pNextCkpt->
3980: 70 50 72 65 76 43 6b 70 74 3d 3d 70 50 67 20 29  pPrevCkpt==pPg )
3990: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
39a0: 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20  Ckpt->pPrevCkpt 
39b0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74  = pPg->pPrevCkpt
39c0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
39d0: 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50  xtCkpt = 0;.  pP
39e0: 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30  g->pPrevCkpt = 0
39f0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20  ;.  pPg->inCkpt 
3a00: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
3a10: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
3a20: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
3a30: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
3a40: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
3a50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3a60: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
3a70: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
3a80: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
3a90: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
3aa0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
3ab0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
3ac0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
3ad0: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
3ae0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
3af0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
3b00: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
3b10: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
3b20: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
3b30: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
3b40: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
3b50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
3b60: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
3b70: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
3b80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
3b90: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
3ba0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
3bb0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
3bc0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
3bd0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
3be0: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
3bf0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
3c00: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
3c10: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
3c20: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
3c30: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
3c40: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
3c50: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
3c60: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
3c70: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
3c80: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
3c90: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
3ca0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3cb0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
3cc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
3cd0: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
3ce0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
3cf0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
3d00: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
3d10: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
3d20: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
3d30: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
3d40: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
3d50: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
3d60: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
3d70: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
3d80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
3d90: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
3da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61   ){.    sqlitepa
3db0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
3dc0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
3dd0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
3de0: 65 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65  er->fd);.  pPage
3df0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
3e00: 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  E_UNLOCK;.  pPag
3e10: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
3e20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
3e30: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
3e40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
3e50: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
3e60: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
3e70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
3e80: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
3e90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
3ea0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74  en and.** a writ
3eb0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
3ec0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
3ed0: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74  utine releases t
3ee0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77  he database.** w
3ef0: 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  rite lock and ac
3f00: 71 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f  quires a read lo
3f10: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
3f20: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
3f30: 6c 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64  le.** is deleted
3f40: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a   and closed..*/.
3f50: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
3f60: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
3f70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3f80: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
3f90: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
3fa0: 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f  r->state<SQLITE_
3fb0: 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75  WRITELOCK ) retu
3fc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3fd0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
3fe0: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
3ff0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
4000: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  kptOpen ){.    s
4010: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
4020: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
4030: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
4040: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
4050: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4060: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
4070: 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  teOsClose(&pPage
4080: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
4090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
40a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
40b0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
40c0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
40d0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
40e0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
40f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
4100: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
4110: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
4120: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
4130: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
4140: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
4150: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
4160: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
4170: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
4180: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
41a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
41b0: 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  tyFile==0 || pPa
41c0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
41d0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  =0 );.  }.  rc =
41e0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
41f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
4200: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
4220: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
4230: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65  E_READLOCK;.  }e
4240: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
4250: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
4260: 20 69 66 20 61 20 70 72 6f 63 65 73 73 20 64 6f   if a process do
4270: 65 73 20 61 20 42 45 47 49 4e 2c 20 74 68 65 6e  es a BEGIN, then
4280: 20 66 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a 20   forks and the. 
4290: 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63     ** child proc
42a0: 65 73 73 20 64 6f 65 73 20 74 68 65 20 43 4f 4d  ess does the COM
42b0: 4d 49 54 2e 20 20 42 65 63 61 75 73 65 20 6f 66  MIT.  Because of
42c0: 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
42d0: 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69  f unix.    ** fi
42e0: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20  le locking, the 
42f0: 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c  unlock will fail
4300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
4310: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
4320: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  ITE_UNLOCK;.  }.
4330: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4340: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
4350: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
4360: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
4370: 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61   of data..*/.sta
4380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
4390: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
43a0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
43b0: 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29  nst char *aData)
43c0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
43d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
43e0: 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75  t + pgno;.  retu
43f0: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
4410: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
4420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
4430: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
4440: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
4450: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
4460: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
4470: 72 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66  re are three dif
4480: 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  ferent journal f
4490: 6f 72 6d 61 74 73 2e 20 20 54 68 65 20 66 6f 72  ormats.  The for
44a0: 6d 61 74 20 70 61 72 61 6d 65 74 65 72 20 64 65  mat parameter de
44b0: 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 69 63  termines.** whic
44c0: 68 20 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64  h format is used
44d0: 20 62 79 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   by the journal 
44e0: 74 68 61 74 20 69 73 20 70 6c 61 79 65 64 20 62  that is played b
44f0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
4500: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
4510: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
4520: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
4530: 20 2a 6a 66 64 2c 20 69 6e 74 20 66 6f 72 6d 61   *jfd, int forma
4540: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
4550: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
4560: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
4570: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
4580: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
4590: 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b  ageRecord pgRec;
45a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 0a 20  .  u32 cksum;.. 
45b0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
45c0: 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 70  (format, jfd, &p
45d0: 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66  gRec.pgno);.  if
45e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
45f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
4600: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
4610: 28 6a 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61  (jfd, &pgRec.aDa
4620: 74 61 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63  ta, sizeof(pgRec
4630: 2e 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20  .aData));.  if( 
4640: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
4650: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
4660: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
4670: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
4680: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
4690: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
46a0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
46b0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
46c0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
46d0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
46e0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
46f0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
4700: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
4710: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
4720: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
4730: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
4740: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
4750: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
4760: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
4770: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
4780: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
4790: 28 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20  ( pgRec.pgno==0 
47a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
47b0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
47c0: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e   if( pgRec.pgno>
47d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
47e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
47f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
4800: 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41  ( format>=JOURNA
4810: 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20  L_FORMAT_3 ){.  
4820: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
4830: 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26  s(format, jfd, &
4840: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
4850: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
4860: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
4870: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 52 65  sum(pPager, pgRe
4880: 63 2e 70 67 6e 6f 2c 20 70 67 52 65 63 2e 61 44  c.pgno, pgRec.aD
4890: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
48a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
48b0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
48c0: 20 7d 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63   }..  /* Playbac
48d0: 6b 20 74 68 65 20 70 61 67 65 2e 20 20 55 70 64  k the page.  Upd
48e0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
48f0: 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61  y copy of the pa
4900: 67 65 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73  ge.  ** at the s
4910: 61 6d 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65  ame time, if the
4920: 72 65 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  re is one..  */.
4930: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
4940: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 52  okup(pPager, pgR
4950: 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 54 52 41 43  ec.pgno);.  TRAC
4960: 45 32 28 22 50 4c 41 59 42 41 43 4b 20 25 64 5c  E2("PLAYBACK %d\
4970: 6e 22 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b  n", pgRec.pgno);
4980: 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28  .  sqliteOsSeek(
4990: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
49a0: 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  Rec.pgno-1)*(off
49b0: 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  _t)SQLITE_PAGE_S
49c0: 49 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IZE);.  rc = sql
49d0: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
49e0: 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44  er->fd, pgRec.aD
49f0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
4a00: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 70 50  _SIZE);.  if( pP
4a10: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  g ){.    if( pPg
4a20: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 0a 20 20 20  ->nRef==0 ||.   
4a30: 20 20 20 20 20 6d 65 6d 63 6d 70 28 50 47 48 44       memcmp(PGHD
4a40: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
4a50: 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c  pgRec.aData, SQL
4a60: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3d 3d  ITE_PAGE_SIZE)==
4a70: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
4a80: 2a 20 44 6f 20 6e 6f 74 20 75 70 64 61 74 65 20  * Do not update 
4a90: 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 69 73  the data on this
4aa0: 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
4ab0: 65 20 69 73 20 69 6e 20 75 73 65 0a 20 20 20 20  e is in use.    
4ac0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 70 61 67    ** and the pag
4ad0: 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
4ae0: 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73   modified.  This
4af0: 20 61 76 6f 69 64 73 20 72 65 73 65 74 74 69 6e   avoids resettin
4b00: 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 22  g.      ** the "
4b10: 65 78 74 72 61 22 20 64 61 74 61 2e 20 20 54 68  extra" data.  Th
4b20: 61 74 20 69 6e 20 74 75 72 6e 20 61 76 6f 69 64  at in turn avoid
4b30: 73 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 42  s invalidating B
4b40: 54 72 65 65 20 63 75 72 73 6f 72 73 0a 20 20 20  Tree cursors.   
4b50: 20 20 20 2a 2a 20 69 6e 20 74 72 65 65 73 20 74     ** in trees t
4b60: 68 61 74 20 68 61 76 65 20 6e 65 76 65 72 20 62  hat have never b
4b70: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
4b80: 68 65 20 65 6e 64 20 72 65 73 75 6c 74 20 69 73  he end result is
4b90: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 79   that.      ** y
4ba0: 6f 75 20 63 61 6e 20 68 61 76 65 20 61 20 53 45  ou can have a SE
4bb0: 4c 45 43 54 20 67 6f 69 6e 67 20 6f 6e 20 69 6e  LECT going on in
4bc0: 20 6f 6e 65 20 74 61 62 6c 65 20 61 6e 64 20 52   one table and R
4bd0: 4f 4c 4c 42 41 43 4b 20 63 68 61 6e 67 65 73 0a  OLLBACK changes.
4be0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 64 69        ** to a di
4bf0: 66 66 65 72 65 6e 74 20 74 61 62 6c 65 20 61 6e  fferent table an
4c00: 64 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  d the SELECT is 
4c10: 75 6e 61 66 66 65 63 74 65 64 20 62 79 20 74 68  unaffected by th
4c20: 65 20 52 4f 4c 4c 42 41 43 4b 2e 0a 20 20 20 20  e ROLLBACK..    
4c30: 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 63 70    */.      memcp
4c40: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
4c50: 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44 61 74  pPg), pgRec.aDat
4c60: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
4c70: 49 5a 45 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  IZE);.      mems
4c80: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
4c90: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
4ca0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
4cb0: 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  }.    pPg->dirty
4cc0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 0;.    pPg->n
4cd0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  eedSync = 0;.  }
4ce0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4cf0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
4d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
4d10: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
4d20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
4d30: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
4d40: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
4d50: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
4d60: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
4d70: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
4d80: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
4d90: 20 66 6f 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65   follows:  There
4da0: 20 69 73 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a   is an initial.*
4db0: 2a 20 66 69 6c 65 2d 74 79 70 65 20 73 74 72 69  * file-type stri
4dc0: 6e 67 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ng for sanity ch
4dd0: 65 63 6b 69 6e 67 2e 20 20 54 68 65 6e 20 74 68  ecking.  Then th
4de0: 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 0a  ere is a single.
4df0: 2a 2a 20 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77  ** Pgno number w
4e00: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
4e10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4e20: 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
4e30: 72 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 65  re.** changes we
4e40: 72 65 20 6d 61 64 65 2e 20 20 54 68 65 20 64 61  re made.  The da
4e50: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
4e60: 74 65 64 20 74 6f 20 74 68 69 73 20 73 69 7a 65  ted to this size
4e70: 2e 0a 2a 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a  ..** Next come z
4e80: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
4e90: 20 72 65 63 6f 72 64 73 20 77 68 65 72 65 20 65   records where e
4ea0: 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 0a  ach page record.
4eb0: 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
4ec0: 20 50 67 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45   Pgno and SQLITE
4ed0: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
4ee0: 20 6f 66 20 64 61 74 61 2e 20 20 53 65 65 0a 2a   of data.  See.*
4ef0: 2a 20 74 68 65 20 50 61 67 65 52 65 63 6f 72 64  * the PageRecord
4f00: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 64   structure for d
4f10: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  etails..**.** If
4f20: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
4f30: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
4f40: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
4f50: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
4f60: 72 6e 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65  rnal file (as de
4f70: 74 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b  termined by look
4f80: 69 6e 67 20 61 74 20 74 68 65 20 6d 61 67 69 63  ing at the magic
4f90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68   number.** at th
4fa0: 65 20 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65  e beginning) the
4fb0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
4fc0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52  eturns SQLITE_PR
4fd0: 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e  OTOCOL..** If an
4fe0: 79 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f  y other errors o
4ff0: 63 63 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79  ccur during play
5000: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
5010: 73 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c  se will.** likel
5020: 79 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  y be corrupted, 
5030: 73 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52  so the PAGER_ERR
5040: 5f 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20  _CORRUPT bit is 
5050: 73 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72  set in.** pPager
5060: 2d 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51  ->errMask and SQ
5070: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
5080: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74  returned.  If it
5090: 20 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74   all.** works, t
50a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
50b0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
50c0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
50d0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
50e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
50f0: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69  int useJournalSi
5100: 7a 65 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a  ze){.  off_t szJ
5110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5120: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
5130: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
5140: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ytes */.  int nR
5150: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
5160: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5170: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
5180: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
5190: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
51a0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
51b0: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
51c0: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
51d0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
51e0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
51f0: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
5200: 74 20 66 6f 72 6d 61 74 3b 20 20 20 20 20 20 20  t format;       
5210: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74         /* Format
5220: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
5230: 66 69 6c 65 2e 20 2a 2f 0a 20 20 75 6e 73 69 67  file. */.  unsig
5240: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5250: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
5260: 61 67 69 63 31 29 5d 3b 0a 20 20 69 6e 74 20 72  agic1)];.  int r
5270: 63 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  c;..  /* Figure 
5280: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
5290: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
52a0: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
52b0: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
52c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
52d0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
52e0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
52f0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
5300: 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  teOsSeek(&pPager
5310: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63 20  ->jfd, 0);.  rc 
5320: 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  = sqliteOsFileSi
5330: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
5340: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
5350: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5360: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
5370: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  back;.  }.  if( 
5380: 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61  szJ < sizeof(aMa
5390: 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f  gic)+sizeof(Pgno
53a0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ) ){.    goto en
53b0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
53c0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62  .  /* Read the b
53d0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
53e0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e  journal and trun
53f0: 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61  cate the.  ** da
5400: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
5410: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
5420: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
5430: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
5440: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  &pPager->jfd, aM
5450: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
5460: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21  gic));.  if( rc!
5470: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5480: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
5490: 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f  OTOCOL;.    goto
54a0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
54b0: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
54c0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
54d0: 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66 28 61  Magic3, sizeof(a
54e0: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
54f0: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
5500: 41 4c 5f 46 4f 52 4d 41 54 5f 33 3b 0a 20 20 7d  AL_FORMAT_3;.  }
5510: 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28  else if( memcmp(
5520: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5530: 4d 61 67 69 63 32 2c 20 73 69 7a 65 6f 66 28 61  Magic2, sizeof(a
5540: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
5550: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
5560: 41 4c 5f 46 4f 52 4d 41 54 5f 32 3b 0a 20 20 7d  AL_FORMAT_2;.  }
5570: 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28  else if( memcmp(
5580: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5590: 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61  Magic1, sizeof(a
55a0: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
55b0: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
55c0: 41 4c 5f 46 4f 52 4d 41 54 5f 31 3b 0a 20 20 7d  AL_FORMAT_1;.  }
55d0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
55e0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
55f0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
5600: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  yback;.  }.  if(
5610: 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c   format>=JOURNAL
5620: 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
5630: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5640: 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72  (format, &pPager
5650: 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20  ->jfd, &nRec);. 
5660: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
5670: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
5680: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
5690: 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67  ts(format, &pPag
56a0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
56b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
56c0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
56d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
56e0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
56f0: 66 66 66 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75  ffffff || useJou
5700: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
5710: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
5720: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 33  JOURNAL_HDR_SZ(3
5730: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
5740: 28 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  (3);.    }.  }el
5750: 73 65 7b 0a 20 20 20 20 6e 52 65 63 20 3d 20 28  se{.    nRec = (
5760: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
5770: 52 5f 53 5a 28 32 29 29 2f 4a 4f 55 52 4e 41 4c  R_SZ(2))/JOURNAL
5780: 5f 50 47 5f 53 5a 28 32 29 3b 0a 20 20 20 20 61  _PG_SZ(2);.    a
5790: 73 73 65 72 74 28 20 6e 52 65 63 2a 4a 4f 55 52  ssert( nRec*JOUR
57a0: 4e 41 4c 5f 50 47 5f 53 5a 28 32 29 2b 4a 4f 55  NAL_PG_SZ(2)+JOU
57b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32 29 3d 3d  RNAL_HDR_SZ(2)==
57c0: 73 7a 4a 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  szJ );.  }.  rc 
57d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
57e0: 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  mat, &pPager->jf
57f0: 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28  d, &mxPg);.  if(
5800: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5810: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
5820: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 61  layback;.  }.  a
5830: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
5840: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
5850: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
5860: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72 63  ze==mxPg );.  rc
5870: 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63   = sqliteOsTrunc
5880: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
5890: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
58a0: 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a  E*(off_t)mxPg);.
58b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
58c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
58d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
58e0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
58f0: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20  ze = mxPg;.  .  
5900: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
5910: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
5920: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
5930: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
5940: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
5950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
5960: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  c; i++){.    rc 
5970: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
5980: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
5990: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
59a0: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28  format);.    if(
59b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
59c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
59d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
59e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
59f0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
5a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65  }.  }..  /* Page
5a20: 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
5a30: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
5a40: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65  journal but neve
5a50: 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68  r synced.  ** wh
5a60: 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64  ere not restored
5a70: 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f   by the loop abo
5a80: 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ve.  We have to 
5a90: 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20  restore those.  
5aa0: 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64  ** pages by read
5ab0: 69 6e 67 20 74 68 65 20 62 61 63 6b 20 66 72 6f  ing the back fro
5ac0: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  m the original d
5ad0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
5ae0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5af0: 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
5b00: 70 50 67 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  pPg;.    for(pPg
5b10: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
5b20: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
5b30: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 63 68  xtAll){.      ch
5b40: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50  ar zBuf[SQLITE_P
5b50: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20  AGE_SIZE];.     
5b60: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
5b70: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5b80: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
5b90: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
5ba0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
5bb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53         sqliteOsS
5bc0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
5bd0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
5be0: 45 2a 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70  E*(off_t)(pPg->p
5bf0: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  gno-1));.       
5c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
5c10: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
5c20: 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41 47  zBuf, SQLITE_PAG
5c30: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
5c40: 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
5c50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5c60: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
5c70: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  f, 0, SQLITE_PAG
5c80: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 7d  E_SIZE);.      }
5c90: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
5ca0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
5cb0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
5cc0: 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
5cd0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b  TE_PAGE_SIZE) ){
5ce0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
5cf0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
5d00: 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45  g), zBuf, SQLITE
5d10: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
5d20: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
5d30: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c  R_TO_EXTRA(pPg),
5d40: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
5d50: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
5d60: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
5d70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
5d80: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
5d90: 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79 62  }.  }..end_playb
5da0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
5db0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5dc0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
5dd0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
5de0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
5df0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
5e00: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
5e10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
5e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
5e30: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
5e40: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
5e50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5e60: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
5e70: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
5e80: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
5e90: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
5ea0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
5eb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
5ec0: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
5ed0: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
5ee0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
5ef0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
5f00: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
5f10: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
5f20: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
5f30: 20 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70        the checkp
5f40: 6f 69 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  oint is stored i
5f50: 6e 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  n pPager->ckptSi
5f60: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
5f70: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
5f80: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
5f90: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
5fa0: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
5fb0: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 63 68 65  ing back the che
5fc0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2c  ckpoint journal,
5fd0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
5fe0: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
5ff0: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
6000: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
6010: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
6020: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
6030: 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 2e  ager->ckptJSize.
6040: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6050: 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61  ager_ckpt_playba
6060: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
6070: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6090: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
60a0: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
60b0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
60c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
60d0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
60e0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6100: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
6110: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 72  int rc;..  /* Tr
6120: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
6130: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
6140: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
6150: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
6160: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
6170: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
6180: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
6190: 29 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  )pPager->ckptSiz
61a0: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  e);.  pPager->db
61b0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 63  Size = pPager->c
61c0: 6b 70 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  kptSize;..  /* F
61d0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
61e0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
61f0: 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  n the checkpoint
6200: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
6210: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
6220: 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 70 50  >ckptInUse && pP
6230: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6240: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53  n );.  sqliteOsS
6250: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63 70 66  eek(&pPager->cpf
6260: 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20  d, 0);.  nRec = 
6270: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63  pPager->ckptNRec
6280: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
6290: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
62a0: 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  t of the checkpo
62b0: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  int journal and 
62c0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
62d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
62e0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
62f0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
6300: 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65 73 20  nal always uses 
6310: 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 32 20 69 6e  format.  ** 2 in
6320: 73 74 65 61 64 20 6f 66 20 66 6f 72 6d 61 74 20  stead of format 
6330: 33 20 73 69 6e 63 65 20 69 74 20 64 6f 65 73 20  3 since it does 
6340: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  not need to be c
6350: 6f 6e 63 65 72 6e 65 64 20 77 69 74 68 0a 20 20  oncerned with.  
6360: 2a 2a 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ** power failure
6370: 73 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  s corrupting the
6380: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 63 61 6e   journal and can
6390: 20 74 68 75 73 20 6f 6d 69 74 20 74 68 65 20 63   thus omit the c
63a0: 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2f 0a 20  hecksums..  */. 
63b0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
63c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
63d0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
63e0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
63f0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66  er, &pPager->cpf
6400: 64 2c 20 32 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 2);.    asser
6410: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
6420: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
6430: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
6440: 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79  to end_ckpt_play
6450: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
6460: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
6470: 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64 20 74  any pages need t
6480: 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  o be copied out 
6490: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
64a0: 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  on.  ** journal.
64b0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
64c0: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
64d0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
64e0: 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  ckptJSize);.  if
64f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6500: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
6510: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  ckpt_playback;. 
6520: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6530: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
6540: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
6550: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
6570: 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63  end_ckpt_playbac
6580: 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20  k;.  }.  nRec = 
6590: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 63  (szJ - pPager->c
65a0: 6b 70 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41  kptJSize)/JOURNA
65b0: 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
65c0: 66 6f 72 6d 61 74 29 3b 0a 20 20 66 6f 72 28 69  format);.  for(i
65d0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
65e0: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
65f0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
6600: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
6610: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 6f 75 72  Pager->jfd, jour
6620: 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20  nal_format);.   
6630: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6640: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
6650: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
6660: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
6670: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
6680: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ack;.    }.  }. 
6690: 20 0a 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62   .end_ckpt_playb
66a0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
66b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
66c0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
66d0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
66e0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
66f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
6700: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6710: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
6720: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
6730: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
6740: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
6750: 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  llowed..**.** Th
6760: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
6770: 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65   is the absolute
6780: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78   value of the mx
6790: 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  Page parameter..
67a0: 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73 20  ** If mxPage is 
67b0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f  negative, the no
67c0: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73  Sync flag is als
67d0: 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62  o set.  noSync b
67e0: 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73  ypasses.** calls
67f0: 20 74 6f 20 73 71 6c 69 74 65 4f 73 53 79 6e 63   to sqliteOsSync
6800: 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72  ().  The pager r
6810: 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20  uns much faster 
6820: 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a  with noSync on,.
6830: 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70  ** but if the op
6840: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
6850: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
6860: 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  is an abrupt pow
6870: 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20  er .** failure, 
6880: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6890: 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  e might be left 
68a0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
68b0: 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61  nt and.** unrepa
68c0: 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a  irable state.  .
68d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
68e0: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
68f0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
6900: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
6910: 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b  if( mxPage>=0 ){
6920: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
6930: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
6940: 6d 70 46 69 6c 65 3b 0a 20 20 7d 65 6c 73 65 7b  mpFile;.  }else{
6950: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
6960: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50  ync = 1;.    mxP
6970: 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20  age = -mxPage;. 
6980: 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e   }.  if( mxPage>
6990: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
69a0: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
69b0: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
69c0: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
69d0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
69e0: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
69f0: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
6a00: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
6a10: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
6a20: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
6a30: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
6a40: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
6a50: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
6a60: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
6a70: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
6a80: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
6a90: 74 65 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  teOsSync() is ne
6aa0: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
6ab0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
6ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6ad0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
6ae0: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
6af0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
6b00: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
6b10: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
6b20: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
6b30: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
6b50: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
6b60: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
6b70: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
6b80: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
6b90: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
6ba0: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
6bb0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
6bc0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
6bd0: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
6be0: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
6bf0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
6c00: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
6c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
6c20: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
6c30: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
6c40: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
6c50: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
6c60: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
6c70: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
6c80: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
6c90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
6ca0: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
6cb0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
6cc0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
6cd0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
6ce0: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
6cf0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
6d00: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a  being written.**
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
6d20: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
6d30: 20 73 79 6e 63 73 2e 20 20 49 66 20 77 65 20 61   syncs.  If we a
6d40: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
6d50: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
6d60: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
6d70: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
6d80: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
6d90: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
6da0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
6db0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
6dc0: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
6dd0: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
6de0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
6df0: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
6e00: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
6e10: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
6e20: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
6e30: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
6e40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6e50: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
6e60: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
6e70: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
6e80: 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  3..*/.void sqlit
6e90: 65 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  epager_set_safet
6ea0: 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  y_level(Pager *p
6eb0: 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
6ec0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
6ed0: 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
6ee0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
6ef0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
6f00: 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
6f10: 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
6f20: 65 6d 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  empFile;.}../*.*
6f30: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
6f40: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
6f50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6f60: 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a  file into zName.
6f70: 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62  ** (zName must b
6f80: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
6f90: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
6fa0: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
6fb0: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
6fc0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
6fd0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
6fe0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
6ff0: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
7000: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
7010: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
7020: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
7030: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
7040: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
7050: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
7060: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
7070: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 70 61  tic int sqlitepa
7080: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
7090: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
70a0: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
70b0: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
70c0: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
70d0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d  .    sqliteOsTem
70e0: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
70f0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
7100: 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  eOsOpenExclusive
7110: 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a  (zFile, fd, 1);.
7120: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
7130: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
7140: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
7150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
7160: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
7170: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
7180: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
7190: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
71a0: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
71b0: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
71c0: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
71d0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
71e0: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
71f0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
7200: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29  qlitepager_get()
7210: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
7220: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
7230: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
7240: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
7250: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
7260: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
7270: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
7280: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
7290: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
72a0: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
72b0: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
72c0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
72d0: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
72e0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
72f0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
7300: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
7310: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
7320: 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  epager_open(.  P
7330: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
7340: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7350: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
7360: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
7370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
7380: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
7390: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
73a0: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
73b0: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20  .  int mxPage,  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
73d0: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  ax number of in-
73e0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
73f0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  es */.  int nExt
7400: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
7410: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
7420: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
7430: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
7440: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
7450: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  l           /* T
7460: 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c  RUE to use a rol
7470: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
7480: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
7490: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
74a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
74b0: 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  athname;.  int n
74c0: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
74d0: 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   fd;.  int rc;. 
74e0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20   int tempFile;. 
74f0: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
7500: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
7510: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
7520: 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67  SIZE];..  *ppPag
7530: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  er = 0;.  if( sq
7540: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
7550: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
7560: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7570: 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61   }.  if( zFilena
7580: 6d 65 20 29 7b 0a 20 20 20 20 7a 46 75 6c 6c 50  me ){.    zFullP
7590: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
75a0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
75b0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Filename);.    r
75c0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e  c = sqliteOsOpen
75d0: 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50  ReadWrite(zFullP
75e0: 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72  athname, &fd, &r
75f0: 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 74 65  eadOnly);.    te
7600: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 65  mpFile = 0;.  }e
7610: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
7620: 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65  litepager_opente
7630: 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  mp(zTemp, &fd);.
7640: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
7650: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
7660: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
7670: 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  eOsFullPathname(
7680: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
7690: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
76a0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  }.  if( sqlite_m
76b0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
76c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
76d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
76e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
76f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
7700: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
7710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
7720: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
7730: 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73   }.  nameLen = s
7740: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
7750: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
7760: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
7770: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
7780: 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20 33 30 20   nameLen*2 + 30 
7790: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
77a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
77b0: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
77c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
77d0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
77e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
77f0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f  OMEM;.  }.  SET_
7800: 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20  PAGER(pPager);. 
7810: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
7820: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
7830: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
7840: 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
7850: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
7860: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
7870: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
7880: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
7890: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
78a0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
78b0: 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  l, zFullPathname
78c0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
78d0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
78e0: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
78f0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
7900: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
7910: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
7920: 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   fd;.  pPager->j
7930: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
7940: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
7950: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
7960: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  l;.  pPager->ckp
7970: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  tOpen = 0;.  pPa
7980: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d  ger->ckptInUse =
7990: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
79a0: 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ef = 0;.  pPager
79b0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
79c0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
79d0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
79e0: 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a  >ckptJSize = 0;.
79f0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
7a00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  = 0;.  pPager->m
7a10: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35  xPage = mxPage>5
7a20: 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a   ? mxPage : 10;.
7a30: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7a40: 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b  = SQLITE_UNLOCK;
7a50: 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  .  pPager->errMa
7a60: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sk = 0;.  pPager
7a70: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
7a80: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
7a90: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
7aa0: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
7ab0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
7ac0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
7ad0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
7ae0: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
7af0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
7b00: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7b10: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
7b20: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
7b30: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
7b40: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74  r->nExtra = nExt
7b50: 72 61 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  ra;.  memset(pPa
7b60: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
7b70: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
7b80: 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65  ash));.  *ppPage
7b90: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
7ba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
7bc0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
7bd0: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
7be0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
7bf0: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
7c00: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
7c10: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7c20: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
7c30: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
7c40: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
7c50: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
7c60: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
7c70: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
7c80: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
7c90: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
7ca0: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
7cb0: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
7cc0: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
7cd0: 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  tepager_close().
7ce0: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
7cf0: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
7d00: 64 20 62 79 20 73 71 6c 69 74 65 70 61 67 65 72  d by sqlitepager
7d10: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  _unref()..*/.voi
7d20: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65  d sqlitepager_se
7d30: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
7d40: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
7d50: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 29   (*xDesc)(void*)
7d60: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
7d70: 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
7d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7d90: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
7da0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
7db0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
7dc0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
7dd0: 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  pPager..*/.int s
7de0: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63  qlitepager_pagec
7df0: 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
7e00: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a  er){.  off_t n;.
7e10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7e20: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
7e30: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
7e40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
7e50: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
7e60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46  .  if( sqliteOsF
7e70: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
7e80: 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45  >fd, &n)!=SQLITE
7e90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
7ea0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
7eb0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20  GER_ERR_DISK;.  
7ec0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7ed0: 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41    n /= SQLITE_PA
7ee0: 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70  GE_SIZE;.  if( p
7ef0: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
7f00: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  LITE_UNLOCK ){. 
7f10: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
7f20: 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  e = n;.  }.  ret
7f30: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
7f40: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
7f50: 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
7f60: 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
7f70: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
7f80: 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
7f90: 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
7fa0: 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
7fb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7fc0: 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
7fd0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
7fe0: 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
7ff0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
8000: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
8010: 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
8020: 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
8030: 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
8040: 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
8050: 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
8060: 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
8070: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
8080: 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
8090: 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
80a0: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e   coredump..*/.in
80b0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c  t sqlitepager_cl
80c0: 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
80d0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
80e0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74  , *pNext;.  swit
80f0: 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ch( pPager->stat
8100: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
8110: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20  LITE_WRITELOCK: 
8120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61  {.      sqlitepa
8130: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
8140: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
8150: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
8160: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
8170: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
8180: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
8190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
81a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
81b0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a  ITE_READLOCK: {.
81c0: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e        sqliteOsUn
81d0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
81e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
81f0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
8200: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
8210: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
8220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8230: 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
8240: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8250: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
8260: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
8270: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
8280: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
8290: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
82a0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
82b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
82c0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
82d0: 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
82e0: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
82f0: 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
8300: 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
8310: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
8320: 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
8330: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
8340: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
8350: 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f 50  * }.  */.  CLR_P
8360: 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20  AGER(pPager);.  
8370: 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  if( pPager->zFil
8380: 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29 26 70  ename!=(char*)&p
8390: 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20 20 20  Pager[1] ){.    
83a0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
83b0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
83c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
83d0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
83e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
83f0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
8400: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8410: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8420: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
8430: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
8440: 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
8450: 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65  sqlitepager_page
8460: 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61  number(void *pDa
8470: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20  ta){.  PgHdr *p 
8480: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
8490: 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
84a0: 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a   p->pgno;.}../*.
84b0: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
84c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
84d0: 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
84e0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
84f0: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
8500: 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
8510: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
8520: 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
8530: 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
8540: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a  he freelist..*/.
8550: 23 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66  #define page_ref
8560: 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66  (P)   ((P)->nRef
8570: 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29  ==0?_page_ref(P)
8580: 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66  :(void)(P)->nRef
8590: 2b 2b 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ++).static void 
85a0: 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
85b0: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
85c0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
85d0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
85e0: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
85f0: 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
8600: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
8610: 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
8620: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
8630: 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
8640: 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
8650: 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
8660: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
8670: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
8680: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
8690: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
86a0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
86b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
86c0: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
86d0: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
86e0: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
86f0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
8700: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8710: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
8720: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
8730: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
8740: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
8750: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
8760: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
8770: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
8780: 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
8790: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
87a0: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
87b0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
87c0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
87d0: 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
87e0: 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
87f0: 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
8800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
8810: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
8820: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
8830: 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
8840: 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
8850: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
8860: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
8870: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  nt sqlitepager_r
8880: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
8890: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
88a0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
88b0: 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66  ata);.  page_ref
88c0: 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
88d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
88e0: 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
88f0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 6e 20 77 72  rnal and then wr
8900: 69 74 65 20 61 6c 6c 20 66 72 65 65 20 64 69 72  ite all free dir
8910: 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
8920: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
8930: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69 6e 67 20  ..**.** Writing 
8940: 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20 70  all free dirty p
8950: 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
8960: 62 61 73 65 20 61 66 74 65 72 20 74 68 65 20 73  base after the s
8970: 79 6e 63 20 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d  ync is a.** non-
8980: 6f 62 76 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  obvious optimiza
8990: 74 69 6f 6e 2e 20 20 66 73 79 6e 63 28 29 20 69  tion.  fsync() i
89a0: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
89b0: 70 65 72 61 74 69 6f 6e 20 73 6f 20 77 65 0a 2a  peration so we.*
89c0: 2a 20 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69  * want to minimi
89d0: 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 74  ze the number ot
89e0: 20 74 69 6d 65 73 20 69 74 20 69 73 20 63 61 6c   times it is cal
89f0: 6c 65 64 2e 20 41 66 74 65 72 20 61 6e 20 66 73  led. After an fs
8a00: 79 6e 63 28 29 20 63 61 6c 6c 2c 0a 2a 2a 20 77  ync() call,.** w
8a10: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 77 72  e are free to wr
8a20: 69 74 65 20 64 69 72 74 79 20 70 61 67 65 73 20  ite dirty pages 
8a30: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
8a40: 62 61 73 65 2e 20 20 49 74 20 69 73 20 62 65 73  base.  It is bes
8a50: 74 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  t.** to go ahead
8a60: 20 61 6e 64 20 77 72 69 74 65 20 61 73 20 6d 61   and write as ma
8a70: 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ny dirty pages a
8a80: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 69  s possible to mi
8a90: 6e 69 6d 69 7a 65 20 0a 2a 2a 20 74 68 65 20 72  nimize .** the r
8aa0: 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74 6f  isk of having to
8ab0: 20 64 6f 20 61 6e 6f 74 68 65 72 20 66 73 79 6e   do another fsyn
8ac0: 63 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20 20 57  c() later on.  W
8ad0: 72 69 74 69 6e 67 20 64 69 72 74 79 0a 2a 2a 20  riting dirty.** 
8ae0: 66 72 65 65 20 70 61 67 65 73 20 69 6e 20 74 68  free pages in th
8af0: 69 73 20 77 61 79 20 77 61 73 20 6f 62 73 65 72  is way was obser
8b00: 76 65 64 20 74 6f 20 6d 61 6b 65 20 64 61 74 61  ved to make data
8b10: 62 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  base operations 
8b20: 67 6f 0a 2a 2a 20 75 70 20 74 6f 20 31 30 20 74  go.** up to 10 t
8b30: 69 6d 65 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  imes faster..**.
8b40: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 77 72 69  ** If we are wri
8b50: 74 69 6e 67 20 74 6f 20 74 65 6d 70 6f 72 61 72  ting to temporar
8b60: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 72  y database, ther
8b70: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
8b80: 70 72 65 73 65 72 76 65 0a 2a 2a 20 74 68 65 20  preserve.** the 
8b90: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
8ba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73   journal file, s
8bb0: 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 74 69  o we can save ti
8bc0: 6d 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 0a  me and skip the.
8bd0: 2a 2a 20 66 73 79 6e 63 28 29 2e 0a 2a 2f 0a 73  ** fsync()..*/.s
8be0: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 41 6c  tatic int syncAl
8bf0: 6c 50 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  lPages(Pager *pP
8c00: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
8c10: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
8c20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
8c30: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
8c40: 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
8c50: 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
8c60: 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
8c70: 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
8c80: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
8c90: 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
8ca0: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
8cb0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
8cc0: 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
8cd0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
8ce0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
8cf0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8d00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8d10: 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
8d20: 63 20 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  c );.#ifndef NDE
8d30: 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
8d40: 20 20 20 20 6f 66 66 5f 74 20 68 64 72 53 7a 2c      off_t hdrSz,
8d50: 20 70 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20 20 20   pgSz, jSz;.    
8d60: 20 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f 55 52      hdrSz = JOUR
8d70: 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e  NAL_HDR_SZ(journ
8d80: 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20  al_format);.    
8d90: 20 20 20 20 70 67 53 7a 20 3d 20 4a 4f 55 52 4e      pgSz = JOURN
8da0: 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c  AL_PG_SZ(journal
8db0: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20  _format);.      
8dc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46    rc = sqliteOsF
8dd0: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
8de0: 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
8df0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
8e00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8e10: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8e20: 65 72 2d 3e 6e 52 65 63 2a 70 67 53 7a 2b 68 64  er->nRec*pgSz+hd
8e30: 72 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  rSz==jSz );.    
8e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
8e50: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
8e60: 6d 61 74 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  mat>=3 ){.      
8e70: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20 20    off_t szJ;.   
8e80: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
8e90: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
8ea0: 20 20 20 20 20 20 20 54 52 41 43 45 31 28 22 53         TRACE1("S
8eb0: 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  YNC\n");.       
8ec0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
8ed0: 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
8ee0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
8ef0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
8f00: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
8f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53         sqliteOsS
8f20: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
8f30: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
8f40: 6c 4d 61 67 69 63 31 29 29 3b 0a 20 20 20 20 20  lMagic1));.     
8f50: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
8f60: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
8f70: 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
8f80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
8f90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
8fa0: 20 20 20 20 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e       szJ = JOURN
8fb0: 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61  AL_HDR_SZ(journa
8fc0: 6c 5f 66 6f 72 6d 61 74 29 20 2b 0a 20 20 20 20  l_format) +.    
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
8fe0: 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41  ger->nRec*JOURNA
8ff0: 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
9000: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20 20  format);.       
9010: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
9020: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 7a 4a 29  Pager->jfd, szJ)
9030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9040: 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29  TRACE1("SYNC\n")
9050: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
9060: 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65  iteOsSync(&pPage
9070: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
9080: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
9090: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
90a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
90b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
90c0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
90d0: 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
90e0: 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
90f0: 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
9100: 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
9110: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
9120: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
9130: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
9140: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
9150: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
9160: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
9170: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
9180: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
9190: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
91a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
91b0: 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
91c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
91d0: 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
91e0: 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
91f0: 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
9200: 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
9210: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
9220: 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
9230: 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
9240: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
9250: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
9260: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
9270: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
9280: 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
9290: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
92a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
92b0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
92c0: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
92d0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
92e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
92f0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
9300: 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
9310: 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
9320: 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
9330: 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
9340: 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
9350: 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
9360: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
9370: 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
9380: 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
9390: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
93a0: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
93b0: 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
93c0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
93d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
93e0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
93f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9400: 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
9410: 3e 70 50 61 67 65 72 3b 0a 20 20 77 68 69 6c 65  >pPager;.  while
9420: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
9430: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
9440: 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  rty );.    sqlit
9450: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
9460: 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
9470: 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49  o-1)*(off_t)SQLI
9480: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
9490: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
94a0: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66  Write(&pPager->f
94b0: 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
94c0: 28 70 4c 69 73 74 29 2c 20 53 51 4c 49 54 45 5f  (pList), SQLITE_
94d0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
94e0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
94f0: 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
9500: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c  irty = 0;.    pL
9510: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
9520: 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
9530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9540: 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
9550: 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
9560: 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
9570: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
9580: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9590: 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
95a0: 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
95b0: 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
95c0: 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
95d0: 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
95e0: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
95f0: 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
9600: 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
9610: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
9620: 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
9630: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
9640: 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
9650: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
9660: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
9670: 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
9680: 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
9690: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
96a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
96b0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
96c0: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
96d0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
96e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
96f0: 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
9700: 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
9710: 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
9720: 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
9730: 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
9740: 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
9750: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
9760: 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
9770: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
9780: 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
9790: 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
97a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
97b0: 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
97c0: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
97d0: 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
97e0: 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
97f0: 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
9800: 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
9810: 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
9820: 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
9830: 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
9840: 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
9850: 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
9860: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
9870: 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
9880: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
9890: 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
98a0: 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
98b0: 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
98c0: 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
98d0: 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
98e0: 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
98f0: 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
9900: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
9910: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
9920: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
9930: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
9940: 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72  also sqlitepager
9950: 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  _lookup().  Both
9960: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
9970: 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
9980: 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
9990: 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
99a0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
99b0: 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
99c0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
99d0: 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
99e0: 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
99f0: 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
9a00: 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
9a10: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
9a20: 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
9a30: 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
9a40: 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
9a50: 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
9a60: 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
9a70: 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
9a80: 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
9a90: 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
9aa0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
9ab0: 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
9ac0: 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
9ad0: 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
9ae0: 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
9af0: 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
9b00: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
9b10: 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 50 61  litepager_get(Pa
9b20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
9b30: 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70  o pgno, void **p
9b40: 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  pPage){.  PgHdr 
9b50: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
9b60: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
9b70: 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
9b80: 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
9b90: 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
9ba0: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
9bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
9bc0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
9bd0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
9be0: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
9bf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
9c00: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
9c10: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
9c20: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
9c30: 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
9c40: 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 72  ed, then get a r
9c50: 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ead lock.  ** on
9c60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9c70: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
9c80: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
9c90: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9ca0: 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  eOsReadLock(&pPa
9cb0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66  ger->fd);.    if
9cc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9cd0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
9ce0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
9cf0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
9d00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
9d10: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
9d20: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
9d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
9d40: 74 73 2c 20 74 72 79 20 74 6f 20 70 6c 61 79 20  ts, try to play 
9d50: 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  it back..    */.
9d60: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9d70: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 73 71  useJournal && sq
9d80: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73  liteOsFileExists
9d90: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
9da0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74  l) ){.       int
9db0: 20 72 63 2c 20 64 75 6d 6d 79 3b 0a 0a 20 20 20   rc, dummy;..   
9dc0: 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72 69      /* Get a wri
9dd0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
9de0: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 2a  atabase.       *
9df0: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
9e00: 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28  liteOsWriteLock(
9e10: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
9e20: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
9e30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9e40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 55     if( sqliteOsU
9e50: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
9e60: 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  d)!=SQLITE_OK ){
9e70: 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
9e80: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
9e90: 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20 20 20 20   happen! */.    
9ea0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
9eb0: 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
9ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9ed0: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
9ee0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
9ef0: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
9f00: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
9f10: 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  = SQLITE_WRITELO
9f20: 43 4b 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f  CK;..       /* O
9f30: 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
9f40: 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
9f50: 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 53 51  cess.  Return SQ
9f60: 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
9f70: 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
9f80: 20 67 65 74 20 65 78 63 6c 75 73 69 76 65 20 61   get exclusive a
9f90: 63 63 65 73 73 20 74 6f 20 74 68 65 20 6a 6f 75  ccess to the jou
9fa0: 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
9fb0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20     **.       ** 
9fc0: 45 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 77  Even though we w
9fd0: 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 72 65 61 64  ill only be read
9fe0: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
9ff0: 72 6e 61 6c 2c 20 6e 6f 74 20 77 72 69 74 69 6e  rnal, not writin
a000: 67 2c 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  g,.       ** we 
a010: 68 61 76 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  have to open the
a020: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 77 72 69   journal for wri
a030: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
a040: 20 6f 62 74 61 69 6e 20 61 6e 0a 20 20 20 20 20   obtain an.     
a050: 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
a060: 63 63 65 73 73 20 6c 6f 63 6b 2e 0a 20 20 20 20  ccess lock..    
a070: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
a080: 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65  = sqliteOsOpenRe
a090: 61 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  adWrite(pPager->
a0a0: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
a0b0: 72 2d 3e 6a 66 64 2c 20 26 64 75 6d 6d 79 29 3b  r->jfd, &dummy);
a0c0: 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
a0d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a0e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a0f0: 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  eOsUnlock(&pPage
a100: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
a110: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
a120: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a130: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
a140: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a150: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
a160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
a170: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
a180: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61   = 1;.       pPa
a190: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
a1a0: 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ted = 0;..      
a1b0: 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
a1c0: 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
a1d0: 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
a1e0: 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
a1f0: 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
a200: 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
a210: 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
a220: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
a230: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
a240: 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
a250: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a260: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
a270: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
a280: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
a290: 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
a2a0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
a2b0: 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  r page in cache 
a2c0: 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
a2d0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
a2e0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
a2f0: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
a300: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
a310: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
a320: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
a330: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20   */.    int h;. 
a340: 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73     pPager->nMiss
a350: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
a360: 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
a370: 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67  ->mxPage || pPag
a380: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 29 7b  er->pFirst==0 ){
a390: 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
a3a0: 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
a3b0: 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
a3c0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
a3d0: 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54  of(*pPg) + SQLIT
a3e0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  E_PAGE_SIZE .   
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
a410: 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
a420: 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20 20 20  r->nExtra );.   
a430: 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
a440: 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
a450: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 61   = 0;.        pa
a460: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
a470: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
a480: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
a490: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45   |= PAGER_ERR_ME
a4a0: 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  M;.        retur
a4b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
a4d0: 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
a4e0: 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
a4f0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
a500: 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
a510: 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
a520: 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
a530: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
a540: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ll ){.        pP
a550: 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65  ager->pAll->pPre
a560: 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  vAll = pPg;.    
a570: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
a580: 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20  PrevAll = 0;.   
a590: 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
a5a0: 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
a5b0: 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
a5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a5d0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
a5e0: 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
a5f0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
a600: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
a610: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75      ** require u
a620: 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
a630: 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
a640: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
a650: 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
a660: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
a670: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f       /* If we co
a680: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
a690: 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
a6a0: 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
a6b0: 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  nc().      ** on
a6c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a6d0: 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
a6e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
a6f0: 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20  This is a.      
a700: 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
a710: 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
a720: 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
a730: 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
a740: 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  mes.      ** it 
a750: 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
a760: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a770: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
a780: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
a790: 79 6e 63 41 6c 6c 50 61 67 65 73 28 70 50 61 67  yncAllPages(pPag
a7a0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
a7b0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
a7c0: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
a7d0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
a7e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50  ;.          *ppP
a7f0: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
a800: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a810: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
a820: 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
a830: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
a840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a850: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
a860: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
a870: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
a880: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
a890: 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
a8a0: 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
a8b0: 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
a8c0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
a8d0: 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
a8e0: 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
a8f0: 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
a900: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
a910: 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
a920: 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
a930: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a940: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a950: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
a960: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
a970: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  .          *ppPa
a980: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
a990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a9a0: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
a9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a9c0: 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
a9d0: 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f  y==0 );..      /
a9e0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65  * If the page we
a9f0: 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69   are recycling i
aa00: 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  s marked as alwa
aa10: 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  ysRollback, then
aa20: 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68  .      ** set th
aa30: 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
aa40: 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
aa50: 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
aa60: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
aa70: 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
aa80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
aa90: 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
aaa0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
aab0: 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e        ** It is n
aac0: 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
aad0: 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
aae0: 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
aaf0: 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  ysRollback.     
ab00: 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
ab10: 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
ab20: 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
ab30: 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
ab40: 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20   remember.      
ab50: 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d  ** that is was m
ab60: 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
ab70: 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e  back.  This mean
ab80: 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  s that all pages
ab90: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
aba0: 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
abb0: 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
abc0: 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20  here on out..   
abd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
abe0: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
abf0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ack ){.        p
ac00: 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
ac10: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
ac20: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c   }..      /* Unl
ac30: 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
ac40: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
ac50: 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
ac60: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a   table.      */.
ac70: 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
ac80: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
ac90: 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 50  ced ){.        P
aca0: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
acb0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
acc0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
acd0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
ace0: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
acf0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
ad00: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
ad10: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
ad20: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
ad30: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ree ){.        p
ad40: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
ad50: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
ad60: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
ad70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ad80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ad90: 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20  pFirst==pPg );. 
ada0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
adb0: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
adc0: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a  xtFree;.      }.
add0: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
ade0: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
adf0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
ae00: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
ae10: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
ae20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
ae40: 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
ae50: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
ae60: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
ae70: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20  pPrevFree;.     
ae80: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e   }.      pPg->pN
ae90: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
aea0: 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 20 20  PrevFree = 0;.  
aeb0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
aec0: 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
aed0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
aee0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
aef0: 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
af00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
af10: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29  pPg->pPrevHash )
af20: 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
af30: 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
af40: 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
af50: 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Hash;.      }els
af60: 65 7b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 70  e{.        h = p
af70: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
af80: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  gno);.        as
af90: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
afa0: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
afb0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
afc0: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70  Hash[h] = pPg->p
afd0: 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20  NextHash;.      
afe0: 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  }.      pPg->pNe
aff0: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
b000: 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  revHash = 0;.   
b010: 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c     pPager->nOvfl
b020: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ++;.    }.    pP
b030: 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
b040: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b050: 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
b060: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
b070: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
b080: 20 20 20 20 20 73 71 6c 69 74 65 43 68 65 63 6b       sqliteCheck
b090: 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
b0a0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
b0b0: 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
b0c0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b0d0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
b0e0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
b0f0: 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
b100: 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
b110: 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
b120: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
b130: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
b140: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
b150: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
b160: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
b170: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
b180: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
b190: 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70 67  nCkpt && (int)pg
b1a0: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74  no<=pPager->ckpt
b1b0: 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
b1c0: 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
b1d0: 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nCkpt[pgno/8] & 
b1e0: 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
b1f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
b200: 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74  add_to_ckpt_list
b210: 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
b220: 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
b230: 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69  ove_from_ckpt_li
b240: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
b250: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
b260: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
b270: 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
b280: 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
b290: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
b2a0: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
b2b0: 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
b2c0: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
b2d0: 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
b2e0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
b2f0: 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
b300: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
b310: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b320: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
b330: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
b340: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
b350: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
b360: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
b370: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
b380: 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 70  Size<0 ) sqlitep
b390: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
b3a0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
b3b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
b3c0: 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20  int)pgno ){.    
b3d0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
b3e0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
b3f0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
b400: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b410: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
b420: 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26    sqliteOsSeek(&
b430: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
b440: 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49  o-1)*(off_t)SQLI
b450: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
b460: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b470: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
b480: 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
b490: 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50  A(pPg), SQLITE_P
b4a0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
b4b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b4c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  OK ){.        of
b4d0: 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20  f_t fileSize;.  
b4e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
b4f0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
b500: 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65  er->fd,&fileSize
b510: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )!=SQLITE_OK.   
b520: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66              || f
b530: 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 53 51  ileSize>=pgno*SQ
b540: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29  LITE_PAGE_SIZE )
b550: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
b560: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
b570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b580: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
b590: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
b5a0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
b5b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b5c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b5d0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
b5e0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
b5f0: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
b600: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
b610: 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
b620: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
b630: 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
b640: 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
b650: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
b660: 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
b670: 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
b680: 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
b690: 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
b6a0: 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
b6b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b6c0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
b6d0: 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
b6e0: 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
b6f0: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
b700: 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
b710: 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
b720: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
b730: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
b740: 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
b750: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
b760: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
b770: 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f  lso sqlitepager_
b780: 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  get().  The diff
b790: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
b7a0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
b7b0: 6e 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67  nd sqlitepager_g
b7c0: 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
b7d0: 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
b7e0: 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
b7f0: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
b800: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
b810: 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
b820: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
b830: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
b840: 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
b850: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
b860: 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
b870: 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
b880: 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
b890: 76 6f 69 64 20 2a 73 71 6c 69 74 65 70 61 67 65  void *sqlitepage
b8a0: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
b8b0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
b8c0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
b8d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
b8e0: 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
b8f0: 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
b900: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b910: 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
b920: 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
b930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b940: 2f 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  /* if( pPager->n
b950: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 2a 2a 20 20  Ref==0 ){.  **  
b960: 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 2a 20 7d  return 0;.  ** }
b970: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
b980: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
b990: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
b9a0: 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
b9b0: 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  0;.  page_ref(pP
b9c0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g);.  return PGH
b9d0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
b9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
b9f0: 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
ba00: 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
ba10: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
ba20: 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
ba30: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
ba40: 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
ba50: 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
ba60: 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
ba70: 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
ba80: 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
ba90: 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
baa0: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
bab0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
bac0: 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
bad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
bae0: 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
baf0: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
bb00: 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
bb10: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
bb20: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
bb30: 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
bb40: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
bb50: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
bb60: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
bb70: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
bb80: 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
bb90: 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
bba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
bbb0: 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
bbc0: 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
bbd0: 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
bbe0: 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
bbf0: 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
bc00: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
bc10: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
bc20: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
bc30: 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
bc40: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
bc50: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
bc60: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
bc70: 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
bc80: 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
bc90: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
bca0: 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
bcb0: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
bcc0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
bcd0: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
bce0: 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
bcf0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
bd00: 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
bd10: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
bd20: 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
bd30: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
bd40: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
bd50: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
bd60: 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
bd70: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
bd80: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
bd90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
bda0: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 29 3b  structor(pData);
bdb0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
bdc0: 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
bdd0: 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
bde0: 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
bdf0: 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
be00: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
be10: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
be20: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
be30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
be40: 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
be50: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
be60: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
be70: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
be80: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
be90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bea0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
beb0: 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
bec0: 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
bed0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
bee0: 65 61 64 79 20 62 65 20 61 20 77 72 69 74 65 0a  eady be a write.
bef0: 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
bf00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
bf10: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
bf20: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
bf30: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
bf40: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
bf50: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
bf60: 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
bf70: 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
bf80: 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
bf90: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
bfa0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
bfb0: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
bfc0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
bfd0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
bfe0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
bff0: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
c000: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
c010: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
c020: 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
c030: 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
c040: 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72  rnal );.  pPager
c050: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
c060: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
c070: 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
c080: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
c090: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
c0a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73   ){.    sqliteOs
c0b0: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
c0c0: 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  ->fd);.    pPage
c0d0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
c0e0: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20  E_READLOCK;.    
c0f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c100: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
c110: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c  sqliteOsOpenExcl
c120: 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a  usive(pPager->zJ
c130: 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
c140: 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d  >jfd,pPager->tem
c150: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
c160: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c170: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
c180: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
c190: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
c1a0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
c1b0: 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c     sqliteOsReadL
c1c0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
c1d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
c1e0: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
c1f0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  DLOCK;.    retur
c200: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
c210: 4e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  N;.  }.  pPager-
c220: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
c230: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
c240: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
c250: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
c260: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
c270: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
c280: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
c290: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
c2a0: 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  tepager_pagecoun
c2b0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
c2c0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
c2d0: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
c2e0: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
c2f0: 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f  format==JOURNAL_
c300: 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20  FORMAT_3 ){.    
c310: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
c320: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
c330: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 2c   aJournalMagic3,
c340: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
c350: 4d 61 67 69 63 33 29 29 3b 0a 20 20 20 20 69 66  Magic3));.    if
c360: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c370: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  ){.      rc = wr
c380: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
c390: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
c3a0: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
c3b0: 66 66 66 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  fff : 0);.    }.
c3c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c3d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
c3e0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
c3f0: 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 52 61   = (u32)sqliteRa
c400: 6e 64 6f 6d 49 6e 74 65 67 65 72 28 29 3b 0a 20  ndomInteger();. 
c410: 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
c420: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
c430: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  fd, pPager->cksu
c440: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 7d 0a 20 20  mInit);.    }.  
c450: 7d 65 6c 73 65 20 69 66 28 20 6a 6f 75 72 6e 61  }else if( journa
c460: 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41  l_format==JOURNA
c470: 4c 5f 46 4f 52 4d 41 54 5f 32 20 29 7b 0a 20 20  L_FORMAT_2 ){.  
c480: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
c490: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
c4a0: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
c4b0: 32 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  2, sizeof(aJourn
c4c0: 61 6c 4d 61 67 69 63 32 29 29 3b 0a 20 20 7d 65  alMagic2));.  }e
c4d0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
c4e0: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d   journal_format=
c4f0: 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
c500: 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 );.    rc = sq
c510: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
c520: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
c530: 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66  alMagic1, sizeof
c540: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29  (aJournalMagic1)
c550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
c560: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c570: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
c580: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
c590: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
c5a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
c5b0: 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e  er->ckptAutoopen
c5c0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
c5d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
c5e0: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62  litepager_ckpt_b
c5f0: 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
c600: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
c610: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c620: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
c630: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
c640: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c650: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
c660: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
c670: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c680: 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc;  .}../*.** 
c690: 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
c6a0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
c6b0: 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
c6c0: 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
c6d0: 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
c6e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
c6f0: 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
c700: 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69  qlitepager_commi
c710: 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
c720: 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67  *   *  sqlitepag
c730: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
c740: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
c750: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f   sqlitepager_clo
c760: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
c770: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61  **   *  sqlitepa
c780: 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
c790: 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
c7a0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
c7b0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
c7c0: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
c7d0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
c7e0: 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
c7f0: 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
c800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
c810: 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
c820: 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
c830: 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
c840: 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72 65  ly.** to acquire
c850: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
c860: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
c870: 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
c880: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hat there.** is 
c890: 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
c8a0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
c8b0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ase..**.** A jou
c8c0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
c8d0: 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
c8e0: 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
c8f0: 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d  ile.  For.** tem
c900: 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
c910: 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
c920: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
c930: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 0a   deferred until.
c940: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  ** there is an a
c950: 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
c960: 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
c970: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
c980: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
c990: 65 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65  eady write-locke
c9a0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
c9b0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
c9c0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 62  nt sqlitepager_b
c9d0: 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61  egin(void *pData
c9e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
c9f0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
ca00: 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
ca10: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
ca20: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
ca30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
ca40: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
ca50: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
ca60: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
ca70: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  QLITE_UNLOCK );.
ca80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
ca90: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44  ate==SQLITE_READ
caa0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
cab0: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
cac0: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
cad0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
cae0: 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  iteLock(&pPager-
caf0: 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  >fd);.    if( rc
cb00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cb10: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cb20: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
cb30: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
cb40: 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20  _WRITELOCK;.    
cb50: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
cb60: 65 20 3d 20 30 3b 0a 20 20 20 20 54 52 41 43 45  e = 0;.    TRACE
cb70: 31 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 5c 6e  1("TRANSACTION\n
cb80: 22 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ");.    if( pPag
cb90: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
cba0: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
cbb0: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
cbc0: 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
cbd0: 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
cbe0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
cbf0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
cc00: 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
cc10: 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
cc20: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
cc30: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
cc40: 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
cc50: 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
cc60: 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
cc70: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
cc80: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
cc90: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
cca0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
ccb0: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
ccc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
ccd0: 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
cce0: 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
ccf0: 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
cd00: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
cd10: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
cd20: 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  If the write.** 
cd30: 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
cd40: 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
cd50: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
cd60: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
cd70: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
cd80: 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
cd90: 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
cda0: 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
cdb0: 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
cdc0: 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
cdd0: 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
cde0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
cdf0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
ce00: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
ce10: 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
ce20: 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
ce30: 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
ce40: 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
ce50: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
ce60: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
ce70: 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
ce80: 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
ce90: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
cea0: 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
ceb0: 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
cec0: 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
ced0: 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
cee0: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f  o sqlitepager_co
cef0: 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
cf00: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
cf10: 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
cf20: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
cf30: 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
cf40: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
cf50: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
cf60: 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
cf70: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
cf80: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
cf90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
cfa0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
cfb0: 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
cfc0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
cfd0: 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
cfe0: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
cff0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
d000: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
d010: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
d020: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
d030: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
d040: 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
d050: 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
d060: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
d070: 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
d080: 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
d090: 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
d0a0: 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70  t away..  */.  p
d0b0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
d0c0: 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
d0d0: 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 43  nal && (pPg->inC
d0e0: 6b 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  kpt || pPager->c
d0f0: 6b 70 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  kptInUse==0) ){.
d100: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
d110: 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 72  yFile = 1;.    r
d120: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d130: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
d140: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
d150: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
d160: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
d170: 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74  e.  ** written t
d180: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
d190: 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
d1a0: 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
d1b0: 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68  nal.  ** or both
d1c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73  ..  **.  ** Firs
d1d0: 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
d1e0: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
d1f0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
d200: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61  ts and.  ** crea
d210: 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
d220: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
d230: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
d240: 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  te!=SQLITE_UNLOC
d250: 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  K );.  rc = sqli
d260: 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  tepager_begin(pD
d270: 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ata);.  if( rc!=
d280: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d290: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d2a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d2b0: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
d2c0: 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 69  WRITELOCK );.  i
d2d0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
d2e0: 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
d2f0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
d300: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
d310: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
d320: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
d330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
d340: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
d350: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
d360: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
d370: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
d380: 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  l );.  pPager->d
d390: 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 0a 20  irtyFile = 1;.. 
d3a0: 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
d3b0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
d3c0: 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
d3d0: 76 65 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  ve a write lock 
d3e0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e  on the.  ** main
d3f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d400: 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
d410: 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 74  nt page to the t
d420: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
d430: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
d440: 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
d450: 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ady..  */.  if( 
d460: 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
d470: 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
d480: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 66 28  urnal ){.    if(
d490: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
d4a0: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
d4b0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  bSize ){.      i
d4c0: 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75  nt szPg;.      u
d4d0: 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  32 saved;.      
d4e0: 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  if( journal_form
d4f0: 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  at>=JOURNAL_FORM
d500: 41 54 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20  AT_3 ){.        
d510: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61 67 65  u32 cksum = page
d520: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
d530: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
d540: 29 3b 0a 20 20 20 20 20 20 20 20 73 61 76 65 64  );.        saved
d550: 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f   = *(u32*)PGHDR_
d560: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b 0a 20  TO_EXTRA(pPg);. 
d570: 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
d580: 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53  ts(cksum, pPg, S
d590: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
d5a0: 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d  ;.        szPg =
d5b0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
d5c0: 45 2b 38 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  E+8;.      }else
d5d0: 7b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d  {.        szPg =
d5e0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
d5f0: 45 2b 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E+4;.      }.   
d600: 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
d610: 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
d620: 34 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  4);.      rc = s
d630: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
d640: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68  ager->jfd, &((ch
d650: 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20  ar*)pData)[-4], 
d660: 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  szPg);.      if(
d670: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e   journal_format>
d680: 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
d690: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 75  3 ){.        *(u
d6a0: 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
d6b0: 52 41 28 70 50 67 29 20 3d 20 73 61 76 65 64 3b  RA(pPg) = saved;
d6c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d6d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d6f0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
d700: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
d710: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
d720: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
d730: 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ULL;.        ret
d740: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
d750: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
d760: 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ec++;.      asse
d770: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
d780: 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
d790: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
d7a0: 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
d7b0: 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
d7c0: 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 50  gno&7);.      pP
d7d0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
d7e0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
d7f0: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
d800: 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nal = 1;.      i
d810: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
d820: 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
d830: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
d840: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
d850: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
d860: 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61  ;.        page_a
d870: 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28  dd_to_ckpt_list(
d880: 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
d890: 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
d8a0: 4e 41 4c 20 25 64 20 25 64 5c 6e 22 2c 20 70 50  NAL %d %d\n", pP
d8b0: 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
d8c0: 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c  edSync);.    }el
d8d0: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
d8e0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
d8f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
d900: 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
d910: 53 79 6e 63 3b 0a 20 20 20 20 20 20 54 52 41 43  Sync;.      TRAC
d920: 45 33 28 22 41 50 50 45 4e 44 20 25 64 20 25 64  E3("APPEND %d %d
d930: 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
d940: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
d950: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
d960: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
d970: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
d980: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d  dSync = 1;.    }
d990: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d9a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
d9b0: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
d9c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
d9d0: 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65   in it,.  ** the
d9e0: 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
d9f0: 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
da00: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
da10: 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
da20: 20 2a 2a 20 74 68 65 20 63 68 65 63 6b 70 6f 69   ** the checkpoi
da30: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79  nt journal alway
da40: 73 20 75 73 65 73 20 74 68 65 20 73 69 6d 70 6c  s uses the simpl
da50: 69 65 72 20 66 6f 72 6d 61 74 20 32 20 74 68 61  ier format 2 tha
da60: 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20 63 68 65  t lacks.  ** che
da70: 63 6b 73 75 6d 73 2e 20 20 54 68 65 20 68 65 61  cksums.  The hea
da80: 64 65 72 20 69 73 20 61 6c 73 6f 20 6f 6d 69 74  der is also omit
da90: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 68 65  ted from the che
daa0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  ckpoint journal.
dab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
dac0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26  er->ckptInUse &&
dad0: 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26   !pPg->inCkpt &&
dae0: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
daf0: 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  =pPager->ckptSiz
db00: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
db10: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
db20: 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
db30: 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
db40: 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 74 6f 72  Size );.    stor
db50: 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
db60: 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
db70: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
db80: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66  ite(&pPager->cpf
db90: 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74  d, &((char*)pDat
dba0: 61 29 5b 2d 34 5d 2c 20 53 51 4c 49 54 45 5f 50  a)[-4], SQLITE_P
dbb0: 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20 20 20  AGE_SIZE+4);.   
dbc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
dbd0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
dbe0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
dbf0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
dc00: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
dc10: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
dc20: 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  L;.      return 
dc30: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
dc40: 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63 2b 2b  ager->ckptNRec++
dc50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
dc60: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30  ager->aInCkpt!=0
dc70: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
dc80: 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e  aInCkpt[pPg->pgn
dc90: 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
dca0: 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61  >pgno&7);.    pa
dcb0: 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c  ge_add_to_ckpt_l
dcc0: 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ist(pPg);.  }.. 
dcd0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
dce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
dcf0: 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
dd00: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
dd10: 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
dd20: 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
dd30: 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
dd40: 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
dd50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
dd60: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
dd70: 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
dd80: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
dd90: 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
dda0: 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 70  ed.** to sqlitep
ddb0: 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49  ager_write().  I
ddc0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
ddd0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
dde0: 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
ddf0: 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
de00: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
de10: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
de20: 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64  iswriteable(void
de30: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
de40: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
de50: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
de60: 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
de70: 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  ty;.}../*.** Rep
de80: 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
de90: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
dea0: 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
deb0: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
dec0: 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
ded0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
dee0: 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
def0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
df00: 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
df10: 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
df20: 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
df30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
df40: 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70  er_get(pPager, p
df50: 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
df60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
df70: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
df80: 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28  litepager_write(
df90: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
dfa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dfb0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
dfc0: 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51 4c 49  age, pData, SQLI
dfd0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
dfe0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 70     }.    sqlitep
dff0: 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
e000: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e010: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  rc;.}../*.** A c
e020: 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
e030: 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
e040: 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
e050: 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
e060: 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
e070: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
e080: 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20   "pgno" back to 
e090: 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
e0a0: 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
e0b0: 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
e0c0: 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a  ed as dirty..**.
e0d0: 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
e0e0: 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
e0f0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
e100: 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
e110: 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
e120: 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
e130: 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67  unused.  The pag
e140: 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
e150: 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
e160: 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
e170: 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
e180: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
e190: 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
e1a0: 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  s optimization, 
e1b0: 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
e1c0: 65 0a 2a 2a 20 73 71 6c 69 74 65 70 61 67 65 72  e.** sqlitepager
e1d0: 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
e1e0: 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
e1f0: 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
e200: 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
e210: 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
e220: 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
e230: 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
e240: 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
e250: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
e260: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
e270: 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
e280: 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
e290: 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
e2a0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
e2b0: 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
e2c0: 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
e2d0: 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
e2e0: 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
e2f0: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
e300: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
e310: 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
e320: 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
e330: 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
e340: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
e350: 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
e360: 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
e370: 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
e380: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
e390: 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
e3a0: 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
e3b0: 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
e3c0: 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
e3d0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
e3e0: 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
e3f0: 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
e400: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
e410: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e420: 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
e430: 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
e440: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
e450: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
e460: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
e470: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
e480: 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
e490: 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
e4a0: 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
e4b0: 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
e4c0: 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
e4d0: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
e4e0: 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
e4f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74  sqlitepager_dont
e500: 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
e510: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
e520: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
e530: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
e540: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
e550: 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  no);.  pPg->alwa
e560: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
e570: 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67    if( pPg && pPg
e580: 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69  ->dirty ){.    i
e590: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
e5a0: 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
e5b0: 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
e5c0: 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
e5d0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
e5e0: 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
e5f0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
e600: 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
e610: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
e620: 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
e630: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
e640: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
e650: 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
e660: 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
e670: 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
e680: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e690: 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
e6a0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
e6b0: 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
e6c0: 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
e6d0: 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
e6e0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
e6f0: 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
e700: 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
e710: 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
e720: 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
e730: 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
e740: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
e750: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
e760: 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
e770: 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
e780: 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
e790: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
e7a0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
e7b0: 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
e7c0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
e7d0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
e7e0: 20 20 20 20 20 54 52 41 43 45 32 28 22 44 4f 4e       TRACE2("DON
e7f0: 54 5f 57 52 49 54 45 20 25 64 5c 6e 22 2c 20 70  T_WRITE %d\n", p
e800: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  gno);.      pPg-
e810: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
e820: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
e830: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
e840: 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
e850: 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
e860: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
e870: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
e880: 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
e890: 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
e8a0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
e8b0: 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
e8c0: 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
e8d0: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
e8e0: 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
e8f0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
e900: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
e910: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
e920: 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
e930: 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
e940: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
e950: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
e960: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
e970: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
e980: 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  er;..  if( pPage
e990: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
e9a0: 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20 70 50  _WRITELOCK || pP
e9b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
e9c0: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
e9d0: 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
e9e0: 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
e9f0: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
ea00: 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ck ) return;.  i
ea10: 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
ea20: 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
ea30: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
ea40: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
ea50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ea60: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
ea70: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
ea80: 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
ea90: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
eaa0: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
eab0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
eac0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
ead0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
eae0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
eaf0: 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f  InCkpt[pPg->pgno
eb00: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
eb10: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
eb20: 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f  age_add_to_ckpt_
eb30: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
eb40: 0a 20 20 20 20 54 52 41 43 45 32 28 22 44 4f 4e  .    TRACE2("DON
eb50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T_ROLLBACK %d\n"
eb60: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
eb70: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
eb80: 63 6b 70 74 49 6e 55 73 65 20 26 26 20 21 70 50  ckptInUse && !pP
eb90: 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e  g->inCkpt && (in
eba0: 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
ebb0: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b  ger->ckptSize ){
ebc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
ebd0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
ebe0: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
ebf0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
ec00: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ec10: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21  pPager->aInCkpt!
ec20: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
ec30: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
ec40: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
ec50: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
ec60: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74  page_add_to_ckpt
ec70: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
ec80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
ec90: 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
eca0: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
ecb0: 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
ecc0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
ecd0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
ece0: 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
ecf0: 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
ed00: 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
ed10: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
ed20: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
ed30: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
ed40: 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
ed50: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
ed60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
ed70: 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
ed80: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
ed90: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
eda0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
edb0: 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f  >errMask==PAGER_
edc0: 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
edd0: 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
ede0: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
edf0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ee00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ee10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
ee20: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
ee30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
ee40: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
ee50: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
ee60: 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
ee70: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
ee80: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
ee90: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
eea0: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
eeb0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
eec0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
eed0: 7d 0a 20 20 54 52 41 43 45 31 28 22 43 4f 4d 4d  }.  TRACE1("COMM
eee0: 49 54 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 50  IT\n");.  if( pP
eef0: 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d  ager->dirtyFile=
ef00: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69  =0 ){.    /* Exi
ef10: 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74  t early (without
ef20: 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d   doing the time-
ef30: 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65  consuming sqlite
ef40: 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a  OsSync() calls).
ef50: 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
ef60: 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
ef70: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
ef80: 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
ef90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
efa0: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
efb0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
efc0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
efd0: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
efe0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
eff0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
f000: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f010: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
f020: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f030: 6e 65 65 64 53 79 6e 63 20 26 26 20 73 71 6c 69  needSync && sqli
f040: 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  teOsSync(&pPager
f050: 2d 3e 6a 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f  ->jfd)!=SQLITE_O
f060: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f  K ){.    goto co
f070: 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a  mmit_abort;.  }.
f080: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
f090: 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
f0a0: 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  s(pPager);.  if(
f0b0: 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d   pPg ){.    rc =
f0c0: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
f0d0: 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
f0e0: 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67  if( rc || (!pPag
f0f0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71  er->noSync && sq
f100: 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67  liteOsSync(&pPag
f110: 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
f120: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  OK) ){.      got
f130: 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
f140: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
f150: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
f160: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ck(pPager);.  pP
f170: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
f180: 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
f190: 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
f1a0: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
f1b0: 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68   wrong during th
f1c0: 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
f1d0: 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62  ..  */.commit_ab
f1e0: 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ort:.  rc = sqli
f1f0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
f200: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
f210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f220: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f230: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
f240: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f250: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
f260: 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
f270: 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
f280: 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64  to read-only mod
f290: 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
f2a0: 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
f2b0: 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
f2c0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
f2d0: 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
f2e0: 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
f2f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
f300: 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
f310: 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
f320: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
f330: 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
f340: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
f350: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
f360: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
f370: 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
f380: 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
f390: 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
f3a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
f3b0: 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
f3c0: 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
f3d0: 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
f3e0: 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
f3f0: 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
f400: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
f410: 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
f420: 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
f430: 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
f440: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
f450: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f460: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
f470: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
f480: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
f490: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
f4a0: 45 31 28 22 52 4f 4c 4c 42 41 43 4b 5c 6e 22 29  E1("ROLLBACK\n")
f4b0: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
f4c0: 3e 64 69 72 74 79 46 69 6c 65 20 7c 7c 20 21 70  >dirtyFile || !p
f4d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
f4e0: 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
f4f0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
f500: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
f510: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
f520: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
f530: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
f540: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
f550: 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  && pPager->errMa
f560: 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk!=PAGER_ERR_FU
f570: 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
f580: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c  ager->state>=SQL
f590: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b  ITE_WRITELOCK ){
f5a0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
f5b0: 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
f5c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
f5d0: 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
f5e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
f5f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
f600: 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
f610: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
f620: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
f630: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c  .  rc = pager_pl
f640: 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
f650: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f660: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
f670: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
f680: 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  T;.    pPager->e
f690: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
f6a0: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
f6b0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
f6c0: 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
f6d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
f6e0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
f6f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
f700: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
f710: 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
f720: 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
f730: 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
f740: 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
f750: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
f760: 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  _isreadonly(Page
f770: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
f780: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
f790: 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
f7a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f7b0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
f7c0: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
f7d0: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
f7e0: 74 65 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  tepager_stats(Pa
f7f0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
f800: 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b  static int a[9];
f810: 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
f820: 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
f830: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
f840: 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
f850: 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
f860: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
f870: 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
f880: 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
f890: 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
f8a0: 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  sk;.  a[6] = pPa
f8b0: 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
f8c0: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
f8d0: 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
f8e0: 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74  er->nOvfl;.  ret
f8f0: 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn a;.}../*.** 
f900: 53 65 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69  Set the checkpoi
f910: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
f920: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
f930: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
f940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
f950: 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
f960: 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63 68 65  open.  A new che
f970: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
f980: 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
f990: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
f9a0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
f9b0: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
f9c0: 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
f9d0: 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
f9e0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
f9f0: 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
fa00: 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
fa10: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
fa20: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
fa30: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
fa40: 45 5d 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  E];.  if( !pPage
fa50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
fa60: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  {.    pPager->ck
fa70: 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  ptAutoopen = 1;.
fa80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
faa0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
fab0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73  nalOpen );.  ass
fac0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 63 6b  ert( !pPager->ck
fad0: 70 74 49 6e 55 73 65 20 29 3b 0a 20 20 70 50 61  ptInUse );.  pPa
fae0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73  ger->aInCkpt = s
faf0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
fb00: 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
fb10: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
fb20: 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b  r->aInCkpt==0 ){
fb30: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61  .    sqliteOsRea
fb40: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
fb50: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
fb60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
fb70: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
fb80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46    rc = sqliteOsF
fb90: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
fba0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
fbb0: 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  kptJSize);.  if(
fbc0: 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f   rc ) goto ckpt_
fbd0: 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
fbe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
fbf0: 63 6b 70 74 4a 53 69 7a 65 20 3d 3d 20 0a 20 20  ckptJSize == .  
fc00: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a    pPager->nRec*J
fc10: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75  OURNAL_PG_SZ(jou
fc20: 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a 4f 55  rnal_format)+JOU
fc30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72  RNAL_HDR_SZ(jour
fc40: 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b 0a 23  nal_format) );.#
fc50: 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
fc60: 63 6b 70 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  ckptJSize = pPag
fc70: 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c  er->nRec*JOURNAL
fc80: 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66  _PG_SZ(journal_f
fc90: 6f 72 6d 61 74 29 0a 20 20 20 20 20 20 20 20 20  ormat).         
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  + JOURNAL_HDR_SZ
fcc0: 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
fcd0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
fce0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
fcf0: 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50  bSize;.  if( !pP
fd00: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29  ager->ckptOpen )
fd10: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
fd20: 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  epager_opentemp(
fd30: 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
fd40: 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cpfd);.    if( r
fd50: 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65  c ) goto ckpt_be
fd60: 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
fd70: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e  pPager->ckptOpen
fd80: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
fd90: 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b 0a  ->ckptNRec = 0;.
fda0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b    }.  pPager->ck
fdb0: 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  ptInUse = 1;.  r
fdc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fdd0: 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61  . .ckpt_begin_fa
fde0: 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
fdf0: 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b 0a 20  er->aInCkpt ){. 
fe00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
fe10: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29 3b 0a  ager->aInCkpt);.
fe20: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43      pPager->aInC
fe30: 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  kpt = 0;.  }.  r
fe40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fe50: 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68 65 63  ** Commit a chec
fe60: 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  kpoint..*/.int s
fe70: 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
fe80: 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
fe90: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
fea0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29  ger->ckptInUse )
feb0: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
fec0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  , *pNext;.    sq
fed0: 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67  liteOsSeek(&pPag
fee0: 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20  er->cpfd, 0);.  
fef0: 20 20 2f 2a 20 73 71 6c 69 74 65 4f 73 54 72 75    /* sqliteOsTru
ff00: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 63  ncate(&pPager->c
ff10: 70 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  pfd, 0); */.    
ff20: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63  pPager->ckptNRec
ff30: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
ff40: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b  ->ckptInUse = 0;
ff50: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
ff60: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
ff70: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ff80: 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20  aInCkpt = 0;.   
ff90: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
ffa0: 3e 70 43 6b 70 74 3b 20 70 50 67 3b 20 70 50 67  >pCkpt; pPg; pPg
ffb0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70  =pNext){.      p
ffc0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
ffd0: 74 43 6b 70 74 3b 0a 20 20 20 20 20 20 61 73 73  tCkpt;.      ass
ffe0: 65 72 74 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74  ert( pPg->inCkpt
fff0: 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
10000 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  nCkpt = 0;.     
10010 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20   pPg->pPrevCkpt 
10020 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  = pPg->pNextCkpt
10030 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
10040 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20  pPager->pCkpt = 
10050 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
10060 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >ckptAutoopen = 
10070 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
10080 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10090 52 6f 6c 6c 62 61 63 6b 20 61 20 63 68 65 63 6b  Rollback a check
100a0 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
100b0 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 72  litepager_ckpt_r
100c0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
100d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
100e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
100f0 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  ckptInUse ){.   
10100 20 72 63 20 3d 20 70 61 67 65 72 5f 63 6b 70 74   rc = pager_ckpt
10110 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
10120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  );.    sqlitepag
10130 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70  er_ckpt_commit(p
10140 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
10150 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10160 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10170 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20  r->ckptAutoopen 
10180 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
10190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
101a0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
101b0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
101c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
101d0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 70  st char *sqlitep
101e0 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61  ager_filename(Pa
101f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10200 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
10210 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
10220 2a 2a 20 52 65 6e 61 6d 65 20 74 68 65 20 64 61  ** Rename the da
10230 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2f 0a 69  tabase file.*/.i
10240 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  nt sqlitepager_r
10250 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
10260 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
10270 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a 20 20 63 68  *zNewName){.  ch
10280 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 63 68 61 72  ar *zNew;.  char
10290 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 69 6e   *zJournal;.  in
102a0 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 72  t nName;.  int r
102b0 63 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74  c;..  nName = st
102c0 72 6c 65 6e 28 7a 4e 65 77 4e 61 6d 65 29 3b 0a  rlen(zNewName);.
102d0 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    zNew = sqliteM
102e0 61 6c 6c 6f 63 28 20 6e 4e 61 6d 65 2a 32 20 2b  alloc( nName*2 +
102f0 20 33 30 20 29 3b 0a 20 20 69 66 28 20 7a 4e 65   30 );.  if( zNe
10300 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
10310 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10320 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 4e  .  }.  memcpy(zN
10330 65 77 2c 20 7a 4e 65 77 4e 61 6d 65 2c 20 6e 4e  ew, zNewName, nN
10340 61 6d 65 2b 31 29 3b 0a 20 20 7a 4a 6f 75 72 6e  ame+1);.  zJourn
10350 61 6c 20 3d 20 26 7a 4e 65 77 5b 6e 4e 61 6d 65  al = &zNew[nName
10360 2b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 4a  +1];.  memcpy(zJ
10370 6f 75 72 6e 61 6c 2c 20 7a 4e 65 77 2c 20 6e 4e  ournal, zNew, nN
10380 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
10390 7a 4a 6f 75 72 6e 61 6c 5b 6e 4e 61 6d 65 5d 2c  zJournal[nName],
103a0 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
103b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
103c0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
103d0 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
103e0 52 65 6e 61 6d 65 28 70 50 61 67 65 72 2d 3e 7a  Rename(pPager->z
103f0 4a 6f 75 72 6e 61 6c 2c 20 7a 4a 6f 75 72 6e 61  Journal, zJourna
10400 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
10410 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
10420 65 65 28 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(zNew);.      
10430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10440 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10450 74 65 4f 73 46 69 6c 65 52 65 6e 61 6d 65 28 70  teOsFileRename(p
10460 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10470 2c 20 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  , zNew);.  if( r
10480 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  c ){.    sqliteF
10490 72 65 65 28 7a 4e 65 77 29 3b 0a 20 20 20 20 72  ree(zNew);.    r
104a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
104b0 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  if( pPager->zFil
104c0 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29 26 70  ename!=(char*)&p
104d0 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20 20 20  Pager[1] ){.    
104e0 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
104f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
10500 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69   }.  pPager->zFi
10510 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 3b 0a 20  lename = zNew;. 
10520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10530 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
10540 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50  ITE_TEST./*.** P
10550 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
10560 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
10570 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
10580 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
10590 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  oid sqlitepager_
105a0 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  refdump(Pager *p
105b0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
105c0 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
105d0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
105e0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
105f0 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
10600 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
10610 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e  ntinue;.    prin
10620 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
10630 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
10640 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
10650 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48  ->pgno, (int)PGH
10660 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
10670 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
10680 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.