/ Hex Artifact Content
Login

Artifact 8b4803d3225dfa15b15cfe6d0f48d8e690238a54:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 39 39  : pager.c,v 1.99
0350: 20 32 30 30 34 2f 30 32 2f 31 31 20 30 32 3a 31   2004/02/11 02:1
0360: 38 3a 30 37 20 64 72 68 20 45 78 70 20 24 0a 2a  8:07 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 2a 0a 2a 2a 20  e header..**.** 
0d10: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
0d20: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 70 61  ld call sqlitepa
0d30: 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61  ger_write() on a
0d40: 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d   page prior to m
0d50: 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64  aking.** any mod
0d60: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
0d70: 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69  at page.  The fi
0d80: 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 70  rst time sqlitep
0d90: 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20  ager_write().** 
0da0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f  is called, the o
0db0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
0dc0: 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65  tents are writte
0dd0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
0de0: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  ack.** journal a
0df0: 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e  nd PgHdr.inJourn
0e00: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65  al and PgHdr.nee
0e10: 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20  dSync are set.  
0e20: 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74  Later, once.** t
0e30: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
0e40: 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f  has made it onto
0e50: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
0e60: 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  e, PgHdr.needSyn
0e70: 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e  c.** is cleared.
0e80: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70    The modified p
0e90: 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72  age cannot be wr
0ea0: 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
0eb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
0ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
0ed0: 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  til the journal 
0ee0: 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73  pages has been s
0ef0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e  ynced to disk an
0f00: 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e  d the.** PgHdr.n
0f10: 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e  eedSync has been
0f20: 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
0f30: 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20  The PgHdr.dirty 
0f40: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
0f50: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
0f60: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61  te() is called a
0f70: 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nd.** is cleared
0f80: 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20   again when the 
0f90: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
0fa0: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
0fb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
0fc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0fd0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0fe0: 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74   PgHdr PgHdr;.st
0ff0: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
1000: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1020: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
1030: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
1040: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
1050: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
1060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1070: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
1080: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1090: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
10a0: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
10b0: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
10c0: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
10d0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  .pgno */.  int n
10e0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1100: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1110: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1120: 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c  gHdr *pNextFree,
1130: 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a   *pPrevFree;  /*
1140: 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67   Freelist of pag
1150: 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
1160: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1170: 78 74 41 6c 6c 2c 20 2a 70 50 72 65 76 41 6c 6c  xtAll, *pPrevAll
1180: 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ;    /* A list o
1190: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
11a0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 43 6b 70   PgHdr *pNextCkp
11b0: 74 2c 20 2a 70 50 72 65 76 43 6b 70 74 3b 20 20  t, *pPrevCkpt;  
11c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
11d0: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
11e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
11f0: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1210: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
1220: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
1230: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
1240: 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  Ckpt;           
1250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1260: 45 20 69 66 20 77 72 69 74 74 65 6e 20 74 6f 20  E if written to 
1270: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
1280: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
1290: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
12a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
12b0: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
12c0: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
12d0: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
12e0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
12f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
1300: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
1310: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
1320: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1330: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1340: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1350: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1360: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1370: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
1380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1390: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
13a0: 20 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72   sorted by PgHdr
13b0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51  .pgno */.  /* SQ
13c0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62  LITE_PAGE_SIZE b
13d0: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
13e0: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
13f0: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
1400: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
1410: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
1420: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
1430: 74 61 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  ta */.};.../*.**
1440: 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f   A macro used fo
1450: 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  r invoking the c
1460: 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73  odec if there is
1470: 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53   one.*/.#ifdef S
1480: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
1490: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
14a0: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
14b0: 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64  Codec ){ P->xCod
14c0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
14d0: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a  D,N,X); }.#else.
14e0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
14f0: 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a  ,D,N,X).#endif..
1500: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1510: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
1520: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
1530: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
1540: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
1550: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
1560: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
1570: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
1580: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
1590: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
15a0: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
15b0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
15c0: 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69 64  _EXTRA(P) ((void
15d0: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
15e0: 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41 47  [1]))[SQLITE_PAG
15f0: 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20  E_SIZE])../*.** 
1600: 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20  How big to make 
1610: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75  the hash table u
1620: 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  sed for locating
1630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1640: 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62  .** by page numb
1650: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  er..*/.#define N
1660: 5f 50 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f  _PG_HASH 2048../
1670: 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65  *.** Hash a page
1680: 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69   number.*/.#defi
1690: 6e 65 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e  ne pager_hash(PN
16a0: 29 20 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48  )  ((PN)&(N_PG_H
16b0: 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41  ASH-1))../*.** A
16c0: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
16d0: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
16e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1700: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
1710: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1730: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1740: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
1750: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
1760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1770: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1780: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
1790: 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20  *zDirectory;    
17a0: 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
17b0: 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73  ory hold databas
17c0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  e and journal fi
17d0: 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  les */.  OsFile 
17e0: 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20  fd, jfd;        
17f0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
1800: 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74  criptors for dat
1810: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
1820: 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 63 70  l */.  OsFile cp
1830: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1840: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1850: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 63 68  iptor for the ch
1860: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1870: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
1880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1890: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
18a0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
18b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
18c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
18d0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
18e0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
18f0: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63  hange */.  int c
1900: 6b 70 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  kptSize;        
1910: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1920: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
1930: 61 67 65 73 29 20 61 74 20 63 6b 70 74 5f 62 65  ages) at ckpt_be
1940: 67 69 6e 28 29 20 2a 2f 0a 20 20 6f 66 66 5f 74  gin() */.  off_t
1950: 20 63 6b 70 74 4a 53 69 7a 65 3b 20 20 20 20 20   ckptJSize;     
1960: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1970: 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 63 6b 70  f journal at ckp
1980: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
1990: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
19c0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
19d0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
19e0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
19f0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
1a00: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
1a10: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
1a20: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70  sum */.  int ckp
1a30: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
1a40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a50: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f records in the
1a60: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
1a70: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  nal */.  int nEx
1a80: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
1a90: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
1aa0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
1ab0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
1ac0: 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ge */.  void (*x
1ad0: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
1ae0: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
1af0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72   routine when fr
1b00: 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  eeing pages */. 
1b10: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b30: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1b40: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
1b50: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
1b80: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
1b90: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
1ba0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
1bd0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
1be0: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
1bf0: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
1c00: 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a  s, nOvfl;     /*
1c10: 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   Cache hits, mis
1c20: 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76  sing, and LRU ov
1c30: 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f 69  erflows */.  voi
1c40: 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
1c50: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
1c60: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
1c70: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
1c80: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
1c90: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
1ca0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1cb0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
1cc0: 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  ) */.  u8 journa
1cd0: 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  lOpen;          
1ce0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
1cf0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
1d00: 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20  iptors is valid 
1d10: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
1d20: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
1d30: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
1d40: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
1d50: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
1d60: 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  useJournal;     
1d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
1d80: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1d90: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
1da0: 2a 2f 0a 20 20 75 38 20 63 6b 70 74 4f 70 65 6e  */.  u8 ckptOpen
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1dd0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
1de0: 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20  al is open */.  
1df0: 75 38 20 63 6b 70 74 49 6e 55 73 65 3b 20 20 20  u8 ckptInUse;   
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e10: 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20  rue we are in a 
1e20: 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20  checkpoint */.  
1e30: 75 38 20 63 6b 70 74 41 75 74 6f 6f 70 65 6e 3b  u8 ckptAutoopen;
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1e50: 70 65 6e 20 63 6b 70 74 20 6a 6f 75 72 6e 61 6c  pen ckpt journal
1e60: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
1e70: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
1e80: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea0: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
1eb0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
1ec0: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
1ef0: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
1f00: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
1f10: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 4c 4f    /* SQLITE_UNLO
1f40: 43 4b 2c 20 5f 52 45 41 44 4c 4f 43 4b 20 6f 72  CK, _READLOCK or
1f50: 20 5f 57 52 49 54 45 4c 4f 43 4b 20 2a 2f 0a 20   _WRITELOCK */. 
1f60: 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20   u8 errMask;    
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f80: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
1f90: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
1fa0: 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b  /.  u8 tempFile;
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  /* zFilename is 
1fd0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1fe0: 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c   */.  u8 readOnl
1ff0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2000: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
2010: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
2020: 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  se */.  u8 needS
2030: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2040: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2050: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
2060: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
2070: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
2080: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
2090: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64      /* True if d
20a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
20b0: 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20   changed in any 
20c0: 77 61 79 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  way */.  u8 alwa
20d0: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
20e0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
20f0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
2100: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
2110: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2120: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2130: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2140: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2160: 20 20 75 38 20 2a 61 49 6e 43 6b 70 74 3b 20 20    u8 *aInCkpt;  
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2180: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2190: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
21a0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 48 64  tabase */.  PgHd
21b0: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
21c0: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
21d0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
21e0: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
21f0: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
2200: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
2210: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
2220: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
2230: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
2240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
2250: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
2260: 2f 0a 20 20 50 67 48 64 72 20 2a 70 43 6b 70 74  /.  PgHdr *pCkpt
2270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2280: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
2290: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
22a0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
22b0: 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50  PgHdr *aHash[N_P
22c0: 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48  G_HASH];    /* H
22d0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
22e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
22f0: 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  PgHdr */.};../*.
2300: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74  ** These are bit
2310: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
2320: 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  t in Pager.errMa
2330: 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  sk..*/.#define P
2340: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20  AGER_ERR_FULL   
2350: 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69    0x01  /* a wri
2360: 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  te() failed */.#
2370: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
2380: 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20 20  _MEM      0x02  
2390: 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  /* malloc() fail
23a0: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
23b0: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20  GER_ERR_LOCK    
23c0: 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20   0x04  /* error 
23d0: 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  in the locking p
23e0: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69  rotocol */.#defi
23f0: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  ne PAGER_ERR_COR
2400: 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64  RUPT  0x08  /* d
2410: 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e  atabase or journ
2420: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  al corruption */
2430: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2440: 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30  RR_DISK     0x10
2450: 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73    /* general dis
2460: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61  k I/O error - ba
2470: 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f  d hard drive? */
2480: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
2490: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
24a0: 73 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 69  s page records i
24b0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
24c0: 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  ** format..**.**
24d0: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
24e0: 73 74 72 75 63 74 75 72 65 20 69 73 20 74 68 65  structure is the
24f0: 20 63 6f 6d 70 6c 65 74 65 20 70 61 67 65 20 72   complete page r
2500: 65 63 6f 72 64 20 66 6f 72 20 70 61 67 65 72 0a  ecord for pager.
2510: 2a 2a 20 66 6f 72 6d 61 74 73 20 6c 65 73 73 20  ** formats less 
2520: 74 68 61 6e 20 33 2e 20 20 42 65 67 69 6e 6e 69  than 3.  Beginni
2530: 6e 67 20 77 69 74 68 20 66 6f 72 6d 61 74 20 33  ng with format 3
2540: 2c 20 74 68 69 73 20 72 65 63 6f 72 64 20 69 73  , this record is
2550: 20 73 75 72 72 6f 75 6e 64 65 64 0a 2a 2a 20 62   surrounded.** b
2560: 79 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 73 2e  y two checksums.
2570: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2580: 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 50 61  ct PageRecord Pa
2590: 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75 63 74  geRecord;.struct
25a0: 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a 20 20   PageRecord {.  
25b0: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
25e0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44 61  er */.  char aDa
25f0: 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ta[SQLITE_PAGE_S
2600: 49 5a 45 5d 3b 20 20 20 2f 2a 20 4f 72 69 67 69  IZE];   /* Origi
2610: 6e 61 6c 20 64 61 74 61 20 66 6f 72 20 70 61 67  nal data for pag
2620: 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e pgno */.};../*
2630: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
2640: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
2650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
2660: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
2670: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
2680: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
2690: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
26a0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
26b0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  y check..**.** T
26c0: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6a  here are three j
26d0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 28  ournal formats (
26e0: 73 6f 20 66 61 72 29 2e 20 54 68 65 20 31 73 74  so far). The 1st
26f0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
2700: 77 72 69 74 65 73 0a 2a 2a 20 33 32 2d 62 69 74  writes.** 32-bit
2710: 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65   integers in the
2720: 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
2730: 68 65 20 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e  he host machine.
2740: 20 20 4e 65 77 0a 2a 2a 20 66 6f 72 6d 61 74 73    New.** formats
2750: 20 77 72 69 74 65 73 20 69 6e 74 65 67 65 72 73   writes integers
2760: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 20   as big-endian. 
2770: 20 41 6c 6c 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   All new journal
2780: 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 6e 65 77  s use the.** new
2790: 20 66 6f 72 6d 61 74 2c 20 62 75 74 20 77 65 20   format, but we 
27a0: 68 61 76 65 20 74 6f 20 62 65 20 61 62 6c 65 20  have to be able 
27b0: 74 6f 20 72 65 61 64 20 61 6e 20 6f 6c 64 65 72  to read an older
27c0: 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6f 72 64 65   journal in orde
27d0: 72 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  r.** to rollback
27e0: 20 6a 6f 75 72 6e 61 6c 73 20 63 72 65 61 74 65   journals create
27f0: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
2800: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 69 62 72 61  ons of the libra
2810: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 72  ry..**.** The 3r
2820: 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
2830: 20 28 61 64 64 65 64 20 66 6f 72 20 32 2e 38 2e   (added for 2.8.
2840: 30 29 20 61 64 64 73 20 61 64 64 69 74 69 6f 6e  0) adds addition
2850: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
2860: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
2870: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2880: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
2890: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 0a  fails while the.
28a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  ** journal is be
28b0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  ing written, sem
28c0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
28d0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
28e0: 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75  ar in.** the jou
28f0: 72 6e 61 6c 20 66 69 6c 65 20 61 66 74 65 72 20  rnal file after 
2900: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
2910: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
2920: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
2930: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
2940: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
2950: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
2960: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
2970: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
2980: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
2990: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
29a0: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
29b0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
29c0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
29d0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
29e0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
29f0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
2a00: 6e 20 66 6f 72 20 74 68 65 20 33 72 64 20 6a 6f  n for the 3rd jo
2a10: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
2a20: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
2a30: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
2a40: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
2a50: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
2a60: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
2a70: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2a80: 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f   and the SQLITE_
2a90: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
2aa0: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
2ab0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
2ac0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
2ad0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
2ae0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
2af0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
2b00: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2b10: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
2b20: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
2b30: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
2b40: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
2b50: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
2b60: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
2b70: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
2b80: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
2b90: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
2ba0: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
2bb0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
2bc0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
2bd0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
2be0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
2bf0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
2c00: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
2c10: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
2c20: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
2c30: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
2c40: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
2c50: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
2c60: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
2c70: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
2c80: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
2c90: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
2ca0: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
2cb0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2cc0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
2cd0: 69 63 31 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  ic1[] = {.  0xd9
2ce0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
2cf0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
2d00: 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a 73  0x63, 0xd4,.};.s
2d10: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
2d20: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
2d30: 61 6c 4d 61 67 69 63 32 5b 5d 20 3d 20 7b 0a 20  alMagic2[] = {. 
2d40: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
2d50: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
2d60: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 35 2c  xa1, 0x63, 0xd5,
2d70: 0a 7d 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .};.static const
2d80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
2d90: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 5b 5d 20  JournalMagic3[] 
2da0: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
2db0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
2dc0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
2dd0: 30 78 64 36 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65  0xd6,.};.#define
2de0: 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f   JOURNAL_FORMAT_
2df0: 31 20 31 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  1 1.#define JOUR
2e00: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 20 32 0a 23  NAL_FORMAT_2 2.#
2e10: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46  define JOURNAL_F
2e20: 4f 52 4d 41 54 5f 33 20 33 0a 0a 2f 2a 0a 2a 2a  ORMAT_3 3../*.**
2e30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
2e40: 6e 74 65 67 65 72 20 64 65 74 65 72 6d 69 6e 65  nteger determine
2e50: 73 20 77 68 61 74 20 66 6f 72 6d 61 74 20 74 6f  s what format to
2e60: 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
2e70: 6e 67 0a 2a 2a 20 6e 65 77 20 70 72 69 6d 61 72  ng.** new primar
2e80: 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  y journal files.
2e90: 20 20 42 79 20 64 65 66 61 75 6c 74 20 77 65 20    By default we 
2ea0: 61 6c 77 61 79 73 20 75 73 65 20 66 6f 72 6d 61  always use forma
2eb0: 74 20 33 2e 0a 2a 2a 20 57 68 65 6e 20 74 65 73  t 3..** When tes
2ec0: 74 69 6e 67 2c 20 77 65 20 63 61 6e 20 73 65 74  ting, we can set
2ed0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 6f   this value to o
2ee0: 6c 64 65 72 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  lder journal for
2ef0: 6d 61 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  mats in order to
2f00: 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 74 68  .** make sure th
2f10: 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
2f20: 73 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  s of the library
2f30: 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
2f40: 6c 62 61 63 6b 20 6f 6c 64 65 72 0a 2a 2a 20 6a  lback older.** j
2f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
2f60: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 63 68  .** Note that ch
2f70: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
2f80: 73 20 61 6c 77 61 79 73 20 75 73 65 20 66 6f 72  s always use for
2f90: 6d 61 74 20 32 20 61 6e 64 20 6f 6d 69 74 20 74  mat 2 and omit t
2fa0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 23 69  he header..*/.#i
2fb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2fc0: 0a 69 6e 74 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72  .int journal_for
2fd0: 6d 61 74 20 3d 20 33 3b 0a 23 65 6c 73 65 0a 23  mat = 3;.#else.#
2fe0: 20 64 65 66 69 6e 65 20 6a 6f 75 72 6e 61 6c 5f   define journal_
2ff0: 66 6f 72 6d 61 74 20 33 0a 23 65 6e 64 69 66 0a  format 3.#endif.
3000: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
3010: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
3020: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
3030: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 76 61  n the journal va
3040: 72 69 65 73 20 61 63 63 6f 72 64 69 6e 67 0a 2a  ries according.*
3050: 2a 20 74 6f 20 77 68 69 63 68 20 6a 6f 75 72 6e  * to which journ
3060: 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 62 65 69  al format is bei
3070: 6e 67 20 75 73 65 64 2e 20 20 54 68 65 20 66 6f  ng used.  The fo
3080: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 66  llowing macros f
3090: 69 67 75 72 65 20 6f 75 74 0a 2a 2a 20 74 68 65  igure out.** the
30a0: 20 73 69 7a 65 73 20 62 61 73 65 64 20 6f 6e 20   sizes based on 
30b0: 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 73 2e 0a  format numbers..
30c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
30d0: 41 4c 5f 48 44 52 5f 53 5a 28 58 29 20 5c 0a 20  AL_HDR_SZ(X) \. 
30e0: 20 20 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e    (sizeof(aJourn
30f0: 61 6c 4d 61 67 69 63 31 29 20 2b 20 73 69 7a 65  alMagic1) + size
3100: 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58 29 3e  of(Pgno) + ((X)>
3110: 3d 33 29 2a 32 2a 73 69 7a 65 6f 66 28 75 33 32  =3)*2*sizeof(u32
3120: 29 29 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  )).#define JOURN
3130: 41 4c 5f 50 47 5f 53 5a 28 58 29 20 5c 0a 20 20  AL_PG_SZ(X) \.  
3140: 20 28 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49   (SQLITE_PAGE_SI
3150: 5a 45 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ZE + sizeof(Pgno
3160: 29 20 2b 20 28 28 58 29 3e 3d 33 29 2a 73 69 7a  ) + ((X)>=3)*siz
3170: 65 6f 66 28 75 33 32 29 29 0a 0a 2f 2a 0a 2a 2a  eof(u32))../*.**
3180: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
3190: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
31a0: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
31b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
31c0: 6e 74 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  nt pager_refinfo
31d0: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
31e0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
31f0: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
3200: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
3210: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
3220: 69 66 28 20 21 70 61 67 65 72 5f 72 65 66 69 6e  if( !pager_refin
3230: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
3240: 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a  rn;.    printf(.
3250: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
3260: 25 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %4d addr=0x%08x 
3270: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
3280: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74     p->pgno, (int
3290: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
32a0: 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ), p->nRef.    )
32b0: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
32c0: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
32d0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
32e0: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
32f0: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
3300: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
3310: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
3320: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
3330: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
3340: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
3350: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
3360: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
3370: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
3380: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
3390: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
33a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
33b0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
33c0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
33d0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
33e0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
33f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
3400: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 32  rnal format is 2
3410: 20 6f 72 20 33 2c 20 72 65 61 64 20 61 20 62 69   or 3, read a bi
3420: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
3430: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 6a 6f 75  .  If the.** jou
3440: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 31  rnal format is 1
3450: 2c 20 72 65 61 64 20 61 6e 20 69 6e 74 65 67 65  , read an intege
3460: 72 20 69 6e 20 74 68 65 20 6e 61 74 69 76 65 20  r in the native 
3470: 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
3480: 65 0a 2a 2a 20 68 6f 73 74 20 6d 61 63 68 69 6e  e.** host machin
3490: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
34a0: 20 72 65 61 64 33 32 62 69 74 73 28 69 6e 74 20   read32bits(int 
34b0: 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c 65 20 2a  format, OsFile *
34c0: 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  fd, u32 *pRes){.
34d0: 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74    u32 res;.  int
34e0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
34f0: 74 65 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65  teOsRead(fd, &re
3500: 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b  s, sizeof(res));
3510: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
3520: 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61 74 3e 4a  E_OK && format>J
3530: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20  OURNAL_FORMAT_1 
3540: 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
3550: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20  char ac[4];.    
3560: 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c  memcpy(ac, &res,
3570: 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28   4);.    res = (
3580: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
3590: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
35a0: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20  ]<<8) | ac[3];. 
35b0: 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73   }.  *pRes = res
35c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
35e0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
35f0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
3600: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
3610: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
3620: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
3630: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
3640: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
3650: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  s wrong..**.** I
3660: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
3670: 72 6d 61 74 20 69 73 20 32 20 6f 72 20 33 2c 20  rmat is 2 or 3, 
3680: 77 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65  write the intege
3690: 72 20 61 73 20 34 20 62 69 67 2d 65 6e 64 69 61  r as 4 big-endia
36a0: 6e 0a 2a 2a 20 62 79 74 65 73 2e 20 20 49 66 20  n.** bytes.  If 
36b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
36c0: 61 74 20 69 73 20 31 2c 20 77 72 69 74 65 20 74  at is 1, write t
36d0: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68  he integer in th
36e0: 65 20 6e 61 74 69 76 65 0a 2a 2a 20 62 79 74 65  e native.** byte
36f0: 20 6f 72 64 65 72 2e 20 20 49 6e 20 6e 6f 72 6d   order.  In norm
3700: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 6e  al operation, on
3710: 6c 79 20 66 6f 72 6d 61 74 73 20 32 20 61 6e 64  ly formats 2 and
3720: 20 33 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 20   3 are used..** 
3730: 4a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 31  Journal format 1
3740: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
3750: 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 73 74  r testing..*/.st
3760: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
3770: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
3780: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
3790: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
37a0: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
37b0: 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20  format<=1 ){.   
37c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73   return sqliteOs
37d0: 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20  Write(fd, &val, 
37e0: 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20  4);.  }.  ac[0] 
37f0: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3800: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
3810: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
3820: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
3830: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
3840: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
3850: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3860: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
3870: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  4);.}../*.** Wri
3880: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
3890: 67 65 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20  ger into a page 
38a0: 68 65 61 64 65 72 20 72 69 67 68 74 20 62 65 66  header right bef
38b0: 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ore the.** page 
38c0: 64 61 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c  data.  This will
38d0: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 50   overwrite the P
38e0: 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
38f0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ter..**.** The i
3900: 6e 74 65 67 65 72 20 69 73 20 62 69 67 2d 65 6e  nteger is big-en
3910: 64 69 61 6e 20 66 6f 72 20 66 6f 72 6d 61 74 73  dian for formats
3920: 20 32 20 61 6e 64 20 33 20 61 6e 64 20 6e 61 74   2 and 3 and nat
3930: 69 76 65 20 62 79 74 65 20 6f 72 64 65 72 0a 2a  ive byte order.*
3940: 2a 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 6f  * for journal fo
3950: 72 6d 61 74 20 31 2e 0a 2a 2f 0a 73 74 61 74 69  rmat 1..*/.stati
3960: 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69  c void store32bi
3970: 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64  ts(u32 val, PgHd
3980: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
3990: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
39a0: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
39b0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
39c0: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
39d0: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ))[offset];.  if
39e0: 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  ( journal_format
39f0: 3c 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  <=1 ){.    memcp
3a00: 79 28 61 63 2c 20 26 76 61 6c 2c 20 34 29 3b 0a  y(ac, &val, 4);.
3a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 63 5b    }else{.    ac[
3a20: 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26  0] = (val>>24) &
3a30: 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 31 5d   0xff;.    ac[1]
3a40: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
3a50: 78 66 66 3b 0a 20 20 20 20 61 63 5b 32 5d 20 3d  xff;.    ac[2] =
3a60: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
3a70: 3b 0a 20 20 20 20 61 63 5b 33 5d 20 3d 20 76 61  ;.    ac[3] = va
3a80: 6c 20 26 20 30 78 66 66 3b 0a 20 20 7d 0a 7d 0a  l & 0xff;.  }.}.
3a90: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
3aa0: 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
3ab0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3ac0: 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61  into an appropra
3ad0: 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64  te.** return cod
3ae0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3af0: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50   pager_errcode(P
3b00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
3b10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3b20: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
3b30: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
3b40: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20  ER_ERR_LOCK )   
3b50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f   rc = SQLITE_PRO
3b60: 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61  TOCOL;.  if( pPa
3b70: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3b80: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20  AGER_ERR_DISK ) 
3b90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
3ba0: 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67  OERR;.  if( pPag
3bb0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
3bc0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20  GER_ERR_FULL )  
3bd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
3be0: 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  LL;.  if( pPager
3bf0: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
3c00: 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20  R_ERR_MEM )     
3c10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
3c20: 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  M;.  if( pPager-
3c30: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
3c40: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72  _ERR_CORRUPT ) r
3c50: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
3c60: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  PT;.  return rc;
3c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
3c80: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
3c90: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
3ca0: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
3cb0: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 63 68 65  re in the.** che
3cc0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  ckpoint journal.
3cd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
3ce0: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
3cf0: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
3d00: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
3d10: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 63 68 65  ly in.** the che
3d20: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  ckpoint journal.
3d30: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
3d40: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
3d50: 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  t_commit().** ro
3d60: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
3d70: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
3d80: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
3d90: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
3da0: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
3db0: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
3dc0: 20 61 72 65 20 69 6e 20 74 68 65 20 63 68 65 63   are in the chec
3dd0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
3de0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
3df0: 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f  age_add_to_ckpt_
3e00: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
3e10: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
3e20: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
3e30: 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 43 6b  .  if( pPg->inCk
3e40: 70 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  pt ) return;.  a
3e50: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
3e60: 76 43 6b 70 74 3d 3d 30 20 26 26 20 70 50 67 2d  vCkpt==0 && pPg-
3e70: 3e 70 4e 65 78 74 43 6b 70 74 3d 3d 30 20 29 3b  >pNextCkpt==0 );
3e80: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70  .  pPg->pPrevCkp
3e90: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  t = 0;.  if( pPa
3ea0: 67 65 72 2d 3e 70 43 6b 70 74 20 29 7b 0a 20 20  ger->pCkpt ){.  
3eb0: 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 2d    pPager->pCkpt-
3ec0: 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70 50 67  >pPrevCkpt = pPg
3ed0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
3ee0: 78 74 43 6b 70 74 20 3d 20 70 50 61 67 65 72 2d  xtCkpt = pPager-
3ef0: 3e 70 43 6b 70 74 3b 0a 20 20 70 50 61 67 65 72  >pCkpt;.  pPager
3f00: 2d 3e 70 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20  ->pCkpt = pPg;. 
3f10: 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 31   pPg->inCkpt = 1
3f20: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
3f30: 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
3f40: 5f 63 6b 70 74 5f 6c 69 73 74 28 50 67 48 64 72  _ckpt_list(PgHdr
3f50: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70   *pPg){.  if( !p
3f60: 50 67 2d 3e 69 6e 43 6b 70 74 20 29 20 72 65 74  Pg->inCkpt ) ret
3f70: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
3f80: 70 50 72 65 76 43 6b 70 74 20 29 7b 0a 20 20 20  pPrevCkpt ){.   
3f90: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
3fa0: 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78 74 43 6b  revCkpt->pNextCk
3fb0: 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  pt==pPg );.    p
3fc0: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70  Pg->pPrevCkpt->p
3fd0: 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 67 2d 3e  NextCkpt = pPg->
3fe0: 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 7d 65 6c  pNextCkpt;.  }el
3ff0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4000: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 43 6b  pPg->pPager->pCk
4010: 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  pt==pPg );.    p
4020: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 43 6b 70  Pg->pPager->pCkp
4030: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  t = pPg->pNextCk
4040: 70 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  pt;.  }.  if( pP
4050: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 29 7b 0a  g->pNextCkpt ){.
4060: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
4070: 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70 50 72 65  >pNextCkpt->pPre
4080: 76 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20  vCkpt==pPg );.  
4090: 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74    pPg->pNextCkpt
40a0: 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70 50  ->pPrevCkpt = pP
40b0: 67 2d 3e 70 50 72 65 76 43 6b 70 74 3b 0a 20 20  g->pPrevCkpt;.  
40c0: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  }.  pPg->pNextCk
40d0: 70 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  pt = 0;.  pPg->p
40e0: 50 72 65 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20  PrevCkpt = 0;.  
40f0: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b  pPg->inCkpt = 0;
4100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
4110: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
4120: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
4130: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
4140: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
4150: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
4160: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
4170: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
4180: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
4190: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
41a0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
41b0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67   PgHdr *p = pPag
41c0: 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f  er->aHash[pager_
41d0: 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77  hash(pgno)];.  w
41e0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
41f0: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
4200: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
4210: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
4230: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  k the database a
4240: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d  nd clear the in-
4250: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
4260: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
4270: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
4280: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
4290: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
42a0: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
42b0: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
42c0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
42d0: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
42e0: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
42f0: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
4300: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
4310: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
4320: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
4330: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
4340: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
4350: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
4360: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
4370: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67  pNext;.  for(pPg
4380: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
4390: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
43a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
43b0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
43c0: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
43d0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46    }.  pPager->pF
43e0: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
43f0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
4400: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
4410: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
4420: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
4430: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
4440: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
4450: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
4460: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
4470: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
4480: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49  ger->state>=SQLI
4490: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
44a0: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
44b0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
44c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
44d0: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
44e0: 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  fd);.  pPager->s
44f0: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e  tate = SQLITE_UN
4500: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
4510: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
4520: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
4530: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4540: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
4550: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
4560: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
4570: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
4580: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
4590: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
45a0: 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f  nd.** a write lo
45b0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
45c0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
45d0: 65 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 64  e releases the d
45e0: 61 74 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65  atabase.** write
45f0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
4600: 65 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  es a read lock i
4610: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
4620: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
4630: 2a 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  * is deleted and
4640: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
4650: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
4660: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
4670: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
4680: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
4690: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
46a0: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
46b0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
46c0: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
46d0: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
46e0: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
46f0: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
4700: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4710: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
4720: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
4730: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
4740: 72 20 2a 70 50 67 3b 0a 20 20 69 66 28 20 70 50  r *pPg;.  if( pP
4750: 61 67 65 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49  ager->state<SQLI
4760: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 20 72  TE_WRITELOCK ) r
4770: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4780: 0a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  .  sqlitepager_c
4790: 6b 70 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  kpt_commit(pPage
47a0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
47b0: 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20  ->ckptOpen ){.  
47c0: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
47d0: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a  &pPager->cpfd);.
47e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
47f0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
4800: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
4810: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
4820: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
4830: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
4840: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4850: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  pen = 0;.    sql
4860: 69 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67  iteOsDelete(pPag
4870: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
4880: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
4890: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
48a0: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
48b0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
48c0: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
48d0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
48e0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
48f0: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
4900: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
4910: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
4920: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
4930: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
4940: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
4950: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4960: 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20  dirtyFile==0 || 
4970: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
4980: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72  al==0 );.  }.  r
4990: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
49a0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
49b0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
49c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
49d0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
49e0: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  LITE_READLOCK;. 
49f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
4a00: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
4a10: 70 65 6e 20 69 66 20 61 20 70 72 6f 63 65 73 73  pen if a process
4a20: 20 64 6f 65 73 20 61 20 42 45 47 49 4e 2c 20 74   does a BEGIN, t
4a30: 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64 20 74 68  hen forks and th
4a40: 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
4a50: 72 6f 63 65 73 73 20 64 6f 65 73 20 74 68 65 20  rocess does the 
4a60: 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61 75 73 65  COMMIT.  Because
4a70: 20 6f 66 20 74 68 65 20 73 65 6d 61 6e 74 69 63   of the semantic
4a80: 73 20 6f 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a  s of unix.    **
4a90: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74   file locking, t
4aa0: 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66  he unlock will f
4ab0: 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ail..    */.    
4ac0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
4ad0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20  SQLITE_UNLOCK;. 
4ae0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4af0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
4b00: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
4b10: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
4b20: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
4b30: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
4b40: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
4b50: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
4b60: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
4b70: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
4b80: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
4b90: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
4ba0: 20 57 65 20 63 6f 6e 73 69 64 65 72 65 64 20 64   We considered d
4bb0: 6f 20 61 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 20  o a checksum.** 
4bc0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
4bd0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
4be0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
4bf0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ow..*/.static u3
4c00: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
4c10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
4c20: 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68  o pgno, const ch
4c30: 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  ar *aData){.  u3
4c40: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
4c50: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 2b 20 70 67  ->cksumInit + pg
4c60: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b 73  no;.  return cks
4c70: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
4c80: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
4c90: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
4ca0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
4cb0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
4cc0: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
4cd0: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
4ce0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
4cf0: 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e 74   three different
4d00: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73   journal formats
4d10: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 70 61  .  The format pa
4d20: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
4d30: 65 73 0a 2a 2a 20 77 68 69 63 68 20 66 6f 72 6d  es.** which form
4d40: 61 74 20 69 73 20 75 73 65 64 20 62 79 20 74 68  at is used by th
4d50: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 69  e journal that i
4d60: 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  s played back..*
4d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4d80: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
4d90: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
4da0: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c  er, OsFile *jfd,
4db0: 20 69 6e 74 20 66 6f 72 6d 61 74 29 7b 0a 20 20   int format){.  
4dc0: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
4dd0: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
4de0: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
4df0: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
4e00: 63 68 65 20 2a 2f 0a 20 20 50 61 67 65 52 65 63  che */.  PageRec
4e10: 6f 72 64 20 70 67 52 65 63 3b 0a 20 20 75 33 32  ord pgRec;.  u32
4e20: 20 63 6b 73 75 6d 3b 0a 0a 20 20 72 63 20 3d 20   cksum;..  rc = 
4e30: 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61  read32bits(forma
4e40: 74 2c 20 6a 66 64 2c 20 26 70 67 52 65 63 2e 70  t, jfd, &pgRec.p
4e50: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
4e60: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
4e70: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
4e80: 6c 69 74 65 4f 73 52 65 61 64 28 6a 66 64 2c 20  liteOsRead(jfd, 
4e90: 26 70 67 52 65 63 2e 61 44 61 74 61 2c 20 73 69  &pgRec.aData, si
4ea0: 7a 65 6f 66 28 70 67 52 65 63 2e 61 44 61 74 61  zeof(pgRec.aData
4eb0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
4ec0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
4ed0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74   rc;..  /* Sanit
4ee0: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
4ef0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
4f00: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
4f10: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
4f20: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
4f30: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
4f40: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
4f50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4f60: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
4f70: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
4f80: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
4f90: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
4fa0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
4fb0: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
4fc0: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
4fd0: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
4fe0: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
4ff0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
5000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 52 65  .  */.  if( pgRe
5010: 63 2e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  c.pgno==0 ){.   
5020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
5030: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
5040: 67 52 65 63 2e 70 67 6e 6f 3e 28 75 6e 73 69 67  gRec.pgno>(unsig
5050: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
5060: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
5070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
5080: 20 20 69 66 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f    if( format>=JO
5090: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29  URNAL_FORMAT_3 )
50a0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
50b0: 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 6a 66  2bits(format, jf
50c0: 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  d, &cksum);.    
50d0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
50e0: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  rc;.    if( page
50f0: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
5100: 70 67 52 65 63 2e 70 67 6e 6f 2c 20 70 67 52 65  pgRec.pgno, pgRe
5110: 63 2e 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  c.aData)!=cksum 
5120: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
5130: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
5140: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 6c 61   }.  }..  /* Pla
5150: 79 62 61 63 6b 20 74 68 65 20 70 61 67 65 2e 20  yback the page. 
5160: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
5170: 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20 74 68  emory copy of th
5180: 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74 20 74  e page.  ** at t
5190: 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 69 66  he same time, if
51a0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 20   there is one.. 
51b0: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
51c0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
51d0: 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20   pgRec.pgno);.  
51e0: 54 52 41 43 45 32 28 22 50 4c 41 59 42 41 43 4b  TRACE2("PLAYBACK
51f0: 20 25 64 5c 6e 22 2c 20 70 67 52 65 63 2e 70 67   %d\n", pgRec.pg
5200: 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53  no);.  sqliteOsS
5210: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
5220: 20 28 70 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a   (pgRec.pgno-1)*
5230: 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41  (off_t)SQLITE_PA
5240: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 72 63 20 3d  GE_SIZE);.  rc =
5250: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
5260: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 67 52 65  pPager->fd, pgRe
5270: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
5280: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66  PAGE_SIZE);.  if
5290: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
52a0: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
52b0: 76 65 72 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ver be rolled ba
52c0: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
52d0: 65 2c 20 65 78 63 65 70 74 20 66 6f 72 20 70 61  e, except for pa
52e0: 67 65 0a 20 20 20 20 2a 2a 20 31 20 77 68 69 63  ge.    ** 1 whic
52f0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
5300: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
5310: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
5320: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
5330: 2a 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  * active..    */
5340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
5350: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
5360: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
5370: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
5380: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 67 52 65  _DATA(pPg), pgRe
5390: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
53a0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
53b0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
53c0: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
53d0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
53e0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
53f0: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65   0;.    pPg->nee
5400: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 43  dSync = 0;.    C
5410: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
5420: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
5430: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
5440: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
5460: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
5470: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
5480: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
5490: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
54a0: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
54b0: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
54c0: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
54d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
54e0: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
54f0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
5500: 0a 2a 2a 20 20 20 20 2a 20 20 38 20 62 79 74 65  .**    *  8 byte
5510: 20 70 72 65 66 69 78 2e 20 20 4f 6e 65 20 6f 66   prefix.  One of
5520: 20 74 68 65 20 61 4a 6f 75 72 6e 61 6c 4d 61 67   the aJournalMag
5530: 69 63 31 32 33 20 76 65 63 74 6f 72 73 20 64 65  ic123 vectors de
5540: 66 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  fined.**       a
5550: 62 6f 76 65 2e 20 20 54 68 65 20 66 6f 72 6d 61  bove.  The forma
5560: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
5570: 20 66 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69   file is determi
5580: 6e 65 64 20 62 79 20 77 68 69 63 68 0a 2a 2a 20  ned by which.** 
5590: 20 20 20 20 20 20 6f 66 20 74 68 65 20 74 68 72        of the thr
55a0: 65 65 20 70 72 65 66 69 78 20 76 65 63 74 6f 72  ee prefix vector
55b0: 73 20 69 73 20 73 65 65 6e 2e 0a 2a 2a 20 20 20  s is seen..**   
55c0: 20 2a 20 20 34 20 62 79 74 65 20 62 69 67 2d 65   *  4 byte big-e
55d0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
55e0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
55f0: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
5600: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
5610: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
5620: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
5630: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
5640: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
5650: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
5660: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
5670: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
5680: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 66 69 65   size.  This fie
5690: 6c 64 20 61 70 70 65 61 72 73 0a 2a 2a 20 20 20  ld appears.**   
56a0: 20 20 20 20 69 6e 20 66 6f 72 6d 61 74 20 33 20      in format 3 
56b0: 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 2a 20 20 34  only..**    *  4
56c0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
56d0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
56e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
56f0: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
5700: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
5710: 63 6b 73 75 6d 2e 20 20 54 68 69 73 20 66 69 65  cksum.  This fie
5720: 6c 64 20 61 70 70 65 61 72 73 20 69 6e 20 66 6f  ld appears in fo
5730: 72 6d 61 74 20 33 20 6f 6e 6c 79 2e 0a 2a 2a 20  rmat 3 only..** 
5740: 20 20 20 2a 20 20 34 20 62 79 74 65 20 69 6e 74     *  4 byte int
5750: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
5760: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
5770: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
5780: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
5790: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
57a0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 20 20  rollback..**    
57b0: 2a 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  *  Zero or more 
57c0: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
57d0: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
57e0: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
57f0: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
5800: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
5810: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5820: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
5830: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
5840: 79 74 65 20 63 68 65 63 6b 73 75 6d 20 28 66 6f  yte checksum (fo
5850: 72 6d 61 74 20 33 20 6f 6e 6c 79 29 0a 2a 2a 0a  rmat 3 only).**.
5860: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
5870: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
5880: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
5890: 74 68 65 20 66 69 72 73 74 20 34 20 62 75 6c 6c  the first 4 bull
58a0: 65 74 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ets above..** Ea
58b0: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
58c0: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
58d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 35 74  stance of the 5t
58e0: 68 20 62 75 6c 6c 65 74 2e 20 20 4e 6f 74 65 20  h bullet.  Note 
58f0: 74 68 61 74 0a 2a 2a 20 62 75 6c 6c 65 74 73 20  that.** bullets 
5900: 32 20 61 6e 64 20 33 20 6f 6e 6c 79 20 61 70 70  2 and 3 only app
5910: 65 61 72 20 69 6e 20 66 6f 72 6d 61 74 2d 33 20  ear in format-3 
5920: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  journals..**.** 
5930: 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
5940: 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
5950: 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
5960: 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
5970: 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
5980: 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
5990: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
59a0: 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
59b0: 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
59c0: 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
59d0: 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
59e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
59f0: 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
5a00: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
5a10: 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
5a20: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
5a30: 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
5a40: 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
5a50: 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
5a60: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
5a70: 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
5a80: 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
5a90: 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
5aa0: 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
5ab0: 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
5ac0: 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
5ad0: 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
5ae0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
5af0: 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
5b00: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
5b10: 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
5b20: 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
5b30: 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
5b40: 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
5b50: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
5b60: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
5b70: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
5b80: 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
5b90: 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
5ba0: 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
5bb0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
5bc0: 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
5bd0: 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
5be0: 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
5bf0: 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
5c00: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
5c10: 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
5c20: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
5c30: 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
5c40: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
5c50: 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
5c60: 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
5c70: 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
5c80: 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
5c90: 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
5ca0: 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
5cb0: 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
5cc0: 2a 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 6f  **.** Journal fo
5cd0: 72 6d 61 74 73 20 31 20 61 6e 64 20 32 20 64 6f  rmats 1 and 2 do
5ce0: 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6e 52 65   not have an nRe
5cf0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
5d00: 65 61 64 65 72 20 73 6f 20 77 65 0a 2a 2a 20 68  eader so we.** h
5d10: 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 6e  ave to compute n
5d20: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  Rec from the fil
5d30: 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 68 61  e size.  This ha
5d40: 73 20 72 69 73 6b 73 20 28 61 73 20 64 65 73 63  s risks (as desc
5d50: 72 69 62 65 64 0a 2a 2a 20 61 62 6f 76 65 29 20  ribed.** above) 
5d60: 77 68 69 63 68 20 69 73 20 77 68 79 20 61 6c 6c  which is why all
5d70: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
5d80: 65 73 20 68 61 76 65 20 62 65 65 6e 20 63 68 61  es have been cha
5d90: 6e 67 65 64 20 74 6f 20 75 73 65 0a 2a 2a 20 66  nged to use.** f
5da0: 6f 72 6d 61 74 20 33 2e 0a 2a 2a 0a 2a 2a 20 49  ormat 3..**.** I
5db0: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
5dc0: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
5dd0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
5de0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
5df0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
5e00: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
5e10: 6c 20 6c 69 6b 65 6c 79 20 61 6c 72 65 61 64 79  l likely already
5e20: 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
5e30: 2c 20 73 6f 20 74 68 65 20 50 41 47 45 52 5f 45  , so the PAGER_E
5e40: 52 52 5f 43 4f 52 52 55 50 54 20 62 69 74 20 69  RR_CORRUPT bit i
5e50: 73 20 73 65 74 20 69 6e 20 70 50 61 67 65 72 2d  s set in pPager-
5e60: 3e 65 72 72 4d 61 73 6b 0a 2a 2a 20 61 6e 64 20  >errMask.** and 
5e70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
5e80: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
5e90: 69 74 20 61 6c 6c 20 77 6f 72 6b 73 2c 20 74 68  it all works, th
5ea0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
5eb0: 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ** returns SQLIT
5ec0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
5ed0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
5ee0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
5ef0: 2c 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c  , int useJournal
5f00: 53 69 7a 65 29 7b 0a 20 20 6f 66 66 5f 74 20 73  Size){.  off_t s
5f10: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
5f20: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
5f30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
5f40: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
5f50: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
5f60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5f70: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
5f80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
5f90: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5fa0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5fb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
5fc0: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
5fd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5fe0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
5ff0: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
6000: 69 6e 74 20 66 6f 72 6d 61 74 3b 20 20 20 20 20  int format;     
6010: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d           /* Form
6020: 61 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  at of the journa
6030: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 75 6e 73  l file. */.  uns
6040: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
6050: 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  c[sizeof(aJourna
6060: 6c 4d 61 67 69 63 31 29 5d 3b 0a 20 20 69 6e 74  lMagic1)];.  int
6070: 20 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72   rc;..  /* Figur
6080: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
6090: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
60a0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
60b0: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
60c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
60d0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
60e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
60f0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
6100: 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67  liteOsSeek(&pPag
6110: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72  er->jfd, 0);.  r
6120: 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
6130: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
6140: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
6150: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6160: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
6170: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
6180: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
6190: 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
61a0: 6c 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  ll to contain a 
61b0: 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
61c0: 0a 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 6d 65  .  ** it must me
61d0: 61 6e 20 74 68 61 74 20 74 68 65 20 70 72 6f 63  an that the proc
61e0: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
61f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
6200: 20 6a 75 73 74 0a 20 20 2a 2a 20 62 65 67 69 6e   just.  ** begin
6210: 6e 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 68  ning to write th
6220: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
6230: 68 65 6e 20 69 74 20 64 69 65 64 2e 20 20 49 6e  hen it died.  In
6240: 20 74 68 61 74 20 63 61 73 65 2c 0a 20 20 2a 2a   that case,.  **
6250: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
6260: 6c 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 73  le should have s
6270: 74 69 6c 6c 20 62 65 65 6e 20 63 6f 6d 70 6c 65  till been comple
6280: 74 65 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tely unchanged..
6290: 20 20 2a 2a 20 4e 6f 74 68 69 6e 67 20 6e 65 65    ** Nothing nee
62a0: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
62b0: 62 61 63 6b 2e 20 20 57 65 20 63 61 6e 20 73 61  back.  We can sa
62c0: 66 65 6c 79 20 69 67 6e 6f 72 65 20 74 68 69 73  fely ignore this
62d0: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
62e0: 20 69 66 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f   if( szJ < sizeo
62f0: 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66  f(aMagic)+sizeof
6300: 28 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 67 6f  (Pgno) ){.    go
6310: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
6320: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
6330: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
6340: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
6350: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
6360: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
6370: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
6380: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
6390: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
63a0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66  Read(&pPager->jf
63b0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
63c0: 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66  f(aMagic));.  if
63d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
63e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
63f0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20  TE_PROTOCOL;.   
6400: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
6410: 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65  ck;.  }.  if( me
6420: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
6430: 75 72 6e 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a  urnalMagic3, siz
6440: 65 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20  eof(aMagic))==0 
6450: 29 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20  ){.    format = 
6460: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33  JOURNAL_FORMAT_3
6470: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
6480: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
6490: 75 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73 69 7a  urnalMagic2, siz
64a0: 65 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20  eof(aMagic))==0 
64b0: 29 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20  ){.    format = 
64c0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32  JOURNAL_FORMAT_2
64d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
64e0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
64f0: 75 72 6e 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a  urnalMagic1, siz
6500: 65 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20  eof(aMagic))==0 
6510: 29 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20  ){.    format = 
6520: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31  JOURNAL_FORMAT_1
6530: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6540: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
6550: 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  COL;.    goto en
6560: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
6570: 20 20 69 66 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f    if( format>=JO
6580: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29  URNAL_FORMAT_3 )
6590: 7b 0a 20 20 20 20 69 66 28 20 73 7a 4a 20 3c 20  {.    if( szJ < 
65a0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 20 2b  sizeof(aMagic) +
65b0: 20 33 2a 73 69 7a 65 6f 66 28 75 33 32 29 20 29   3*sizeof(u32) )
65c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72  {.      /* Ignor
65d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  e the journal if
65e0: 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c   it is too small
65f0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f   to contain a co
6600: 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20  mplete.      ** 
6610: 68 65 61 64 65 72 2e 20 20 57 65 20 61 6c 72 65  header.  We alre
6620: 61 64 79 20 64 69 64 20 74 68 69 73 20 74 65 73  ady did this tes
6630: 74 20 6f 6e 63 65 20 61 62 6f 76 65 2c 20 62 75  t once above, bu
6640: 74 20 61 74 20 74 68 65 20 70 72 69 6f 72 0a 20  t at the prior. 
6650: 20 20 20 20 20 2a 2a 20 74 65 73 74 2c 20 77 65       ** test, we
6660: 20 64 69 64 20 6e 6f 74 20 6b 6e 6f 77 20 74 68   did not know th
6670: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
6680: 20 61 6e 64 20 73 6f 20 77 65 20 68 61 64 20 74   and so we had t
6690: 6f 20 61 73 73 75 6d 65 0a 20 20 20 20 20 20 2a  o assume.      *
66a0: 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70  * the smallest p
66b0: 6f 73 73 69 62 6c 65 20 68 65 61 64 65 72 2e 20  ossible header. 
66c0: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 65   Now we know the
66d0: 20 68 65 61 64 65 72 20 69 73 20 62 69 67 67 65   header is bigge
66e0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20  r.      ** than 
66f0: 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 6f 20 77  the minimum so w
6700: 65 20 74 65 73 74 20 61 67 61 69 6e 2e 0a 20 20  e test again..  
6710: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74      */.      got
6720: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
6730: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
6740: 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74  ead32bits(format
6750: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
6760: 28 75 33 32 2a 29 26 6e 52 65 63 29 3b 0a 20 20  (u32*)&nRec);.  
6770: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
6780: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
6790: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
67a0: 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65  s(format, &pPage
67b0: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
67c0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20  >cksumInit);.   
67d0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
67e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
67f0: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
6800: 66 66 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75 72  fffff || useJour
6810: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  nalSize ){.     
6820: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
6830: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 33 29  OURNAL_HDR_SZ(3)
6840: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
6850: 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  3);.    }.  }els
6860: 65 7b 0a 20 20 20 20 6e 52 65 63 20 3d 20 28 73  e{.    nRec = (s
6870: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
6880: 5f 53 5a 28 32 29 29 2f 4a 4f 55 52 4e 41 4c 5f  _SZ(2))/JOURNAL_
6890: 50 47 5f 53 5a 28 32 29 3b 0a 20 20 20 20 61 73  PG_SZ(2);.    as
68a0: 73 65 72 74 28 20 6e 52 65 63 2a 4a 4f 55 52 4e  sert( nRec*JOURN
68b0: 41 4c 5f 50 47 5f 53 5a 28 32 29 2b 4a 4f 55 52  AL_PG_SZ(2)+JOUR
68c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 32 29 3d 3d 73  NAL_HDR_SZ(2)==s
68d0: 7a 4a 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  zJ );.  }.  rc =
68e0: 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d   read32bits(form
68f0: 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  at, &pPager->jfd
6900: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28 20  , &mxPg);.  if( 
6910: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6920: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
6930: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 61 73  ayback;.  }.  as
6940: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
6950: 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70  igDbSize==0 || p
6960: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
6970: 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72 63 20  e==mxPg );.  rc 
6980: 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  = sqliteOsTrunca
6990: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
69a0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
69b0: 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20  *(off_t)mxPg);. 
69c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
69d0: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
69e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
69f0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
6a00: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f  e = mxPg;.  .  /
6a10: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
6a20: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
6a30: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
6a40: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
6a50: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
6a60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
6a70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
6a80: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
6a90: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
6aa0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66   &pPager->jfd, f
6ab0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28 20  ormat);.    if( 
6ac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6ad0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ae0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
6af0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6b00: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
6b10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73  .  }..  /* Pages
6b30: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
6b40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
6b50: 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72  ournal but never
6b60: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65   synced.  ** whe
6b70: 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20  re not restored 
6b80: 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76  by the loop abov
6b90: 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72  e.  We have to r
6ba0: 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a  estore those.  *
6bb0: 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69  * pages by readi
6bc0: 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f  ng them back fro
6bd0: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  m the original d
6be0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
6bf0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c00: 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
6c10: 70 50 67 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  pPg;.    for(pPg
6c20: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
6c30: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
6c40: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 63 68  xtAll){.      ch
6c50: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50  ar zBuf[SQLITE_P
6c60: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20  AGE_SIZE];.     
6c70: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
6c80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6c90: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
6ca0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
6cb0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
6cc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53         sqliteOsS
6cd0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
6ce0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
6cf0: 45 2a 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70  E*(off_t)(pPg->p
6d00: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  gno-1));.       
6d10: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
6d20: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
6d30: 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41 47  zBuf, SQLITE_PAG
6d40: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
6d50: 20 54 52 41 43 45 32 28 22 52 45 46 45 54 43 48   TRACE2("REFETCH
6d60: 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
6d70: 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  o);.        CODE
6d80: 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  C(pPager, zBuf, 
6d90: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
6da0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
6db0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
6dc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
6dd0: 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49  et(zBuf, 0, SQLI
6de0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
6df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6e00: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
6e10: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
6e20: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
6e30: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
6e40: 5a 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ZE) ){.        m
6e50: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
6e60: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
6e70: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6e80: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
6e90: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
6ea0: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
6eb0: 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  ->nExtra);.     
6ec0: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
6ed0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
6ee0: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
6ef0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64  ;.    }.  }..end
6f00: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
6f10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6f20: 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  {.    pager_unwr
6f30: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
6f40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
6f50: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
6f60: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
6f70: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
6f80: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
6f90: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
6fa0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
6fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6fc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
6fd0: 61 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ack the checkpoi
6fe0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
6ff0: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
7000: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
7010: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
7020: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
7030: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
7040: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
7050: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
7060: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
7070: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7080: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
7090: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
70a0: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74  checkpoint is st
70b0: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
70c0: 63 6b 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  ckptSize, not in
70d0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
70e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
70f0: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
7100: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
7110: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
7120: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
7130: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
7140: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
7150: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
7160: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
7170: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
7180: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
7190: 73 65 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  set pPager->ckpt
71a0: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
71b0: 20 69 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f   int pager_ckpt_
71c0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
71d0: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
71e0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
71f0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
7200: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
7210: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
7240: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7270: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
7280: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
7290: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
72a0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
72b0: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
72c0: 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74   sqliteOsTruncat
72d0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
72e0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
72f0: 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 63  (off_t)pPager->c
7300: 6b 70 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  kptSize);.  pPag
7310: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
7320: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a  ger->ckptSize;..
7330: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
7340: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
7350: 20 61 72 65 20 69 6e 20 74 68 65 20 63 68 65 63   are in the chec
7360: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
7370: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
7380: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
7390: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
73a0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
73b0: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
73c0: 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 6e  r->cpfd, 0);.  n
73d0: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  Rec = pPager->ck
73e0: 70 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  ptNRec;.  .  /* 
73f0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
7400: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 63  ges out of the c
7410: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
7420: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
7430: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
7440: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
7450: 61 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  at the checkpoin
7460: 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79 73  t journal always
7470: 20 75 73 65 73 20 66 6f 72 6d 61 74 0a 20 20 2a   uses format.  *
7480: 2a 20 32 20 69 6e 73 74 65 61 64 20 6f 66 20 66  * 2 instead of f
7490: 6f 72 6d 61 74 20 33 20 73 69 6e 63 65 20 69 74  ormat 3 since it
74a0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
74b0: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 77  o be concerned w
74c0: 69 74 68 0a 20 20 2a 2a 20 70 6f 77 65 72 20 66  ith.  ** power f
74d0: 61 69 6c 75 72 65 73 20 63 6f 72 72 75 70 74 69  ailures corrupti
74e0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
74f0: 6e 64 20 63 61 6e 20 74 68 75 73 20 6f 6d 69 74  nd can thus omit
7500: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a   the checksums..
7510: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65    */.  for(i=nRe
7520: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
7530: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
7540: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
7550: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
7560: 72 2d 3e 63 70 66 64 2c 20 32 29 3b 0a 20 20 20  r->cpfd, 2);.   
7570: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
7580: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
7590: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
75a0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70  K ) goto end_ckp
75b0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
75c0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
75d0: 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20   how many pages 
75e0: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 70 69 65  need to be copie
75f0: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 74 72 61  d out of the tra
7600: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f  nsaction.  ** jo
7610: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63  urnal..  */.  rc
7620: 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28   = sqliteOsSeek(
7630: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
7640: 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29  ager->ckptJSize)
7650: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7660: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
7670: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
7680: 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ack;.  }.  rc = 
7690: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
76a0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
76b0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
76c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76d0: 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70   goto end_ckpt_p
76e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e  layback;.  }.  n
76f0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
7700: 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 2f  ger->ckptJSize)/
7710: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f  JOURNAL_PG_SZ(jo
7720: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20  urnal_format);. 
7730: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
7740: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
7750: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
7760: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
7770: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
7780: 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  , journal_format
7790: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
77a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
77b0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
77c0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
77d0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
77e0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
77f0: 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 63 6b 70 74  .  }.  .end_ckpt
7800: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
7810: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7820: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
7830: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
7840: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
7850: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
7860: 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  UPT;.  }.  retur
7870: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
7880: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
7890: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
78a0: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
78b0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
78c0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
78d0: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
78e0: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
78f0: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
7900: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
7910: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
7920: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
7930: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
7940: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
7950: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
7960: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
7970: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
7980: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
7990: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
79a0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
79b0: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
79c0: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
79d0: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
79e0: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
79f0: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
7a00: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
7a10: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
7a20: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
7a30: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
7a40: 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61  litepager_set_ca
7a50: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
7a60: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
7a70: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
7a80: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >=0 ){.    pPage
7a90: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
7aa0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
7ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
7ac0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20  r->noSync = 1;. 
7ad0: 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50     mxPage = -mxP
7ae0: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  age;.  }.  if( m
7af0: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
7b00: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
7b10: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a   mxPage;.  }.}..
7b20: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
7b30: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
7b40: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
7b50: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
7b60: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
7b70: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
7b80: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
7b90: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
7ba0: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
7bb0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
7bc0: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
7bd0: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
7be0: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
7bf0: 20 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 29    sqliteOsSync()
7c00: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
7c10: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
7c20: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
7c30: 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
7c40: 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
7c50: 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
7c60: 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
7c70: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
7c80: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
7c90: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
7ca0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
7cb0: 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
7cc0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
7cd0: 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
7ce0: 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
7cf0: 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
7d00: 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
7d10: 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
7d20: 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
7d40: 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
7d50: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
7d60: 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
7d70: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
7d80: 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
7d90: 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
7da0: 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
7db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
7dc0: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
7dd0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
7de0: 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
7df0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
7e00: 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
7e10: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
7e20: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
7e30: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
7e40: 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
7e50: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
7e60: 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
7e70: 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
7e80: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
7e90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
7ea0: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
7eb0: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
7ec0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7ed0: 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
7ee0: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
7ef0: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
7f00: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
7f10: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
7f20: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
7f30: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
7f40: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
7f50: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
7f60: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
7f70: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
7f80: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
7f90: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
7fa0: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
7fb0: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
7fc0: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
7fd0: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
7fe0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7ff0: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
8000: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
8010: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
8020: 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  3..*/.void sqlit
8030: 65 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  epager_set_safet
8040: 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  y_level(Pager *p
8050: 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
8060: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
8070: 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
8080: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
8090: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
80a0: 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
80b0: 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
80c0: 65 6d 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  empFile;.}../*.*
80d0: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
80e0: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
80f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8100: 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a  file into zName.
8110: 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62  ** (zName must b
8120: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
8130: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
8140: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
8150: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
8160: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
8170: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
8180: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
8190: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
81a0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
81b0: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
81c0: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
81d0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
81e0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
81f0: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
8200: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
8210: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 70 61  tic int sqlitepa
8220: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
8230: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
8240: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
8250: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
8260: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
8270: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d  .    sqliteOsTem
8280: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
8290: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
82a0: 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  eOsOpenExclusive
82b0: 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a  (zFile, fd, 1);.
82c0: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
82d0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
82e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
82f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
8300: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
8310: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
8320: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
8330: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
8340: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
8350: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
8360: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
8370: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
8380: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
8390: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
83a0: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29  qlitepager_get()
83b0: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
83c0: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
83d0: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
83e0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
83f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
8400: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
8410: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
8420: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
8430: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
8440: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
8450: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
8460: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
8470: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
8480: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
8490: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
84a0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
84b0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
84c0: 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  epager_open(.  P
84d0: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
84e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
84f0: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
8500: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
8510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
8520: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
8530: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8540: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
8550: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20  .  int mxPage,  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8570: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  ax number of in-
8580: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
8590: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  es */.  int nExt
85a0: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
85b0: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
85c0: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
85d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
85e0: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
85f0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  l           /* T
8600: 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c  RUE to use a rol
8610: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
8620: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
8630: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
8640: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
8650: 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  athname;.  int n
8660: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
8670: 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 2c 20 69   fd;.  int rc, i
8680: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
8690: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
86a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54 65   = 0;.  char zTe
86b0: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
86c0: 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70  ME_SIZE];..  *pp
86d0: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  Pager = 0;.  if(
86e0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
86f0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
8700: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8710: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
8720: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
8730: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 7a 46 75  me[0] ){.    zFu
8740: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
8750: 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  iteOsFullPathnam
8760: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
8770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f    rc = sqliteOsO
8780: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
8790: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
87a0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
87b0: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
87c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
87d0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
87e0: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
87f0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
8800: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
8810: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
8820: 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61  liteOsFullPathna
8830: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
8840: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
8850: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
8860: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
8870: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8880: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8890: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
88a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
88b0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
88c0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
88d0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
88e0: 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20  ;.  }.  nameLen 
88f0: 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61  = strlen(zFullPa
8900: 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  thname);.  pPage
8910: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
8920: 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  ( sizeof(*pPager
8930: 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20  ) + nameLen*3 + 
8940: 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  30 );.  if( pPag
8950: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  er==0 ){.    sql
8960: 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  iteOsClose(&fd);
8970: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8980: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
8990: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
89a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53  E_NOMEM;.  }.  S
89b0: 45 54 5f 50 41 47 45 52 28 70 50 61 67 65 72 29  ET_PAGER(pPager)
89c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
89d0: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
89e0: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
89f0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
8a00: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
8a10: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
8a20: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
8a30: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
8a40: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
8a50: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
8a60: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
8a70: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
8a80: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
8a90: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
8aa0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
8ab0: 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20   for(i=nameLen; 
8ac0: 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
8ad0: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
8ae0: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
8af0: 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
8b00: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
8b10: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50  = 0;.  strcpy(pP
8b20: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
8b30: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
8b40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
8b50: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
8b60: 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  trcpy(&pPager->z
8b70: 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d  Journal[nameLen]
8b80: 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20  , "-journal");. 
8b90: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64   pPager->fd = fd
8ba0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
8bb0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  nalOpen = 0;.  p
8bc0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
8bd0: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  l = useJournal;.
8be0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70    pPager->ckptOp
8bf0: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
8c00: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b  ->ckptInUse = 0;
8c10: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
8c20: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
8c30: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50  bSize = -1;.  pP
8c40: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d  ager->ckptSize =
8c50: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b   0;.  pPager->ck
8c60: 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  ptJSize = 0;.  p
8c70: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
8c80: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ;.  pPager->mxPa
8c90: 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20  ge = mxPage>5 ? 
8ca0: 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70  mxPage : 10;.  p
8cb0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
8cc0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  QLITE_UNLOCK;.  
8cd0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
8ce0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74  = 0;.  pPager->t
8cf0: 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
8d00: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  le;.  pPager->re
8d10: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
8d20: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  y;.  pPager->nee
8d30: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
8d40: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
8d50: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
8d60: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
8d70: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
8d80: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8d90: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
8da0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
8db0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8dc0: 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b  nExtra = nExtra;
8dd0: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
8de0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
8df0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
8e00: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
8e10: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
8e20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8e30: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
8e40: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
8e50: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
8e60: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
8e70: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
8e80: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
8e90: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
8ea0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
8eb0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
8ec0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
8ed0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
8ee0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
8ef0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
8f00: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
8f10: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
8f20: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
8f30: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
8f40: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 70  a result sqlitep
8f50: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
8f60: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
8f70: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
8f80: 79 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  y sqlitepager_un
8f90: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
8fa0: 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 64  qlitepager_set_d
8fb0: 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20  estructor(Pager 
8fc0: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
8fd0: 78 44 65 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a  xDesc)(void*)){.
8fe0: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
8ff0: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
9000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9010: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
9020: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
9030: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
9040: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
9050: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
9060: 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  tepager_pagecoun
9070: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
9080: 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61  {.  off_t n;.  a
9090: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
90a0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
90b0: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
90c0: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
90d0: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ->dbSize;.  }.  
90e0: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  if( sqliteOsFile
90f0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
9100: 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , &n)!=SQLITE_OK
9110: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
9120: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
9130: 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72  _ERR_DISK;.    r
9140: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
9150: 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   /= SQLITE_PAGE_
9160: 53 49 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67  SIZE;.  if( pPag
9170: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
9180: 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_UNLOCK ){.    
9190: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
91a0: 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
91b0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72   n;.}../*.** For
91c0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
91d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
91e0: 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
91f0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  *);../*.** Trunc
9200: 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
9210: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
9220: 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
9230: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
9240: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
9250: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
9260: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
9270: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
9280: 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73  bSize<0 ){.    s
9290: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63  qlitepager_pagec
92a0: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
92b0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
92c0: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
92d0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
92e0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
92f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
9300: 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
9310: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
9320: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
9330: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9340: 20 20 7d 0a 20 20 73 79 6e 63 4a 6f 75 72 6e 61    }.  syncJourna
9350: 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  l(pPager);.  rc 
9360: 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  = sqliteOsTrunca
9370: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
9380: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
9390: 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a  *(off_t)nPage);.
93a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
93b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
93c0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
93d0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
93e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
93f0: 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
9400: 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
9410: 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
9420: 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
9430: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
9440: 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
9450: 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
9460: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
9470: 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
9480: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
9490: 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
94a0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
94b0: 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
94c0: 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
94d0: 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
94e0: 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
94f0: 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
9500: 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
9510: 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
9520: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9530: 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
9540: 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
9550: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73  redump..*/.int s
9560: 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65  qlitepager_close
9570: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9580: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
9590: 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28  pNext;.  switch(
95a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29   pPager->state )
95b0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
95c0: 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20  E_WRITELOCK: {. 
95d0: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
95e0: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
95f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f  );.      sqliteO
9600: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
9610: 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
9620: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
9630: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
9640: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9650: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
9660: 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20  _READLOCK: {.   
9670: 20 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63     sqliteOsUnloc
9680: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
9690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
96a0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
96b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
96c0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
96d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
96e0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
96f0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
9700: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
9710: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
9720: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
9730: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 73  ee(pPg);.  }.  s
9740: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
9750: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73  ager->fd);.  ass
9760: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
9770: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
9780: 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
9790: 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
97a0: 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
97b0: 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
97c0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
97d0: 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 4f 73 44    **   sqliteOsD
97e0: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
97f0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
9800: 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45  .  */.  CLR_PAGE
9810: 52 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  R(pPager);.  if(
9820: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
9830: 6d 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67  me!=(char*)&pPag
9840: 65 72 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73  er[1] ){.    ass
9850: 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
9860: 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
9870: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
9880: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
9890: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
98a0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
98b0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
98c0: 65 65 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  ee(pPager->zDire
98d0: 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71  ctory);.  }.  sq
98e0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
98f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9900: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
9910: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
9920: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
9930: 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
9940: 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70 61 67  /.Pgno sqlitepag
9950: 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f  er_pagenumber(vo
9960: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
9970: 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f  Hdr *p = DATA_TO
9980: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
9990: 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
99a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
99b0: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
99c0: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
99d0: 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ge.  If the page
99e0: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
99f0: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
9a00: 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
9a10: 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
9a20: 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
9a30: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
9a40: 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  st..*/.#define p
9a50: 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
9a60: 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
9a70: 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
9a80: 29 2d 3e 6e 52 65 66 2b 2b 29 0a 73 74 61 74 69  )->nRef++).stati
9a90: 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
9aa0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
9ab0: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
9ac0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
9ad0: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
9ae0: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
9af0: 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
9b00: 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
9b10: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
9b20: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
9b30: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
9b40: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
9b50: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
9b60: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
9b70: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
9b80: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
9b90: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
9ba0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
9bb0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
9bc0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
9bd0: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
9be0: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
9bf0: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
9c00: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
9c10: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
9c20: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
9c30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
9c40: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
9c50: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
9c60: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
9c70: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
9c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9c90: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
9ca0: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
9cb0: 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
9cc0: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
9cd0: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
9ce0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
9cf0: 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  FO(pPg);.}../*.*
9d00: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
9d10: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
9d20: 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
9d30: 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
9d40: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
9d50: 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
9d60: 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
9d70: 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a  pager_ref(void *
9d80: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
9d90: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
9da0: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70  GHDR(pData);.  p
9db0: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
9dc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9dd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
9de0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
9df0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
9e00: 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
9e10: 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
9e20: 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
9e30: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
9e40: 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
9e50: 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
9e60: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
9e70: 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
9e80: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
9e90: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
9ea0: 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
9eb0: 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
9ec0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
9ed0: 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
9ee0: 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
9ef0: 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
9f00: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
9f10: 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
9f20: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
9f30: 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
9f40: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
9f50: 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
9f60: 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
9f70: 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
9f80: 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
9f90: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
9fa0: 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
9fb0: 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
9fc0: 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
9fd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
9fe0: 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
9ff0: 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
a000: 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
a010: 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
a020: 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
a030: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
a040: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
a050: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
a060: 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
a070: 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
a080: 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
a090: 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
a0a0: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
a0b0: 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
a0c0: 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
a0d0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
a0e0: 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
a0f0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
a100: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
a110: 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
a120: 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
a130: 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
a140: 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
a150: 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
a160: 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
a170: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
a180: 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
a190: 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
a1a0: 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
a1b0: 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
a1c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a1d0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
a1e0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
a1f0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
a200: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a210: 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
a220: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
a230: 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
a240: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
a250: 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
a260: 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
a270: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
a280: 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
a290: 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
a2a0: 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
a2b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
a2c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a2d0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a2e0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 61  lOpen );.      a
a2f0: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
a300: 6e 6f 53 79 6e 63 20 29 3b 0a 23 69 66 6e 64 65  noSync );.#ifnde
a310: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
a320: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
a330: 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
a340: 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
a350: 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
a360: 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
a370: 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
a380: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
a390: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
a3a0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
a3b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66    */.        off
a3c0: 5f 74 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20  _t hdrSz, pgSz, 
a3d0: 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64 72  jSz;.        hdr
a3e0: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  Sz = JOURNAL_HDR
a3f0: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
a400: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53  at);.        pgS
a410: 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  z = JOURNAL_PG_S
a420: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
a430: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
a440: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
a450: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
a460: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
a470: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
a480: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
a490: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
a4a0: 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53  c*pgSz+hdrSz==jS
a4b0: 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
a4c0: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6a 6f  dif.      if( jo
a4d0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 33 20  urnal_format>=3 
a4e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
a4f0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
a500: 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
a510: 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20  nal file header 
a520: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
a530: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66   szJ;.        if
a540: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
a550: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
a560: 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29  TRACE1("SYNC\n")
a570: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
a580: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70   sqliteOsSync(&p
a590: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
a5a0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
a5b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a5d0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
a5e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f  ager->jfd, sizeo
a5f0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
a600: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
a610: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
a620: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a630: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
a640: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a650: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73 7a  n rc;.        sz
a660: 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J = JOURNAL_HDR_
a670: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
a680: 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  t) +.           
a690: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
a6a0: 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ec*JOURNAL_PG_SZ
a6b0: 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
a6c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a6d0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
a6e0: 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20  jfd, szJ);.     
a6f0: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 31 28   }.      TRACE1(
a700: 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20  "SYNC\n");.     
a710: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79   rc = sqliteOsSy
a720: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
a730: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
a740: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
a750: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
a760: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
a770: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
a780: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
a790: 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
a7a0: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
a7b0: 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
a7c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
a7d0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
a7e0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
a7f0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
a800: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
a810: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
a820: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
a830: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
a840: 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
a850: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
a860: 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
a870: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
a880: 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
a890: 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
a8a0: 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
a8b0: 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
a8c0: 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
a8d0: 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
a8e0: 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
a8f0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
a900: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
a910: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
a920: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
a930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a940: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
a950: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
a960: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
a970: 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
a980: 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
a990: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
a9a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
a9b0: 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
a9c0: 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
a9d0: 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
a9e0: 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
a9f0: 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
aa00: 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
aa10: 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
aa20: 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
aa30: 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
aa40: 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
aa50: 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
aa60: 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
aa70: 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
aa80: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
aa90: 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
aaa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
aab0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
aac0: 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
aad0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
aae0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
aaf0: 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
ab00: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
ab10: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
ab20: 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  List->pgno-1)*(o
ab30: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
ab40: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45  _SIZE);.    CODE
ab50: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
ab60: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
ab70: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
ab80: 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4f  .    TRACE2("STO
ab90: 52 45 20 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d  RE %d\n", pList-
aba0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d  >pgno);.    rc =
abb0: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
abc0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
abd0: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
abe0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
abf0: 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70  ZE);.    CODEC(p
ac00: 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
ac10: 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
ac20: 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  st->pgno, 0);.  
ac30: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ac40: 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
ac50: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
ac60: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
ac70: 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
ac80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ac90: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
aca0: 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
acb0: 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
acc0: 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
acd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
ace0: 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
acf0: 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
ad00: 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
ad10: 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
ad20: 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
ad30: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
ad40: 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
ad50: 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
ad60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
ad70: 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20  dr *p, *pList;. 
ad80: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f   pList = 0;.  fo
ad90: 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
ada0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
adb0: 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ll){.    if( p->
adc0: 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  dirty ){.      p
add0: 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74  ->pDirty = pList
ade0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
adf0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  p;.    }.  }.  r
ae00: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
ae10: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
ae20: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
ae30: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
ae40: 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
ae50: 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
ae60: 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
ae70: 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
ae80: 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
ae90: 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
aea0: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
aeb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74  ed..**.** A _get
aec0: 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
aed0: 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
aee0: 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
aef0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
af00: 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
af10: 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
af20: 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
af30: 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
af40: 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
af50: 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
af60: 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
af70: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
af80: 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
af90: 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
afa0: 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
afb0: 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
afc0: 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
afd0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
afe0: 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
aff0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
b000: 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
b010: 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
b020: 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
b030: 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
b040: 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
b050: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
b060: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
b070: 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
b080: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
b090: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67  e also sqlitepag
b0a0: 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  er_lookup().  Bo
b0b0: 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
b0c0: 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74  and _lookup() at
b0d0: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
b0e0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
b0f0: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
b100: 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
b110: 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
b120: 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
b130: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
b140: 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
b150: 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
b160: 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73  _lookup().** jus
b170: 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
b180: 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
b190: 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
b1a0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
b1b0: 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
b1c0: 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
b1d0: 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
b1e0: 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
b1f0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
b200: 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20  Since _lookup() 
b210: 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
b220: 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
b230: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
b240: 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
b250: 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
b260: 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28  sqlitepager_get(
b270: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
b280: 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
b290: 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
b2a0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
b2b0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
b2c0: 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
b2d0: 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
b2e0: 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
b2f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
b300: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
b310: 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  no!=0 );.  *ppPa
b320: 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
b330: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
b340: 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
b350: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b360: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
b370: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
b380: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
b390: 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
b3a0: 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
b3b0: 72 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  read lock.  ** o
b3c0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
b3d0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
b3e0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
b3f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
b400: 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50  teOsReadLock(&pP
b410: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69  ager->fd);.    i
b420: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b430: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b440: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
b450: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
b460: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a  QLITE_READLOCK;.
b470: 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
b480: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
b490: 2c 20 74 72 79 20 74 6f 20 70 6c 61 79 20 69 74  , try to play it
b4a0: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
b4b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
b4c0: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 73 71 6c 69  eJournal && sqli
b4d0: 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  teOsFileExists(p
b4e0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
b4f0: 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
b500: 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
b510: 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
b520: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
b530: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b540: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
b550: 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  teLock(&pPager->
b560: 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  fd);.       if( 
b570: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b580: 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71  .         if( sq
b590: 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  liteOsUnlock(&pP
b5a0: 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54  ager->fd)!=SQLIT
b5b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b5c0: 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
b5d0: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 21 20  d never happen! 
b5e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  */.           rc
b5f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
b600: 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  AL;.         }. 
b610: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
b620: 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
b630: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
b640: 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c   = SQLITE_WRITEL
b650: 4f 43 4b 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  OCK;..       /* 
b660: 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
b670: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
b680: 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
b690: 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
b6a0: 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
b6b0: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
b6c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
b6d0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
b6e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
b6f0: 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
b700: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
b710: 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
b720: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
b730: 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
b740: 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
b750: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
b760: 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
b770: 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
b780: 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
b790: 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
b7a0: 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
b7b0: 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
b7c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
b7d0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
b7e0: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
b7f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f    rc = sqliteOsO
b800: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67  penReadOnly(pPag
b810: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
b820: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
b830: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b840: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55    rc = sqliteOsU
b860: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
b870: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73  d);.         ass
b880: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
b890: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 72  OK );.         r
b8a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
b8b0: 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  Y;.       }.    
b8c0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
b8d0: 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
b8e0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
b8f0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 0a  alStarted = 0;..
b900: 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
b910: 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
b920: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
b930: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
b940: 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ite.       ** lo
b950: 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
b960: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
b970: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b980: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
b990: 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
b9a0: 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
b9b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b9c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
b9d0: 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  .       }.    }.
b9e0: 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
b9f0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61  else{.    /* Sea
ba00: 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20  rch for page in 
ba10: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67  cache */.    pPg
ba20: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
ba30: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
ba40: 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
ba50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
ba60: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
ba70: 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
ba80: 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
ba90: 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t h;.    pPager-
baa0: 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66  >nMiss++;.    if
bab0: 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
bac0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
bad0: 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
bae0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
baf0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
bb00: 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d  e */.      pPg =
bb10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
bb20: 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
bb30: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
bb40: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E .             
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
bb70: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
bb80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
bb90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
bba0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
bbb0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
bbc0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
bbd0: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d  k |= PAGER_ERR_M
bbe0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  EM;.        retu
bbf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
bc00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
bc10: 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69  emset(pPg, 0, si
bc20: 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20  zeof(*pPg));.   
bc30: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
bc40: 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
bc50: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
bc60: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
bc70: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
bc80: 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  All ){.        p
bc90: 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50 72  Pager->pAll->pPr
bca0: 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  evAll = pPg;.   
bcb0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
bcc0: 70 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20  pPrevAll = 0;.  
bcd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
bce0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50   = pPg;.      pP
bcf0: 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20  ager->nPage++;. 
bd00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bd10: 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
bd20: 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
bd30: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
bd40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
bd50: 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20       ** require 
bd60: 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
bd70: 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
bd80: 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
bd90: 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
bda0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
bdb0: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
bdc0: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
bdd0: 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
bde0: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
bdf0: 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ync().      ** o
be00: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
be10: 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
be20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
be30: 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20   This is a.     
be40: 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
be50: 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
be60: 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
be70: 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
be80: 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74  imes.      ** it
be90: 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
bea0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
beb0: 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
bec0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
bed0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
bee0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
bef0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
bf00: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
bf10: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
bf20: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
bf30: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
bf40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bf50: 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
bf60: 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
bf70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bf80: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
bf90: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
bfa0: 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
bfb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
bfc0: 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
bfd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
bfe0: 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
bff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c000: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
c010: 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
c020: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
c030: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
c040: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
c050: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
c060: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c070: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
c080: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
c090: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
c0a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c0b0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
c0c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
c0d0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
c0e0: 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rty==0 );..     
c0f0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
c100: 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
c110: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
c120: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
c130: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  en.      ** set 
c140: 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
c150: 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
c160: 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
c170: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
c180: 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  te_dont_rollback
c190: 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
c1a0: 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
c1b0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
c1c0: 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73  ..      ** It is
c1d0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
c1e0: 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
c1f0: 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
c200: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20  waysRollback.   
c210: 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72     ** might be r
c220: 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
c230: 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
c240: 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
c250: 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20  't remember.    
c260: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
c270: 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
c280: 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
c290: 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
c2a0: 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  es must.      **
c2b0: 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
c2c0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
c2d0: 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
c2e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
c2f0: 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
c300: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
c310: 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
c320: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
c330: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
c340: 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
c350: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
c360: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
c370: 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  sh table.      *
c380: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  /.      if( pPg=
c390: 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
c3a0: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ynced ){.       
c3b0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
c3c0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
c3d0: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
c3e0: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
c3f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
c400: 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
c410: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
c420: 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = p;.      }.   
c430: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
c440: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  vFree ){.       
c450: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
c460: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
c470: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
c480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c490: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c4a0: 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
c4b0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c4c0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
c4d0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
c4e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
c4f0: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
c500: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
c510: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
c520: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
c530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c550: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
c560: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  g );.        pPa
c570: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
c580: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
c590: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
c5a0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
c5b0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
c5c0: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
c5d0: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
c5e0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
c5f0: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
c600: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
c610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c620: 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
c630: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
c640: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
c650: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
c660: 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 65  xtHash;.      }e
c670: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20 3d  lse{.        h =
c680: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
c690: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
c6a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c6b0: 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b  aHash[h]==pPg );
c6c0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c6d0: 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
c6e0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20  >pNextHash;.    
c6f0: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
c700: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
c710: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
c720: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76       pPager->nOv
c730: 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fl++;.    }.    
c740: 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
c750: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c760: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
c770: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
c780: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
c790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 65  .      sqliteChe
c7a0: 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  ckMemory(pPager-
c7b0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >aInJournal, pgn
c7c0: 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65  o/8);.      asse
c7d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
c7e0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
c7f0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
c800: 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
c810: 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
c820: 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
c830: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
c840: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
c850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
c860: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
c870: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
c880: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
c890: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
c8a0: 61 49 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29  aInCkpt && (int)
c8b0: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b  pgno<=pPager->ck
c8c0: 70 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  ptSize.         
c8d0: 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
c8e0: 61 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38 5d 20  aInCkpt[pgno/8] 
c8f0: 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
c900: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  !=0 ){.      pag
c910: 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69  e_add_to_ckpt_li
c920: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  st(pPg);.    }el
c930: 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72  se{.      page_r
c940: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70 74 5f  emove_from_ckpt_
c950: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
c960: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
c970: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  = 0;.    pPg->nR
c980: 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
c990: 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50  NFO(pPg);.    pP
c9a0: 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
c9b0: 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
c9c0: 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d  (pgno);.    pPg-
c9d0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
c9e0: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
c9f0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
ca00: 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
ca10: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
ca20: 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
ca30: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
ca40: 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
ca50: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
ca60: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
ca70: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
ca80: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ca90: 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
caa0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
cab0: 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c  O_EXTRA(pPg), 0,
cac0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
cad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cae0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
caf0: 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70   ) sqlitepager_p
cb00: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
cb10: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
cb20: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
cb30: 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
cb40: 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
cb50: 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
cb60: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
cb70: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
cb80: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cb90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
cba0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
cbb0: 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
cbc0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
cbd0: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
cbe0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
cbf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cc00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
cc10: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
cc20: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
cc30: 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45  1)*(off_t)SQLITE
cc40: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
cc50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
cc60: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
cc70: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
cc80: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
cc90: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54  E_SIZE);.      T
cca0: 52 41 43 45 32 28 22 46 45 54 43 48 20 25 64 5c  RACE2("FETCH %d\
ccb0: 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
ccc0: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
ccd0: 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
cce0: 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
ccf0: 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
cd00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cd10: 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  {.        off_t 
cd20: 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  fileSize;.      
cd30: 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69    if( sqliteOsFi
cd40: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
cd50: 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53  fd,&fileSize)!=S
cd60: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
cd70: 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53          || fileS
cd80: 69 7a 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45  ize>=pgno*SQLITE
cd90: 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
cda0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 70 61          sqlitepa
cdb0: 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
cdc0: 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
cdd0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
cde0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rc;.        }els
cdf0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
ce00: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
ce10: 41 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54  A(pPg), 0, SQLIT
ce20: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
ce30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ce40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ce50: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
ce60: 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
ce70: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
ce80: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48  /.    pPager->nH
ce90: 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72  it++;.    page_r
cea0: 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
ceb0: 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
cec0: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
ced0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
cef0: 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
cf00: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
cf10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
cf20: 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
cf30: 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
cf40: 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
cf50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
cf60: 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
cf70: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
cf80: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
cf90: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 70  See also sqlitep
cfa0: 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
cfb0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
cfc0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
cfd0: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 70 61  .** and sqlitepa
cfe0: 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61  ger_get() is tha
cff0: 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
d000: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
d010: 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
d020: 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
d030: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
d040: 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
d050: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
d060: 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
d070: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
d080: 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
d090: 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
d0a0: 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
d0b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
d0c0: 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  epager_lookup(Pa
d0d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
d0e0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
d0f0: 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
d100: 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
d110: 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
d120: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
d130: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
d140: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
d150: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d160: 20 7d 0a 20 20 2f 2a 20 69 66 28 20 70 50 61 67   }.  /* if( pPag
d170: 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  er->nRef==0 ){. 
d180: 20 2a 2a 20 20 72 65 74 75 72 6e 20 30 3b 0a 20   **  return 0;. 
d190: 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 70 50 67   ** }.  */.  pPg
d1a0: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
d1b0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
d1c0: 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
d1d0: 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
d1e0: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
d1f0: 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
d200: 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
d210: 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
d220: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
d230: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
d240: 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
d250: 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
d260: 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
d270: 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
d280: 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
d290: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
d2a0: 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
d2b0: 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
d2c0: 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
d2d0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
d2e0: 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
d2f0: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
d300: 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28  litepager_unref(
d310: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
d320: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
d330: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
d340: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
d350: 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
d360: 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f  */.  pPg = DATA_
d370: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
d380: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
d390: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
d3a0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
d3b0: 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  FO(pPg);..  /* W
d3c0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
d3d0: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
d3e0: 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
d3f0: 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
d400: 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
d410: 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
d420: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
d430: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
d440: 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
d450: 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
d460: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
d470: 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
d480: 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
d490: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
d4a0: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
d4b0: 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
d4c0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
d4d0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
d4e0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
d4f0: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
d500: 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
d510: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
d520: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
d530: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
d540: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
d550: 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
d560: 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
d570: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
d580: 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
d590: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
d5a0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
d5b0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
d5c0: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
d5d0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ata);.    }.  . 
d5e0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
d5f0: 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
d600: 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
d610: 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
d620: 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
d630: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
d640: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
d650: 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
d660: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
d670: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
d680: 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
d690: 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
d6a0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  t(pPager);.    }
d6b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
d6c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d6d0: 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  * Create a journ
d6e0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  al file for pPag
d6f0: 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c  er.  There shoul
d700: 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 77  d already be a w
d710: 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  rite.** lock on 
d720: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d730: 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
d740: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
d750: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
d760: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
d770: 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ing.  Return an 
d780: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
d790: 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72  elease the.** wr
d7a0: 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74  ite lock if anyt
d7b0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
d7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
d7d0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
d7e0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
d7f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
d800: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d810: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate==SQLITE_WRIT
d820: 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  ELOCK );.  asser
d830: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
d840: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
d850: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
d860: 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73  seJournal );.  s
d870: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63  qlitepager_pagec
d880: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
d890: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
d8a0: 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  al = sqliteMallo
d8b0: 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
d8c0: 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
d8d0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
d8e0: 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nal==0 ){.    sq
d8f0: 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26  liteOsReadLock(&
d900: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
d910: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
d920: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
d930: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d940: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d950: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70   rc = sqliteOsOp
d960: 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
d970: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
d980: 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
d990: 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
d9a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d9b0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
d9c0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
d9d0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
d9e0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
d9f0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  = 0;.    sqliteO
da00: 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65  sReadLock(&pPage
da10: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61 67  r->fd);.    pPag
da20: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
da30: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20  TE_READLOCK;.   
da40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
da50: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73  ANTOPEN;.  }.  s
da60: 71 6c 69 74 65 4f 73 4f 70 65 6e 44 69 72 65 63  qliteOsOpenDirec
da70: 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
da80: 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
da90: 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
daa0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
dab0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
dac0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dad0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
dae0: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
daf0: 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
db00: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
db10: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
db20: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
db30: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
db40: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
db50: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
db60: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
db70: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
db80: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
db90: 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66  .  if( journal_f
dba0: 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat==JOURNAL_F
dbb0: 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 72  ORMAT_3 ){.    r
dbc0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
dbd0: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
dbe0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 2c 20  aJournalMagic3, 
dbf0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
dc00: 61 67 69 63 33 29 29 3b 0a 20 20 20 20 69 66 28  agic3));.    if(
dc10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
dc20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  {.      rc = wri
dc30: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
dc40: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
dc50: 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66  oSync ? 0xffffff
dc60: 66 66 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ff : 0);.    }. 
dc70: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dc80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
dc90: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
dca0: 3d 20 28 75 33 32 29 73 71 6c 69 74 65 52 61 6e  = (u32)sqliteRan
dcb0: 64 6f 6d 49 6e 74 65 67 65 72 28 29 3b 0a 20 20  domInteger();.  
dcc0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
dcd0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
dce0: 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  d, pPager->cksum
dcf0: 49 6e 69 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Init);.    }.  }
dd00: 65 6c 73 65 20 69 66 28 20 6a 6f 75 72 6e 61 6c  else if( journal
dd10: 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c  _format==JOURNAL
dd20: 5f 46 4f 52 4d 41 54 5f 32 20 29 7b 0a 20 20 20  _FORMAT_2 ){.   
dd30: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
dd40: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
dd50: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32  , aJournalMagic2
dd60: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
dd70: 6c 4d 61 67 69 63 32 29 29 3b 0a 20 20 7d 65 6c  lMagic2));.  }el
dd80: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
dd90: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d  journal_format==
dda0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31  JOURNAL_FORMAT_1
ddb0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
ddc0: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
ddd0: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
dde0: 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66 28  lMagic1, sizeof(
ddf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29 29  aJournalMagic1))
de00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
de10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
de20: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
de30: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
de40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
de50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
de60: 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20  r->ckptAutoopen 
de70: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
de80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
de90: 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65  itepager_ckpt_be
dea0: 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
deb0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
dec0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
ded0: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
dee0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
def0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
df00: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
df10: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
df20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
df30: 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rc;  .}../*.** A
df40: 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
df50: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
df60: 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
df70: 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
df80: 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
df90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
dfa0: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
dfb0: 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74  litepager_commit
dfc0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
dfd0: 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65     *  sqlitepage
dfe0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  r_rollback() is 
dff0: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
e000: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
e010: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
e020: 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67  *   *  sqlitepag
e030: 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61  er_unref() is ca
e040: 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
e050: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
e060: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  e..**.** The par
e070: 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
e080: 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
e090: 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
e0a0: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
e0b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
e0c0: 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
e0d0: 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
e0e0: 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
e0f0: 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72 65 20  y.** to acquire 
e100: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
e110: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
e120: 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
e130: 61 74 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  at there.** is a
e140: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
e150: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
e160: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  se..**.** A jour
e170: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
e180: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
e190: 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
e1a0: 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d 70  le.  For.** temp
e1b0: 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
e1c0: 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
e1d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
e1e0: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 0a 2a  deferred until.*
e1f0: 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63  * there is an ac
e200: 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
e210: 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
e220: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
e230: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
e240: 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64  ady write-locked
e250: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e260: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
e270: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 62 65  t sqlitepager_be
e280: 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 29  gin(void *pData)
e290: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
e2a0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
e2b0: 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
e2c0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
e2d0: 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
e2e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
e2f0: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
e300: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e310: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
e320: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  LITE_UNLOCK );. 
e330: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
e340: 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c  te==SQLITE_READL
e350: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
e360: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
e370: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
e380: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
e390: 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  teLock(&pPager->
e3a0: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
e3b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e3c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e3d0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
e3e0: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
e3f0: 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 70  WRITELOCK;.    p
e400: 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65  Pager->dirtyFile
e410: 20 3d 20 30 3b 0a 20 20 20 20 54 52 41 43 45 31   = 0;.    TRACE1
e420: 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 5c 6e 22  ("TRANSACTION\n"
e430: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
e440: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
e450: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
e460: 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
e470: 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
e480: 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
e490: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e4a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
e4b0: 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
e4c0: 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
e4d0: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
e4e0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
e4f0: 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
e500: 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
e510: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
e520: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
e530: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
e540: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
e550: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
e560: 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
e570: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
e580: 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
e590: 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
e5a0: 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
e5b0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
e5c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
e5d0: 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 6c  f the write.** l
e5e0: 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
e5f0: 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
e600: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
e610: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
e620: 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
e630: 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
e640: 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
e650: 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
e660: 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
e670: 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
e680: 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
e690: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
e6a0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
e6b0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
e6c0: 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
e6d0: 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
e6e0: 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
e6f0: 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
e700: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
e710: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
e720: 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
e730: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
e740: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
e750: 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
e760: 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
e770: 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
e780: 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
e790: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d   sqlitepager_com
e7a0: 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 70  mit() or sqlitep
e7b0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
e7c0: 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
e7d0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
e7e0: 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
e7f0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
e800: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
e810: 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
e820: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
e830: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
e840: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
e850: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
e860: 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
e870: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
e880: 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
e890: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
e8a0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
e8b0: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
e8c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e8d0: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
e8e0: 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
e8f0: 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
e900: 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
e910: 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
e920: 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
e930: 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
e940: 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
e950: 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50   away..  */.  pP
e960: 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
e970: 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
e980: 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 43 6b  al && (pPg->inCk
e990: 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 6b  pt || pPager->ck
e9a0: 70 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  ptInUse==0) ){. 
e9b0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
e9c0: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  File = 1;.    re
e9d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e9e0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
e9f0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
ea00: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
ea10: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
ea20: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  .  ** written to
ea30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ea40: 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
ea50: 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
ea60: 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  al.  ** or both.
ea70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74  .  **.  ** First
ea80: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
ea90: 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
eaa0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
eab0: 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74  s and.  ** creat
eac0: 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
ead0: 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
eae0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
eaf0: 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  e!=SQLITE_UNLOCK
eb00: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
eb10: 65 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  epager_begin(pDa
eb20: 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ta);.  if( rc!=S
eb30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
eb40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
eb50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
eb60: 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57  >state==SQLITE_W
eb70: 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RITELOCK );.  if
eb80: 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
eb90: 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
eba0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
ebb0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
ebc0: 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
ebd0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
ebe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
ebf0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
ec00: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
ec10: 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
ec20: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
ec30: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69   );.  pPager->di
ec40: 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 0a 20 20  rtyFile = 1;..  
ec50: 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
ec60: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
ec70: 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
ec80: 65 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  e a write lock o
ec90: 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20  n the.  ** main 
eca0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
ecb0: 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
ecc0: 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 74 72  t page to the tr
ecd0: 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
ece0: 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
ecf0: 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
ed00: 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  dy..  */.  if( !
ed10: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
ed20: 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
ed30: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  rnal ){.    if( 
ed40: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
ed50: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
ed60: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Size ){.      in
ed70: 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33  t szPg;.      u3
ed80: 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69  2 saved;.      i
ed90: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
eda0: 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t>=JOURNAL_FORMA
edb0: 54 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20 75  T_3 ){.        u
edc0: 33 32 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72  32 cksum = pager
edd0: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70  _cksum(pPager, p
ede0: 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29  Pg->pgno, pData)
edf0: 3b 0a 20 20 20 20 20 20 20 20 73 61 76 65 64 20  ;.        saved 
ee00: 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54  = *(u32*)PGHDR_T
ee10: 4f 5f 45 58 54 52 41 28 70 50 67 29 3b 0a 20 20  O_EXTRA(pPg);.  
ee20: 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
ee30: 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53 51  s(cksum, pPg, SQ
ee40: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
ee50: 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20  .        szPg = 
ee60: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
ee70: 2b 38 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +8;.      }else{
ee80: 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20  .        szPg = 
ee90: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
eea0: 2b 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +4;.      }.    
eeb0: 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
eec0: 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
eed0: 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
eee0: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
eef0: 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
ef00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
ef10: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
ef20: 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
ef30: 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
ef40: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
ef50: 55 52 4e 41 4c 20 25 64 20 25 64 5c 6e 22 2c 20  URNAL %d %d\n", 
ef60: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
ef70: 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
ef80: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
ef90: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
efa0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a   0);.      if( j
efb0: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a  ournal_format>=J
efc0: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20  OURNAL_FORMAT_3 
efd0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 75 33 32  ){.        *(u32
efe0: 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  *)PGHDR_TO_EXTRA
eff0: 28 70 50 67 29 20 3d 20 73 61 76 65 64 3b 0a 20  (pPg) = saved;. 
f000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f010: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f020: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f030: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
f040: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
f050: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f060: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
f070: 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  L;.        retur
f080: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
f090: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
f0a0: 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
f0b0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
f0c0: 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
f0d0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
f0e0: 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
f0f0: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
f100: 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  o&7);.      pPg-
f110: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
f120: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
f130: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
f140: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  l = 1;.      if(
f150: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
f160: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  se ){.        pP
f170: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50  ager->aInCkpt[pP
f180: 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
f190: 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
f1a0: 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
f1b0: 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50  _to_ckpt_list(pP
f1c0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
f1d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
f1e0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
f1f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
f200: 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
f210: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54  >noSync;.      T
f220: 52 41 43 45 33 28 22 41 50 50 45 4e 44 20 25 64  RACE3("APPEND %d
f230: 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
f240: 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
f250: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f260: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
f270: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f280: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
f290: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
f2a0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
f2b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
f2c0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
f2d0: 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20  not in it,.  ** 
f2e0: 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
f2f0: 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
f300: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
f310: 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
f320: 74 0a 20 20 2a 2a 20 74 68 65 20 63 68 65 63 6b  t.  ** the check
f330: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  point journal al
f340: 77 61 79 73 20 75 73 65 73 20 74 68 65 20 73 69  ways uses the si
f350: 6d 70 6c 69 65 72 20 66 6f 72 6d 61 74 20 32 20  mplier format 2 
f360: 74 68 61 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20  that lacks.  ** 
f370: 63 68 65 63 6b 73 75 6d 73 2e 20 20 54 68 65 20  checksums.  The 
f380: 68 65 61 64 65 72 20 69 73 20 61 6c 73 6f 20 6f  header is also o
f390: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
f3a0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
f3b0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
f3c0: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
f3d0: 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74   && !pPg->inCkpt
f3e0: 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
f3f0: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74  no<=pPager->ckpt
f400: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
f410: 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
f420: 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
f430: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
f440: 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73  gDbSize );.    s
f450: 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
f460: 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
f470: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
f480: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
f490: 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 72 63 20 3d  no, 7);.    rc =
f4a0: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
f4b0: 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 26 28  pPager->cpfd, &(
f4c0: 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
f4d0: 5d 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ], SQLITE_PAGE_S
f4e0: 49 5a 45 2b 34 29 3b 0a 20 20 20 20 54 52 41 43  IZE+4);.    TRAC
f4f0: 45 32 28 22 43 4b 50 54 2d 4a 4f 55 52 4e 41 4c  E2("CKPT-JOURNAL
f500: 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
f510: 6f 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50  o);.    CODEC(pP
f520: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
f530: 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
f540: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f550: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
f560: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
f570: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
f580: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
f590: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
f5a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
f5b0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
f5c0: 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63 2b 2b 3b  ger->ckptNRec++;
f5d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f5e0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20  ger->aInCkpt!=0 
f5f0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
f600: 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f  InCkpt[pPg->pgno
f610: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
f620: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67  pgno&7);.    pag
f630: 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69  e_add_to_ckpt_li
f640: 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  st(pPg);.  }..  
f650: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
f660: 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
f670: 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
f680: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
f690: 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
f6a0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f6b0: 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
f6c0: 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  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 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
f700: 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
f710: 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
f720: 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 70 61  d.** to sqlitepa
f730: 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e  ger_write().  In
f740: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
f750: 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
f760: 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
f770: 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
f780: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69  f the page..*/.i
f790: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69  nt sqlitepager_i
f7a0: 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20  swriteable(void 
f7b0: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
f7c0: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
f7d0: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
f7e0: 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
f7f0: 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  y;.}../*.** Repl
f800: 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
f810: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
f820: 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
f830: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
f840: 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
f850: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
f860: 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67  er_overwrite(Pag
f870: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
f880: 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
f890: 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  ta){.  void *pPa
f8a0: 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ge;.  int rc;.. 
f8b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
f8c0: 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70 67  r_get(pPager, pg
f8d0: 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69  no, &pPage);.  i
f8e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f8f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
f900: 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 70  itepager_write(p
f910: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
f920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f930: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
f940: 67 65 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54  ge, pData, SQLIT
f950: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
f960: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 70 61    }.    sqlitepa
f970: 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
f980: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
f990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  c;.}../*.** A ca
f9a0: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
f9b0: 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
f9c0: 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
f9d0: 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
f9e0: 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
f9f0: 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
fa00: 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74  "pgno" back to t
fa10: 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
fa20: 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
fa30: 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
fa40: 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
fa50: 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
fa60: 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
fa70: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
fa80: 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
fa90: 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
faa0: 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
fab0: 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
fac0: 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
fad0: 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
fae0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
faf0: 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
fb00: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
fb10: 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
fb20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
fb30: 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
fb40: 0a 2a 2a 20 73 71 6c 69 74 65 70 61 67 65 72 5f  .** sqlitepager_
fb50: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
fb60: 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
fb70: 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
fb80: 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
fb90: 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
fba0: 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
fbb0: 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
fbc0: 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
fbd0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
fbe0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
fbf0: 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
fc00: 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
fc10: 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
fc20: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 70  calls to sqlitep
fc30: 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
fc40: 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
fc50: 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
fc60: 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
fc70: 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
fc80: 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
fc90: 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
fca0: 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
fcb0: 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
fcc0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
fcd0: 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
fce0: 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
fcf0: 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
fd00: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
fd10: 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
fd20: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
fd30: 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
fd40: 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
fd50: 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
fd60: 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
fd70: 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
fd80: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
fd90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fda0: 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
fdb0: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
fdc0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
fdd0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
fde0: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
fdf0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
fe00: 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
fe10: 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
fe20: 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
fe30: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
fe40: 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
fe50: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
fe60: 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
fe70: 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f  qlitepager_dont_
fe80: 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
fe90: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
fea0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
feb0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
fec0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
fed0: 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  o);.  pPg->alway
fee0: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
fef0: 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d   if( pPg && pPg-
ff00: 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66  >dirty ){.    if
ff10: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
ff20: 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
ff30: 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
ff40: 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
ff50: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
ff60: 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
ff70: 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
ff80: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
ff90: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
ffa0: 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
ffb0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
ffc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
ffd0: 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
ffe0: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
fff0: 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
10000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10010 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
10020 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
10030 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
10040 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
10050 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
10060 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
10070 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
10080 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
10090 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
100a0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
100b0 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
100c0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
100d0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
100e0 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
100f0 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
10100 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
10110 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
10120 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
10130 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
10140 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
10150 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
10160 20 20 20 20 54 52 41 43 45 32 28 22 44 4f 4e 54      TRACE2("DONT
10170 5f 57 52 49 54 45 20 25 64 5c 6e 22 2c 20 70 67  _WRITE %d\n", pg
10180 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  no);.      pPg->
10190 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d  dirty = 0;.    }
101a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
101b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
101c0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
101d0 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
101e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
101f0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
10200 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
10210 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
10220 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
10230 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
10240 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
10250 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
10260 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
10270 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
10280 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
10290 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
102a0 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
102b0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
102c0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
102d0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
102e0 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
102f0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
10300 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
10310 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
10320 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20 70 50 61  WRITELOCK || pPa
10330 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
10340 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10350 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
10360 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
10370 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
10380 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  k ) return;.  if
10390 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
103a0 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
103b0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
103c0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
103d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
103e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
103f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
10400 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
10410 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
10420 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
10430 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
10440 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
10450 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a  r->ckptInUse ){.
10460 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
10470 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nCkpt[pPg->pgno/
10480 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
10490 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
104a0 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c  ge_add_to_ckpt_l
104b0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
104c0 20 20 20 20 54 52 41 43 45 32 28 22 44 4f 4e 54      TRACE2("DONT
104d0 5f 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  _ROLLBACK %d\n",
104e0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
104f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
10500 6b 70 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  kptInUse && !pPg
10510 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74  ->inCkpt && (int
10520 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
10530 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a  er->ckptSize ){.
10540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
10550 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
10560 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
10570 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
10580 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10590 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21 3d  Pager->aInCkpt!=
105a0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
105b0 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
105c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
105d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
105e0 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f  age_add_to_ckpt_
105f0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d  list(pPg);.  }.}
10600 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
10610 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
10620 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
10630 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
10640 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
10650 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
10660 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
10670 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
10680 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
10690 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
106a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
106b0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
106c0 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
106d0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
106e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
106f0 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  r_commit(Pager *
10700 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
10710 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
10720 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
10730 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45  errMask==PAGER_E
10740 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  RR_FULL ){.    r
10750 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
10760 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
10770 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
107a0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
107b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
107c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
107d0 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
107e0 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
107f0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
10800 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
10810 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
10820 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
10830 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10840 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
10850 0a 20 20 54 52 41 43 45 31 28 22 43 4f 4d 4d 49  .  TRACE1("COMMI
10860 54 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 50 61  T\n");.  if( pPa
10870 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d  ger->dirtyFile==
10880 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
10890 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
108a0 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
108b0 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 4f  onsuming sqliteO
108c0 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20  sSync() calls). 
108d0 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68     ** if there h
108e0 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
108f0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
10900 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
10910 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10920 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
10930 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
10940 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
10950 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
10960 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
10970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10990 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
109a0 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
109b0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69  nal(pPager);.  i
109c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
109d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
109e0 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
109f0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
10a00 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
10a10 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
10a20 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pPg ){.    rc = 
10a30 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
10a40 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
10a50 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67 65  f( rc || (!pPage
10a60 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c  r->noSync && sql
10a70 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65  iteOsSync(&pPage
10a80 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f  r->fd)!=SQLITE_O
10a90 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  K) ){.      goto
10aa0 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
10ab0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
10ac0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
10ad0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
10ae0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
10af0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
10b00 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
10b10 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
10b20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
10b30 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
10b40 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
10b50 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rt:.  rc = sqlit
10b60 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
10b70 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
10b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10b90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10ba0 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  FULL;.  }.  retu
10bb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10bc0 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
10bd0 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
10be0 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
10bf0 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65  o read-only mode
10c00 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
10c10 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
10c20 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
10c30 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
10c40 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
10c50 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
10c60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10c70 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
10c80 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
10c90 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
10ca0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
10cb0 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
10cc0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
10cd0 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
10ce0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
10cf0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
10d00 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
10d10 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
10d20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
10d30 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
10d40 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
10d50 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
10d60 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
10d70 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
10d80 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
10d90 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
10da0 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
10db0 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
10dc0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10dd0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10de0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50  pager_rollback(P
10df0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
10e00 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45   int rc;.  TRACE
10e10 31 28 22 52 4f 4c 4c 42 41 43 4b 5c 6e 22 29 3b  1("ROLLBACK\n");
10e20 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
10e30 64 69 72 74 79 46 69 6c 65 20 7c 7c 20 21 70 50  dirtyFile || !pP
10e40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
10e50 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
10e60 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
10e70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
10e80 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
10e90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10ea0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
10eb0 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26  er->errMask!=0 &
10ec0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  & pPager->errMas
10ed0 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k!=PAGER_ERR_FUL
10ee0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
10ef0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49  ger->state>=SQLI
10f00 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
10f10 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
10f20 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
10f30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10f40 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
10f50 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
10f60 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
10f70 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  !=SQLITE_WRITELO
10f80 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
10f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10fa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
10fb0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
10fc0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
10fe0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10ff0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
11000 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
11010 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  RR_CORRUPT;.  }.
11020 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
11030 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
11040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11050 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
11060 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
11070 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
11080 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
11090 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
110a0 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
110b0 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
110c0 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
110d0 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  isreadonly(Pager
110e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
110f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
11100 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Only;.}../*.** T
11110 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
11120 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
11130 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
11140 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
11150 65 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67  epager_stats(Pag
11160 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
11170 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a  tatic int a[9];.
11180 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
11190 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
111a0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
111b0 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
111c0 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
111d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
111e0 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
111f0 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
11200 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  = pPager->errMas
11210 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  k;.  a[6] = pPag
11220 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
11230 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
11240 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65  ;.  a[8] = pPage
11250 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75  r->nOvfl;.  retu
11260 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn a;.}../*.** S
11270 65 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  et the checkpoin
11280 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
11290 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
112a0 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
112b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
112c0 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
112d0 70 65 6e 2e 20 20 41 20 6e 65 77 20 63 68 65 63  pen.  A new chec
112e0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  kpoint journal i
112f0 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
11300 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
11310 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
11320 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
11330 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
11340 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
11350 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
11360 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62  litepager_ckpt_b
11370 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
11380 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
11390 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
113a0 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
113b0 5d 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ];.  if( !pPager
113c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
113d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
113e0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
113f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11400 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
11410 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
11420 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65  alOpen );.  asse
11430 72 74 28 20 21 70 50 61 67 65 72 2d 3e 63 6b 70  rt( !pPager->ckp
11440 74 49 6e 55 73 65 20 29 3b 0a 20 20 70 50 61 67  tInUse );.  pPag
11450 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73 71  er->aInCkpt = sq
11460 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
11470 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
11480 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
11490 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a  ->aInCkpt==0 ){.
114a0 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64      sqliteOsRead
114b0 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
114c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
114d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
114e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
114f0 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
11500 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
11510 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
11520 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ptJSize);.  if( 
11530 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62  rc ) goto ckpt_b
11540 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
11550 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
11560 6b 70 74 4a 53 69 7a 65 20 3d 3d 20 0a 20 20 20  kptJSize == .   
11570 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f   pPager->nRec*JO
11580 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72  URNAL_PG_SZ(jour
11590 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a 4f 55 52  nal_format)+JOUR
115a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e  NAL_HDR_SZ(journ
115b0 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b 0a 23 65  al_format) );.#e
115c0 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 63  ndif.  pPager->c
115d0 6b 70 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  kptJSize = pPage
115e0 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  r->nRec*JOURNAL_
115f0 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f  PG_SZ(journal_fo
11600 72 6d 61 74 29 0a 20 20 20 20 20 20 20 20 20 20  rmat).          
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
11620 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
11630 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b  journal_format);
11640 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  .  pPager->ckptS
11650 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
11660 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61  Size;.  if( !pPa
11670 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b  ger->ckptOpen ){
11680 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11690 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
116a0 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 63  Temp, &pPager->c
116b0 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pfd);.    if( rc
116c0 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67   ) goto ckpt_beg
116d0 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
116e0 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
116f0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
11700 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >ckptNRec = 0;. 
11710 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70   }.  pPager->ckp
11720 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
11730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11740 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69   .ckpt_begin_fai
11750 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
11760 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b 0a 20 20  r->aInCkpt ){.  
11770 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
11780 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29 3b 0a 20  ger->aInCkpt);. 
11790 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
117a0 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  pt = 0;.  }.  re
117b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
117c0 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68 65 63 6b  * Commit a check
117d0 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
117e0 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63  litepager_ckpt_c
117f0 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
11800 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
11810 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
11820 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
11830 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c   *pNext;.    sql
11840 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
11850 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 20  r->cpfd, 0);.   
11860 20 2f 2a 20 73 71 6c 69 74 65 4f 73 54 72 75 6e   /* sqliteOsTrun
11870 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 63 70  cate(&pPager->cp
11880 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 70  fd, 0); */.    p
11890 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63 20  Pager->ckptNRec 
118a0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
118b0 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >ckptInUse = 0;.
118c0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
118d0 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20  pPager->aInCkpt 
118e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
118f0 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  InCkpt = 0;.    
11900 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
11910 70 43 6b 70 74 3b 20 70 50 67 3b 20 70 50 67 3d  pCkpt; pPg; pPg=
11920 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
11930 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
11940 43 6b 70 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Ckpt;.      asse
11950 72 74 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20  rt( pPg->inCkpt 
11960 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
11970 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Ckpt = 0;.      
11980 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d  pPg->pPrevCkpt =
11990 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20   pPg->pNextCkpt 
119a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
119b0 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 30  Pager->pCkpt = 0
119c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
119d0 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  ckptAutoopen = 0
119e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
119f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
11a00 6f 6c 6c 62 61 63 6b 20 61 20 63 68 65 63 6b 70  ollback a checkp
11a10 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
11a20 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 72 6f  itepager_ckpt_ro
11a30 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
11a40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
11a50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
11a60 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  kptInUse ){.    
11a70 72 63 20 3d 20 70 61 67 65 72 5f 63 6b 70 74 5f  rc = pager_ckpt_
11a80 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
11a90 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65  ;.    sqlitepage
11aa0 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70 50  r_ckpt_commit(pP
11ab0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
11ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11ad0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
11ae0 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d  ->ckptAutoopen =
11af0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
11b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11b10 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
11b20 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
11b30 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
11b40 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 70 61  t char *sqlitepa
11b50 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67  ger_filename(Pag
11b60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
11b70 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
11b80 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
11b90 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
11ba0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
11bb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
11bc0 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20  er_set_codec(.  
11bd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
11be0 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
11bf0 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
11c00 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
11c10 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
11c20 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
11c30 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
11c40 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
11c50 64 65 63 41 72 67 3b 0a 7d 0a 0a 23 69 66 64 65  decArg;.}..#ifde
11c60 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
11c70 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
11c80 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
11c90 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
11ca0 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
11cb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
11cc0 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67  ager_refdump(Pag
11cd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
11ce0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
11cf0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
11d00 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
11d10 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
11d20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
11d30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11d40 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33   printf("PAGE %3
11d50 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52  d addr=0x%08x nR
11d60 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
11d70 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e    pPg->pgno, (in
11d80 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t)PGHDR_TO_DATA(
11d90 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
11da0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a     ;.  }.}.#endif.