/ Hex Artifact Content
Login

Artifact f7658e5d07ef66c966443a3f4420510ce640442b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 37 35  : pager.c,v 1.75
0350: 20 32 30 30 33 2f 30 32 2f 31 32 20 31 34 3a 30   2003/02/12 14:0
0360: 39 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a  9:44 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
10b0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
10e0: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
10f0: 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   */.  /* SQLITE_
1100: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
1110: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1120: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1130: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1140: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1150: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1160: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1170: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
1180: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1190: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
11a0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
11b0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
11c0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
11d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
11e0: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
11f0: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
1200: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
1210: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
1220: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
1230: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
1240: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
1250: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1260: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f  E_PAGE_SIZE])../
1270: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1280: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1290: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
12a0: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
12b0: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
12c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
12d0: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
12e0: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
12f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1300: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1310: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1320: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1330: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1340: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1350: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1360: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1370: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1380: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1390: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
13a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
13d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
13f0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1400: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1420: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1430: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
1440: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
1450: 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20 20 20  File cpfd;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1480: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1490: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
14a0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
14b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14c0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14d0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
14e0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1500: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1510: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1520: 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20    int ckptSize; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1550: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1560: 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  ckpt_begin() */.
1570: 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a    off_t ckptJSiz
1580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1590: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
15a0: 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29   at ckpt_begin()
15b0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
15c0: 55 47 0a 20 20 6f 66 66 5f 74 20 73 79 6e 63 4a  UG.  off_t syncJ
15d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
15e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
15f0: 6e 61 6c 20 61 74 20 6c 61 73 74 20 66 73 79 6e  nal at last fsyn
1600: 63 28 29 20 63 61 6c 6c 20 2a 2f 0a 23 65 6e 64  c() call */.#end
1610: 69 66 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  if.  int nRec;  
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1640: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
1650: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1660: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
1680: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
1690: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
16a0: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
16b0: 6e 74 20 63 6b 70 74 4e 52 65 63 3b 20 20 20 20  nt ckptNRec;    
16c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16d0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
16e0: 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  in the checkpoin
16f0: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
1700: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
1710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1720: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1730: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
1740: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f  ory page */.  vo
1750: 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72  id (*xDestructor
1760: 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c  )(void*); /* Cal
1770: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
1780: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
1790: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  s */.  int nPage
17a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17b0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
17c0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
17d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
17e0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
17f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1800: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
1810: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
1820: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
1830: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
1840: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
1850: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
1860: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
1870: 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74  he */.  int nHit
1880: 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20  , nMiss, nOvfl; 
1890: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
18a0: 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20  s, missing, and 
18b0: 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  LRU overflows */
18c0: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
18d0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
18e0: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
18f0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
1900: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
1910: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
1920: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
1930: 54 72 75 65 20 69 66 20 69 6e 69 74 69 61 6c 20  True if initial 
1940: 6d 61 67 69 63 20 6f 66 20 6a 6f 75 72 6e 61 6c  magic of journal
1950: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
1960: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1980: 6f 20 6e 6f 74 20 75 73 65 20 61 20 72 6f 6c 6c  o not use a roll
1990: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
19a0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75  this file */.  u
19b0: 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20 20  8 ckptOpen;     
19c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19d0: 75 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 70  ue if the checkp
19e0: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  oint journal is 
19f0: 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b 70  open */.  u8 ckp
1a00: 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20  tInUse;         
1a10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65        /* True we
1a20: 20 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b 70   are in a checkp
1a30: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 63 6b 70  oint */.  u8 ckp
1a40: 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20  tAutoopen;      
1a50: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6b        /* Open ck
1a60: 70 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20  pt journal when 
1a70: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
1a80: 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f  opened*/.  u8 no
1a90: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
1aa0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1ab0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1ac0: 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75  l if true */.  u
1ad0: 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20  8 fullSync;     
1ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1af0: 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20   extra syncs of 
1b00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
1b10: 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20  robustness */.  
1b20: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b40: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52  QLITE_UNLOCK, _R
1b50: 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54  EADLOCK or _WRIT
1b60: 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65 72  ELOCK */.  u8 er
1b70: 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  rMask;          
1b80: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
1b90: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
1ba0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38  f errors */.  u8
1bb0: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
1bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
1bd0: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
1be0: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
1bf0: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c10: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
1c20: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1c30: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c50: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
1c60: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
1c70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1c80: 20 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b 20    u8 dirtyFile; 
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca0: 20 54 72 75 65 20 69 66 20 64 61 74 61 62 61 73   True if databas
1cb0: 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
1cc0: 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a 2f  ed in any way */
1cd0: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1ce0: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
1cf0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
1d00: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
1d10: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
1d20: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
1d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1d40: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
1d50: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1d60: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
1d70: 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20 20  aInCkpt;        
1d80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
1d90: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
1da0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1db0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
1dc0: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
1dd0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
1de0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
1df0: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
1e00: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
1e10: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
1e20: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1e30: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
1e40: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
1e50: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
1e60: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1e70: 48 64 72 20 2a 70 43 6b 70 74 3b 20 20 20 20 20  Hdr *pCkpt;     
1e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e90: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
1ea0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
1eb0: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
1ec0: 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48  *aHash[N_PG_HASH
1ed0: 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61  ];    /* Hash ta
1ee0: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
1ef0: 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72 20  number of PgHdr 
1f00: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1f10: 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74  se are bits that
1f20: 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50   can be set in P
1f30: 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f  ager.errMask..*/
1f40: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1f50: 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31  RR_FULL     0x01
1f60: 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66    /* a write() f
1f70: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
1f80: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20   PAGER_ERR_MEM  
1f90: 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c      0x02  /* mal
1fa0: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  loc() failed */.
1fb0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
1fc0: 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20  R_LOCK     0x04 
1fd0: 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65   /* error in the
1fe0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
1ff0: 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  l */.#define PAG
2000: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20  ER_ERR_CORRUPT  
2010: 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73  0x08  /* databas
2020: 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  e or journal cor
2030: 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69  ruption */.#defi
2040: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  ne PAGER_ERR_DIS
2050: 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67  K     0x10  /* g
2060: 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20  eneral disk I/O 
2070: 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64  error - bad hard
2080: 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a   drive? */../*.*
2090: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
20a0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67 65  le contains page
20b0: 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
20c0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72  following.** for
20d0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61  mat..**.** Actua
20e0: 6c 6c 79 2c 20 74 68 69 73 20 73 74 72 75 63 74  lly, this struct
20f0: 75 72 65 20 69 73 20 74 68 65 20 63 6f 6d 70 6c  ure is the compl
2100: 65 74 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  ete page record 
2110: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66 6f 72  for pager.** for
2120: 6d 61 74 73 20 6c 65 73 73 20 74 68 61 6e 20 33  mats less than 3
2130: 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20 77 69 74  .  Beginning wit
2140: 68 20 66 6f 72 6d 61 74 20 33 2c 20 74 68 69 73  h format 3, this
2150: 20 72 65 63 6f 72 64 20 69 73 20 73 75 72 72 6f   record is surro
2160: 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77 6f 20  unded.** by two 
2170: 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74 79  checksums..*/.ty
2180: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67  pedef struct Pag
2190: 65 52 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f  eRecord PageReco
21a0: 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52  rd;.struct PageR
21b0: 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70  ecord {.  Pgno p
21c0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
21d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
21f0: 20 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49   char aData[SQLI
2200: 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  TE_PAGE_SIZE];  
2210: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61  /* Original data
2220: 20 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a   for page pgno *
2230: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  /.};../*.** Jour
2240: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
2250: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
2260: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
2270: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
2280: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2290: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
22a0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
22b0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
22c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
22d0: 20 74 68 72 65 65 20 6a 6f 75 72 6e 61 6c 20 66   three journal f
22e0: 6f 72 6d 61 74 73 20 28 73 6f 20 66 61 72 29 2e  ormats (so far).
22f0: 20 54 68 65 20 31 73 74 20 6a 6f 75 72 6e 61 6c   The 1st journal
2300: 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a 2a   format writes.*
2310: 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  * 32-bit integer
2320: 73 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f 72  s in the byte-or
2330: 64 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74 20  der of the host 
2340: 6d 61 63 68 69 6e 65 2e 20 20 4e 65 77 0a 2a 2a  machine.  New.**
2350: 20 66 6f 72 6d 61 74 73 20 77 72 69 74 65 73 20   formats writes 
2360: 69 6e 74 65 67 65 72 73 20 61 73 20 62 69 67 2d  integers as big-
2370: 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65 77  endian.  All new
2380: 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74 68   journals use th
2390: 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74 2c  e.** new format,
23a0: 20 62 75 74 20 77 65 20 68 61 76 65 20 74 6f 20   but we have to 
23b0: 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  be able to read 
23c0: 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c  an older journal
23d0: 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20   in order.** to 
23e0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
23f0: 73 20 63 72 65 61 74 65 64 20 62 79 20 6f 6c 64  s created by old
2400: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  er versions of t
2410: 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a  he library..**.*
2420: 2a 20 54 68 65 20 33 72 64 20 6a 6f 75 72 6e 61  * The 3rd journa
2430: 6c 20 66 6f 72 6d 61 74 20 28 61 64 64 65 64 20  l format (added 
2440: 66 6f 72 20 32 2e 38 2e 30 29 20 61 64 64 73 20  for 2.8.0) adds 
2450: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
2460: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
2470: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
2480: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
2490: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
24a0: 69 6c 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ile the.** journ
24b0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
24c0: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
24d0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
24e0: 67 68 74 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ght appear in.**
24f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2500: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
2510: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
2520: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
2530: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
2540: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
2550: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
2560: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
2570: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
2580: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
2590: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
25a0: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
25b0: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
25c0: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
25d0: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
25e0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
25f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
2600: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
2610: 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  e 3rd journal fo
2620: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
2630: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
2640: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
2650: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
2660: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
2670: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
2680: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
2690: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
26a0: 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  E bytes of data 
26b0: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
26c0: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
26d0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
26e0: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
26f0: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
2700: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
2710: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
2720: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
2730: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
2740: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
2750: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
2760: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
2770: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
2780: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
2790: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
27a0: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
27b0: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
27c0: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
27d0: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
27e0: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
27f0: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
2800: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
2810: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
2820: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
2830: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
2840: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
2850: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
2860: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
2870: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
2880: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
2890: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
28a0: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
28b0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
28c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
28d0: 75 72 6e 61 6c 4d 61 67 69 63 31 5b 5d 20 3d 20  urnalMagic1[] = 
28e0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
28f0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
2900: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
2910: 64 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63 6f  d4,.};.static co
2920: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2930: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32  r aJournalMagic2
2940: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
2950: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
2960: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
2970: 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 73 74 61 74  3, 0xd5,.};.stat
2980: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
2990: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
29a0: 61 67 69 63 33 5b 5d 20 3d 20 7b 0a 20 20 30 78  agic3[] = {.  0x
29b0: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
29c0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
29d0: 2c 20 30 78 36 33 2c 20 30 78 64 36 2c 0a 7d 3b  , 0x63, 0xd6,.};
29e0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
29f0: 5f 46 4f 52 4d 41 54 5f 31 20 31 0a 23 64 65 66  _FORMAT_1 1.#def
2a00: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  ine JOURNAL_FORM
2a10: 41 54 5f 32 20 32 0a 23 64 65 66 69 6e 65 20 4a  AT_2 2.#define J
2a20: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20  OURNAL_FORMAT_3 
2a30: 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  3../*.** The fol
2a40: 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20 64  lowing integer d
2a50: 65 74 65 72 6d 69 6e 65 73 20 77 68 61 74 20 66  etermines what f
2a60: 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 77 68 65  ormat to use whe
2a70: 6e 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20 6e 65  n creating.** ne
2a80: 77 20 70 72 69 6d 61 72 79 20 6a 6f 75 72 6e 61  w primary journa
2a90: 6c 20 66 69 6c 65 73 2e 20 20 42 79 20 64 65 66  l files.  By def
2aa0: 61 75 6c 74 20 77 65 20 61 6c 77 61 79 73 20 75  ault we always u
2ab0: 73 65 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a 20  se format 3..** 
2ac0: 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 77 65  When testing, we
2ad0: 20 63 61 6e 20 73 65 74 20 74 68 69 73 20 76 61   can set this va
2ae0: 6c 75 65 20 74 6f 20 6f 6c 64 65 72 20 6a 6f 75  lue to older jou
2af0: 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 69 6e 20  rnal formats in 
2b00: 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b 65  order to.** make
2b10: 20 73 75 72 65 20 74 68 61 74 20 6e 65 77 65 72   sure that newer
2b20: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
2b30: 20 6c 69 62 72 61 72 79 20 61 72 65 20 61 62 6c   library are abl
2b40: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 6c  e to rollback ol
2b50: 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  der.** journal f
2b60: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  iles..**.** Note
2b70: 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74   that checkpoint
2b80: 20 6a 6f 75 72 6e 61 6c 73 20 61 6c 77 61 79 73   journals always
2b90: 20 75 73 65 20 66 6f 72 6d 61 74 20 32 20 61 6e   use format 2 an
2ba0: 64 20 6f 6d 69 74 20 74 68 65 20 68 65 61 64 65  d omit the heade
2bb0: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
2bc0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 6a 6f 75  ITE_TEST.int jou
2bd0: 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d 20 33 3b  rnal_format = 3;
2be0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2bf0: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 33  journal_format 3
2c00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2c10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
2c20: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
2c30: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
2c40: 75 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63 63  urnal varies acc
2c50: 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68 69  ording.** to whi
2c60: 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ch journal forma
2c70: 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  t is being used.
2c80: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2c90: 6d 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f 75  macros figure ou
2ca0: 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20 62  t.** the sizes b
2cb0: 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20 6e  ased on format n
2cc0: 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66 69  umbers..*/.#defi
2cd0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
2ce0: 5a 28 58 29 20 5c 0a 20 20 20 28 73 69 7a 65 6f  Z(X) \.   (sizeo
2cf0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
2d00: 29 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ) + sizeof(Pgno)
2d10: 20 2b 20 28 28 58 29 3e 3d 33 29 2a 32 2a 73 69   + ((X)>=3)*2*si
2d20: 7a 65 6f 66 28 75 33 32 29 29 0a 23 64 65 66 69  zeof(u32)).#defi
2d30: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
2d40: 28 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54 45  (X) \.   (SQLITE
2d50: 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69 7a  _PAGE_SIZE + siz
2d60: 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58 29  eof(Pgno) + ((X)
2d70: 3e 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32 29  >=3)*sizeof(u32)
2d80: 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  )../*.** Enable 
2d90: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
2da0: 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a 2a  tracking here:.*
2db0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2dc0: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
2dd0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
2de0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f  = 0;.  static vo
2df0: 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  id pager_refinfo
2e00: 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20  (PgHdr *p){.    
2e10: 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d  static int cnt =
2e20: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67   0;.    if( !pag
2e30: 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  er_refinfo_enabl
2e40: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
2e50: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
2e60: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
2e70: 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c  =0x%08x nRef=%d\
2e80: 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67  n",.       p->pg
2e90: 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54  no, (int)PGHDR_T
2ea0: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
2eb0: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
2ec0: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
2ed0: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
2ee0: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
2ef0: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
2f00: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
2f10: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
2f20: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
2f30: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2f40: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
2f50: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
2f60: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
2f70: 70 74 6f 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ptor.*/.static i
2f80: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 69 6e  nt read32bits(in
2f90: 74 20 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c 65  t format, OsFile
2fa0: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
2fb0: 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69  {.  u32 res;.  i
2fc0: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
2fd0: 6c 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20 26  liteOsRead(fd, &
2fe0: 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29  res, sizeof(res)
2ff0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
3000: 49 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61 74  ITE_OK && format
3010: 3e 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  >JOURNAL_FORMAT_
3020: 31 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  1 ){.    unsigne
3030: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
3040: 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65    memcpy(ac, &re
3050: 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d  s, 4);.    res =
3060: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
3070: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
3080: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
3090: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72  .  }.  *pRes = r
30a0: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  es;.  return rc;
30b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
30c0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
30d0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
30e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
30f0: 20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73 20    Writing.** is 
3100: 61 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69 6e  always done usin
3110: 67 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  g the new journa
3120: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61  l format..*/.sta
3130: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
3140: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
3150: 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69  u32 val){.  unsi
3160: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
3170: 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66  .  if( journal_f
3180: 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20  ormat<=1 ){.    
3190: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73 57  return sqliteOsW
31a0: 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20 34  rite(fd, &val, 4
31b0: 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d  );.  }.  ac[0] =
31c0: 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66   (val>>24) & 0xf
31d0: 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61  f;.  ac[1] = (va
31e0: 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20  l>>16) & 0xff;. 
31f0: 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38   ac[2] = (val>>8
3200: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33  ) & 0xff;.  ac[3
3210: 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a  ] = val & 0xff;.
3220: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f    return sqliteO
3230: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
3240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
3250: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
3260: 65 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20 68  er into a page h
3270: 65 61 64 65 72 20 72 69 67 68 74 20 62 65 66 6f  eader right befo
3280: 72 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64  re the.** page d
3290: 61 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ata.  This will 
32a0: 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 50 67  overwrite the Pg
32b0: 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
32c0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
32d0: 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28 75  id store32bits(u
32e0: 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a 70  32 val, PgHdr *p
32f0: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
3300: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3310: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 63 68  ac;.  ac = &((ch
3320: 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
3330: 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20  A(p))[offset];. 
3340: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
3350: 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 6d 65  mat<=1 ){.    me
3360: 6d 63 70 79 28 61 63 2c 20 26 76 61 6c 2c 20 34  mcpy(ac, &val, 4
3370: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3380: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
3390: 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63  ) & 0xff;.    ac
33a0: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
33b0: 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 32  & 0xff;.    ac[2
33c0: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
33d0: 78 66 66 3b 0a 20 20 20 20 61 63 5b 33 5d 20 3d  xff;.    ac[3] =
33e0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 7d   val & 0xff;.  }
33f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
3400: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
3410: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
3420: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
3430: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
3440: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
3450: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
3460: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
3470: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
3480: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
3490: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
34a0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
34b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34c0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
34d0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
34e0: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
34f0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
3500: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
3510: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3520: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
3530: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
3540: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
3550: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3560: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
3570: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
3580: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
3590: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
35a0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
35b0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
35c0: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
35d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
35e0: 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67   or remove a pag
35f0: 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
3600: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61  of all pages tha
3610: 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20  t are in the.** 
3620: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
3630: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
3640: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
3650: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
3660: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
3670: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
3680: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
3690: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
36a0: 74 68 65 20 73 71 6c 69 74 65 70 61 67 65 72 5f  the sqlitepager_
36b0: 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a  ckpt_commit().**
36c0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43   routine run MUC
36d0: 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  H faster for the
36e0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
36f0: 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e  re there are man
3700: 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65  y.** pages in me
3710: 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20  mory but only a 
3720: 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 63  few are in the c
3730: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
3740: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
3750: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b  d page_add_to_ck
3760: 70 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  pt_list(PgHdr *p
3770: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
3780: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
3790: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
37a0: 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b 0a  nCkpt ) return;.
37b0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
37c0: 50 72 65 76 43 6b 70 74 3d 3d 30 20 26 26 20 70  PrevCkpt==0 && p
37d0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d 30  Pg->pNextCkpt==0
37e0: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
37f0: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Ckpt = 0;.  if( 
3800: 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 29 7b  pPager->pCkpt ){
3810: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43 6b  .    pPager->pCk
3820: 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20  pt->pPrevCkpt = 
3830: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
3840: 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 61 67  pNextCkpt = pPag
3850: 65 72 2d 3e 70 43 6b 70 74 3b 0a 20 20 70 50 61  er->pCkpt;.  pPa
3860: 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50 67  ger->pCkpt = pPg
3870: 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20  ;.  pPg->inCkpt 
3880: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
3890: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
38a0: 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 50 67  rom_ckpt_list(Pg
38b0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
38c0: 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 20   !pPg->inCkpt ) 
38d0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
38e0: 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 29 7b 0a  g->pPrevCkpt ){.
38f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
3900: 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78  >pPrevCkpt->pNex
3910: 74 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tCkpt==pPg );.  
3920: 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74    pPg->pPrevCkpt
3930: 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50  ->pNextCkpt = pP
3940: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20  g->pNextCkpt;.  
3950: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3960: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
3970: 70 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pCkpt==pPg );.  
3980: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
3990: 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Ckpt = pPg->pNex
39a0: 74 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tCkpt;.  }.  if(
39b0: 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20   pPg->pNextCkpt 
39c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
39d0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70  Pg->pNextCkpt->p
39e0: 50 72 65 76 43 6b 70 74 3d 3d 70 50 67 20 29 3b  PrevCkpt==pPg );
39f0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 43  .    pPg->pNextC
3a00: 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d  kpt->pPrevCkpt =
3a10: 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 3b   pPg->pPrevCkpt;
3a20: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
3a30: 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50 67  tCkpt = 0;.  pPg
3a40: 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30 3b  ->pPrevCkpt = 0;
3a50: 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d  .  pPg->inCkpt =
3a60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
3a70: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
3a80: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
3a90: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
3aa0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
3ab0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
3ac0: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
3ad0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
3ae0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
3af0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
3b00: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
3b10: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70  {.  PgHdr *p = p
3b20: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
3b30: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a  er_hash(pgno)];.
3b40: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
3b50: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
3b60: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
3b70: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
3b80: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
3b90: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
3ba0: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
3bb0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
3bc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
3bd0: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
3be0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
3bf0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
3c00: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
3c10: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
3c20: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
3c30: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
3c40: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
3c50: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
3c60: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
3c70: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
3c80: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
3c90: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
3ca0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
3cb0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
3cc0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
3cd0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  , *pNext;.  for(
3ce0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
3cf0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
3d00: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3d10: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
3d20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
3d30: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
3d40: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
3d50: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
3d60: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
3d70: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
3d80: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
3d90: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
3da0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
3db0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
3dc0: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
3dd0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
3de0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
3df0: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
3e00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  ){.    sqlitepag
3e10: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
3e20: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
3e30: 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  eOsUnlock(&pPage
3e40: 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65 72  r->fd);.  pPager
3e50: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
3e60: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
3e70: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
3e80: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
3e90: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
3ea0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
3eb0: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
3ec0: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
3ed0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
3ee0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
3ef0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
3f00: 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65  n and.** a write
3f10: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
3f20: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
3f30: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74 68  tine releases th
3f40: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77 72  e database.** wr
3f50: 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ite lock and acq
3f60: 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f 63  uires a read loc
3f70: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  k in its place. 
3f80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
3f90: 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20  e.** is deleted 
3fa0: 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  and closed..*/.s
3fb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
3fc0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
3fd0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
3fe0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
3ff0: 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  Pg;.  if( pPager
4000: 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f 57  ->state<SQLITE_W
4010: 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75 72  RITELOCK ) retur
4020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
4030: 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
4040: 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
4050: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b    if( pPager->ck
4060: 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  ptOpen ){.    sq
4070: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61  liteOsClose(&pPa
4080: 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20  ger->cpfd);.    
4090: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e  pPager->ckptOpen
40a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
40b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
40c0: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
40d0: 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  eOsClose(&pPager
40e0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
40f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
4100: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  = 0;.    sqliteO
4110: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
4120: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73  zJournal);.    s
4130: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
4140: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
4150: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
4160: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
4170: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
4180: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
4190: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
41a0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
41b0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
41c0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
41d0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
41e0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
41f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4200: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
4210: 79 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  yFile==0 || pPag
4220: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d  er->useJournal==
4230: 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  0 );.  }.  rc = 
4240: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
4250: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
4260: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4270: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
4280: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
4290: 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  _READLOCK;.  }el
42a0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
42b0: 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
42c0: 69 66 20 61 20 70 72 6f 63 65 73 73 20 64 6f 65  if a process doe
42d0: 73 20 61 20 42 45 47 49 4e 2c 20 74 68 65 6e 20  s a BEGIN, then 
42e0: 66 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a 20 20  forks and the.  
42f0: 20 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63 65    ** child proce
4300: 73 73 20 64 6f 65 73 20 74 68 65 20 43 4f 4d 4d  ss does the COMM
4310: 49 54 2e 20 20 42 65 63 61 75 73 65 20 6f 66 20  IT.  Because of 
4320: 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
4330: 20 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69 6c   unix.    ** fil
4340: 65 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20 75  e locking, the u
4350: 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c 2e  nlock will fail.
4360: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
4370: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
4380: 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  TE_UNLOCK;.  }. 
4390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
43a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
43b0: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
43c0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
43d0: 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  of data..*/.stat
43e0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
43f0: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
4400: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e  , Pgno pgno, con
4410: 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b  st char *aData){
4420: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
4430: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
4440: 20 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75 72   + pgno;.  retur
4450: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
4460: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
4470: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
4480: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
4490: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
44a0: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
44b0: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
44c0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  page..**.** Ther
44d0: 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66 66  e are three diff
44e0: 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  erent journal fo
44f0: 72 6d 61 74 73 2e 20 20 54 68 65 20 66 6f 72 6d  rmats.  The form
4500: 61 74 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  at parameter det
4510: 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 69 63 68  ermines.** which
4520: 20 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64 20   format is used 
4530: 62 79 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  by the journal t
4540: 68 61 74 20 69 73 20 70 6c 61 79 65 64 20 62 61  hat is played ba
4550: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
4560: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
4570: 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20  _one_page(Pager 
4580: 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20  *pPager, OsFile 
4590: 2a 6a 66 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74  *jfd, int format
45a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
45b0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
45c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
45d0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
45e0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 61  he cache */.  Pa
45f0: 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b 0a  geRecord pgRec;.
4600: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 0a 20 20    u32 cksum;..  
4610: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
4620: 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 70 67  format, jfd, &pg
4630: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Rec.pgno);.  if(
4640: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
4660: 4f 4e 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ONE;.  rc = sqli
4670: 74 65 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 70  teOsRead(jfd, &p
4680: 67 52 65 63 2e 61 44 61 74 61 2c 20 73 69 7a 65  gRec.aData, size
4690: 6f 66 28 70 67 52 65 63 2e 61 44 61 74 61 29 29  of(pgRec.aData))
46a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
46b0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 53  TE_OK ) return S
46c0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 0a 20 20 2f  QLITE_DONE;..  /
46d0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
46e0: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
46f0: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
4700: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
4710: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
4720: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
4730: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
4740: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
4750: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
4760: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
4770: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
4780: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
4790: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
47a0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
47b0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
47c0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
47d0: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
47e0: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
47f0: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
4800: 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30  f( pgRec.pgno==0
4810: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4820: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
4830: 20 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f    if( pgRec.pgno
4840: 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
4850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4860: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
4870: 66 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e  f( format>=JOURN
4880: 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20  AL_FORMAT_3 ){. 
4890: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
48a0: 74 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20  ts(format, jfd, 
48b0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
48c0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c   rc ) return SQL
48d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 69 66  ITE_DONE;.    if
48e0: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
48f0: 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f  ager, pgRec.pgno
4900: 2c 20 70 67 52 65 63 2e 61 44 61 74 61 29 21 3d  , pgRec.aData)!=
4910: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
4920: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
4930: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
4940: 2f 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  /* Playback the 
4950: 70 61 67 65 2e 20 20 55 70 64 61 74 65 20 74 68  page.  Update th
4960: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79  e in-memory copy
4970: 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a   of the page.  *
4980: 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  * at the same ti
4990: 6d 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  me, if there is 
49a0: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  one..  */.  pPg 
49b0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
49c0: 50 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e  Pager, pgRec.pgn
49d0: 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
49e0: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
49f0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 52 41 43  c==0 ){.    TRAC
4a00: 45 32 28 22 50 4c 41 59 42 41 43 4b 20 25 64 5c  E2("PLAYBACK %d\
4a10: 6e 22 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b  n", pgRec.pgno);
4a20: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65  .    sqliteOsSee
4a30: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
4a40: 70 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f  pgRec.pgno-1)*(o
4a50: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
4a60: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72 63 20 3d  _SIZE);.    rc =
4a70: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
4a80: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 67 52 65  pPager->fd, pgRe
4a90: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
4aa0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a  PAGE_SIZE);.  }.
4ab0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
4ac0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
4ad0: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ||.        mem
4ae0: 63 6d 70 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cmp(PGHDR_TO_DAT
4af0: 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44  A(pPg), pgRec.aD
4b00: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
4b10: 5f 53 49 5a 45 29 3d 3d 30 0a 20 20 20 20 29 7b  _SIZE)==0.    ){
4b20: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
4b30: 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
4b40: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 69 66   on this page if
4b50: 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 20   the page is in 
4b60: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  use.      ** and
4b70: 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6e 65   the page has ne
4b80: 76 65 72 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ver been modifie
4b90: 64 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  d.  This avoids 
4ba0: 72 65 73 65 74 74 69 6e 67 0a 20 20 20 20 20 20  resetting.      
4bb0: 2a 2a 20 74 68 65 20 22 65 78 74 72 61 22 20 64  ** the "extra" d
4bc0: 61 74 61 2e 20 20 54 68 61 74 20 69 6e 20 74 75  ata.  That in tu
4bd0: 72 6e 20 61 76 6f 69 64 73 20 69 6e 76 61 6c 69  rn avoids invali
4be0: 64 61 74 69 6e 67 20 42 54 72 65 65 20 63 75 72  dating BTree cur
4bf0: 73 6f 72 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  sors.      ** in
4c00: 20 74 72 65 65 73 20 74 68 61 74 20 68 61 76 65   trees that have
4c10: 20 6e 65 76 65 72 20 62 65 65 6e 20 6d 6f 64 69   never been modi
4c20: 66 69 65 64 2e 20 20 54 68 65 20 65 6e 64 20 72  fied.  The end r
4c30: 65 73 75 6c 74 20 69 73 20 74 68 61 74 0a 20 20  esult is that.  
4c40: 20 20 20 20 2a 2a 20 79 6f 75 20 63 61 6e 20 68      ** you can h
4c50: 61 76 65 20 61 20 53 45 4c 45 43 54 20 67 6f 69  ave a SELECT goi
4c60: 6e 67 20 6f 6e 20 69 6e 20 6f 6e 65 20 74 61 62  ng on in one tab
4c70: 6c 65 20 61 6e 64 20 52 4f 4c 4c 42 41 43 4b 20  le and ROLLBACK 
4c80: 63 68 61 6e 67 65 73 0a 20 20 20 20 20 20 2a 2a  changes.      **
4c90: 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
4ca0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 53 45  table and the SE
4cb0: 4c 45 43 54 20 69 73 20 75 6e 61 66 66 65 63 74  LECT is unaffect
4cc0: 65 64 20 62 79 20 74 68 65 20 52 4f 4c 4c 42 41  ed by the ROLLBA
4cd0: 43 4b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  CK..      */.   
4ce0: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
4cf0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 67  TO_DATA(pPg), pg
4d00: 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54  Rec.aData, SQLIT
4d10: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
4d20: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
4d30: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
4d40: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
4d50: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  a);.    }.    pP
4d60: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
4d70: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
4d80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4d90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
4da0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
4db0: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
4dc0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
4dd0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
4de0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
4df0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
4e00: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
4e10: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
4e20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
4e30: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
4e40: 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  :  There is an i
4e50: 6e 69 74 69 61 6c 0a 2a 2a 20 66 69 6c 65 2d 74  nitial.** file-t
4e60: 79 70 65 20 73 74 72 69 6e 67 20 66 6f 72 20 73  ype string for s
4e70: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 2e 20  anity checking. 
4e80: 20 54 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   Then there is a
4e90: 20 73 69 6e 67 6c 65 0a 2a 2a 20 50 67 6e 6f 20   single.** Pgno 
4ea0: 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
4eb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
4ec0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
4ed0: 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 68  ase before.** ch
4ee0: 61 6e 67 65 73 20 77 65 72 65 20 6d 61 64 65 2e  anges were made.
4ef0: 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69    The database i
4f00: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 74  s truncated to t
4f10: 68 69 73 20 73 69 7a 65 2e 0a 2a 2a 20 4e 65 78  his size..** Nex
4f20: 74 20 63 6f 6d 65 20 7a 65 72 6f 20 6f 72 20 6d  t come zero or m
4f30: 6f 72 65 20 70 61 67 65 20 72 65 63 6f 72 64 73  ore page records
4f40: 20 77 68 65 72 65 20 65 61 63 68 20 70 61 67 65   where each page
4f50: 20 72 65 63 6f 72 64 0a 2a 2a 20 63 6f 6e 73 69   record.** consi
4f60: 73 74 73 20 6f 66 20 61 20 50 67 6e 6f 20 61 6e  sts of a Pgno an
4f70: 64 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  d SQLITE_PAGE_SI
4f80: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
4f90: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 50 61  .  See.** the Pa
4fa0: 67 65 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  geRecord structu
4fb0: 72 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  re for details..
4fc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
4fd0: 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
4fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
4ff0: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
5000: 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
5010: 65 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64  e (as determined
5020: 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74   by looking at t
5030: 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 0a  he magic number.
5040: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
5050: 69 6e 67 29 20 74 68 65 6e 20 74 68 69 73 20 72  ing) then this r
5060: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
5070: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2e 0a  QLITE_PROTOCOL..
5080: 2a 2a 20 49 66 20 61 6e 79 20 6f 74 68 65 72 20  ** If any other 
5090: 65 72 72 6f 72 73 20 6f 63 63 75 72 20 64 75 72  errors occur dur
50a0: 69 6e 67 20 70 6c 61 79 62 61 63 6b 2c 20 74 68  ing playback, th
50b0: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 0a  e database will.
50c0: 2a 2a 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 72  ** likely be cor
50d0: 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65 20 50  rupted, so the P
50e0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
50f0: 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 0a 2a   bit is set in.*
5100: 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
5110: 6b 20 61 6e 64 20 53 51 4c 49 54 45 5f 43 4f 52  k and SQLITE_COR
5120: 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
5130: 2e 20 20 49 66 20 69 74 20 61 6c 6c 0a 2a 2a 20  .  If it all.** 
5140: 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73  works, then this
5150: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
5160: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
5170: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
5180: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
5190: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
51a0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
51b0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
51c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
51d0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
51e0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
51f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5200: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
5210: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
5220: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5240: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
5250: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
5260: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
5270: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
5280: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
5290: 20 20 69 6e 74 20 66 6f 72 6d 61 74 3b 20 20 20    int format;   
52a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
52b0: 72 6d 61 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rmat of the jour
52c0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 75  nal file. */.  u
52d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
52e0: 67 69 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  gic[sizeof(aJour
52f0: 6e 61 6c 4d 61 67 69 63 31 29 5d 3b 0a 20 20 69  nalMagic1)];.  i
5300: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 67  nt rc;..  /* Fig
5310: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
5320: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
5330: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
5340: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
5350: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
5360: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
5370: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
5380: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
5390: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
53a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
53b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
53c0: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
53d0: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
53e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
53f0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
5400: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
5410: 69 66 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f 66  if( szJ < sizeof
5420: 28 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66 28  (aMagic)+sizeof(
5430: 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 67 6f 74  Pgno) ){.    got
5440: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
5450: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
5460: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
5470: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
5480: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
5490: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
54a0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
54b0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a  inal size..  */.
54c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
54d0: 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ead(&pPager->jfd
54e0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
54f0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
5500: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5510: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
5520: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20  E_PROTOCOL;.    
5530: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
5540: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d  k;.  }.  if( mem
5550: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
5560: 72 6e 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65  rnalMagic3, size
5570: 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29  of(aMagic))==0 )
5580: 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a  {.    format = J
5590: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 3b  OURNAL_FORMAT_3;
55a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
55b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
55c0: 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73 69 7a 65  rnalMagic2, size
55d0: 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29  of(aMagic))==0 )
55e0: 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a  {.    format = J
55f0: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 3b  OURNAL_FORMAT_2;
5600: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
5610: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
5620: 72 6e 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65  rnalMagic1, size
5630: 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29  of(aMagic))==0 )
5640: 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a  {.    format = J
5650: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 3b  OURNAL_FORMAT_1;
5660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
5680: 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OL;.    goto end
5690: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
56a0: 20 69 66 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55   if( format>=JOU
56b0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b  RNAL_FORMAT_3 ){
56c0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
56d0: 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50  bits(format, &pP
56e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63  ager->jfd, &nRec
56f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
5700: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
5710: 6b 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  k;.    rc = read
5720: 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26  32bits(format, &
5730: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
5740: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
5750: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
5760: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
5770: 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  ;.    if( nRec==
5780: 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
5790: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
57a0: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
57b0: 28 33 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  (3))/JOURNAL_PG_
57c0: 53 5a 28 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  SZ(3);.    }.  }
57d0: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 63 20 3d  else{.    nRec =
57e0: 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
57f0: 48 44 52 5f 53 5a 28 32 29 29 2f 4a 4f 55 52 4e  HDR_SZ(2))/JOURN
5800: 41 4c 5f 50 47 5f 53 5a 28 32 29 3b 0a 20 20 20  AL_PG_SZ(2);.   
5810: 20 61 73 73 65 72 74 28 20 6e 52 65 63 2a 4a 4f   assert( nRec*JO
5820: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 32 29 2b 4a  URNAL_PG_SZ(2)+J
5830: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32 29  OURNAL_HDR_SZ(2)
5840: 3d 3d 73 7a 4a 20 29 3b 0a 20 20 7d 0a 20 20 72  ==szJ );.  }.  r
5850: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
5860: 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e  ormat, &pPager->
5870: 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69  jfd, &mxPg);.  i
5880: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5890: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
58a0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
58b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
58c0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
58d0: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
58e0: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
58f0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75  rc = sqliteOsTru
5900: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
5910: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
5920: 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29  IZE*(off_t)mxPg)
5930: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5940: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
5950: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
5960: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
5970: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a  Size = mxPg;.  .
5980: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
5990: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
59a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
59b0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
59c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
59d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
59e0: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Rec; i++){.    r
59f0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
5a00: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
5a10: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
5a20: 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69  , format);.    i
5a30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5a40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
5a50: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
5a60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
5a70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
5a80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5a90: 20 20 7d 0a 20 20 7d 0a 0a 0a 65 6e 64 5f 70 6c    }.  }...end_pl
5aa0: 61 79 62 61 63 6b 3a 0a 23 69 66 20 21 64 65 66  ayback:.#if !def
5ab0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
5ac0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
5ad0: 45 53 54 29 0a 20 20 2f 2a 20 46 6f 72 20 70 61  EST).  /* For pa
5ae0: 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 65  ges that were ne
5af0: 76 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ver written into
5b00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 72 65   the journal, re
5b10: 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 6d  store the.  ** m
5b20: 65 6d 6f 72 79 20 63 6f 70 79 20 66 72 6f 6d 20  emory copy from 
5b30: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
5b40: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
5b50: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  .  ** This is co
5b60: 64 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  de is used durin
5b70: 67 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20  g testing only. 
5b80: 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   It is necessary
5b90: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6d 70 65 6e 73   to.  ** compens
5ba0: 61 74 65 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ate for the sqli
5bb0: 74 65 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  teOsTruncate() c
5bc0: 61 6c 6c 20 69 6e 73 69 64 65 20 0a 20 20 2a 2a  all inside .  **
5bd0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
5be0: 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 20 20  lback()..  */.  
5bf0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5c00: 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
5c10: 70 50 67 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  pPg;.    for(pPg
5c20: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
5c30: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
5c40: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 63 68  xtAll){.      ch
5c50: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50  ar zBuf[SQLITE_P
5c60: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20  AGE_SIZE];.     
5c70: 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
5c80: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
5c90: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
5ca0: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65       sqliteOsSee
5cb0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
5cc0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
5cd0: 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70 67 6e  (off_t)(pPg->pgn
5ce0: 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72  o-1));.        r
5cf0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
5d00: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  (&pPager->fd, zB
5d10: 75 66 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  uf, SQLITE_PAGE_
5d20: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69  SIZE);.        i
5d30: 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
5d40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5d50: 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
5d60: 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   0, SQLITE_PAGE_
5d70: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20  SIZE);.      }. 
5d80: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52       if( pPg->nR
5d90: 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ef==0 || memcmp(
5da0: 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44  zBuf, PGHDR_TO_D
5db0: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
5dc0: 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b 0a 20  _PAGE_SIZE) ){. 
5dd0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
5de0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
5df0: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
5e00: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
5e10: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
5e20: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30  TO_EXTRA(pPg), 0
5e30: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
5e40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5e50: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
5e60: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
5e70: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
5e80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
5e90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5ea0: 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  {.    pager_unwr
5eb0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
5ec0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
5ed0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
5ee0: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
5ef0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
5f00: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
5f10: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
5f20: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
5f30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
5f50: 61 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ack the checkpoi
5f60: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
5f70: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
5f80: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
5f90: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
5fa0: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
5fb0: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
5fc0: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
5fd0: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
5fe0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
5ff0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6000: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
6020: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74  checkpoint is st
6030: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
6040: 63 6b 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  ckptSize, not in
6050: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
6070: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
6080: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
6090: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
60a0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
60b0: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
60c0: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
60d0: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
60e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
60f0: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
6100: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
6110: 73 65 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  set pPager->ckpt
6120: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
6130: 20 69 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f   int pager_ckpt_
6140: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
6150: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
6160: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
6170: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
6180: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
6190: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
61b0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
61c0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
61f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6200: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
6210: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
6220: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
6230: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
6240: 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74   sqliteOsTruncat
6250: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
6260: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
6270: 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 63  (off_t)pPager->c
6280: 6b 70 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  kptSize);.  pPag
6290: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
62a0: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a  ger->ckptSize;..
62b0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
62c0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
62d0: 20 61 72 65 20 69 6e 20 74 68 65 20 63 68 65 63   are in the chec
62e0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
62f0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
6300: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
6310: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
6320: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
6330: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
6340: 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 6e  r->cpfd, 0);.  n
6350: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  Rec = pPager->ck
6360: 70 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  ptNRec;.  .  /* 
6370: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
6380: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 63  ges out of the c
6390: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
63a0: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
63b0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
63c0: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
63d0: 61 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  at the checkpoin
63e0: 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79 73  t journal always
63f0: 20 75 73 65 73 20 66 6f 72 6d 61 74 0a 20 20 2a   uses format.  *
6400: 2a 20 32 20 69 6e 73 74 65 61 64 20 6f 66 20 66  * 2 instead of f
6410: 6f 72 6d 61 74 20 33 20 73 69 6e 63 65 20 69 74  ormat 3 since it
6420: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
6430: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 77  o be concerned w
6440: 69 74 68 0a 20 20 2a 2a 20 70 6f 77 65 72 20 66  ith.  ** power f
6450: 61 69 6c 75 72 65 73 20 63 6f 72 72 75 70 74 69  ailures corrupti
6460: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
6470: 6e 64 20 63 61 6e 20 74 68 75 73 20 6f 6d 69 74  nd can thus omit
6480: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a   the checksums..
6490: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65    */.  for(i=nRe
64a0: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
64b0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
64c0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
64d0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
64e0: 72 2d 3e 63 70 66 64 2c 20 32 29 3b 0a 20 20 20  r->cpfd, 2);.   
64f0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
6500: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
6510: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6520: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70  K ) goto end_ckp
6530: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
6540: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
6550: 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20   how many pages 
6560: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 70 69 65  need to be copie
6570: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 74 72 61  d out of the tra
6580: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f  nsaction.  ** jo
6590: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63  urnal..  */.  rc
65a0: 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28   = sqliteOsSeek(
65b0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
65c0: 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29  ager->ckptJSize)
65d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
65e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
65f0: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
6600: 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ack;.  }.  rc = 
6610: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
6620: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
6630: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
6640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6650: 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70   goto end_ckpt_p
6660: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e  layback;.  }.  n
6670: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
6680: 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 2f  ger->ckptJSize)/
6690: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f  JOURNAL_PG_SZ(jo
66a0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20  urnal_format);. 
66b0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
66c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
66d0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
66e0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
66f0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
6700: 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  , journal_format
6710: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
6720: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6730: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
6740: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
6750: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
6760: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
6770: 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 63 6b 70 74  .  }.  .end_ckpt
6780: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
6790: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
67a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
67b0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
67c0: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
67d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
67e0: 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  UPT;.  }.  retur
67f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
6800: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
6810: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
6820: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
6830: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
6840: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
6850: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
6860: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
6870: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
6880: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
6890: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
68a0: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
68b0: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
68c0: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
68d0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
68e0: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
68f0: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
6900: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
6910: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
6920: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
6930: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
6940: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
6950: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
6960: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
6970: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
6980: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
6990: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
69a0: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
69b0: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
69c0: 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61  litepager_set_ca
69d0: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
69e0: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
69f0: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
6a00: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >=0 ){.    pPage
6a10: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
6a20: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
6a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
6a40: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20  r->noSync = 1;. 
6a50: 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50     mxPage = -mxP
6a60: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  age;.  }.  if( m
6a70: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
6a80: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
6a90: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a   mxPage;.  }.}..
6aa0: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
6ab0: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
6ac0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
6ad0: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
6ae0: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
6af0: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
6b00: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
6b10: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
6b20: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
6b30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
6b40: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
6b50: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
6b60: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
6b70: 20 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 29    sqliteOsSync()
6b80: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
6b90: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
6ba0: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
6bb0: 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
6bc0: 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
6bd0: 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
6be0: 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
6bf0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
6c00: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
6c10: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
6c20: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
6c30: 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
6c40: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
6c50: 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
6c60: 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
6c70: 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
6c80: 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
6c90: 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
6ca0: 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
6cc0: 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
6cd0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
6ce0: 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
6cf0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
6d00: 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
6d10: 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
6d20: 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
6d30: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
6d40: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
6d50: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
6d60: 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
6d70: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
6d80: 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
6d90: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
6da0: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
6db0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
6dc0: 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
6dd0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
6de0: 61 74 69 6f 6e 20 62 65 69 6e 67 20 77 72 69 74  ation being writ
6df0: 74 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ten.**          
6e00: 20 20 20 20 69 6e 20 62 65 74 77 65 65 6e 20 74      in between t
6e10: 68 65 20 74 77 6f 20 73 79 6e 63 73 2e 20 20 49  he two syncs.  I
6e20: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
6e30: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
6e40: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
6e50: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
6e60: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
6e70: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
6e80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6e90: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
6ea0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
6eb0: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
6ec0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
6ed0: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
6ee0: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
6ef0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6f00: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
6f10: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
6f20: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
6f30: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
6f40: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
6f50: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
6f60: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64   FULL=3..*/.void
6f70: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74   sqlitepager_set
6f80: 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61  _safety_level(Pa
6f90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
6fa0: 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65   level){.  pPage
6fb0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
6fc0: 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
6fd0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
6fe0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
6ff0: 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
7000: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 7d  ger->tempFile;.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
7020: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
7030: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
7040: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
7050: 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20  zName.** (zName 
7060: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
7070: 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45   SQLITE_TEMPNAME
7080: 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67  _SIZE bytes long
7090: 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  .)  Write.** the
70a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
70b0: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
70c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
70d0: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
70e0: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
70f0: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
7100: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
7110: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
7120: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
7130: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
7140: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
7150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
7160: 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65  litepager_opente
7170: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
7180: 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69  OsFile *fd){.  i
7190: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e  nt cnt = 8;.  in
71a0: 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  t rc;.  do{.    
71b0: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
71c0: 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  eOsTempFileName(
71d0: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
71e0: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63   sqliteOsOpenExc
71f0: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64  lusive(zFile, fd
7200: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
7210: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
7220: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
7230: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7240: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
7250: 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
7260: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7270: 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
7280: 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
7290: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
72a0: 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
72b0: 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
72c0: 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
72d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
72e0: 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  l to sqlitepager
72f0: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
7300: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
7310: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
7320: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
7330: 75 73 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65  using sqlitepage
7340: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  r_unref()..**.**
7350: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
7360: 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
7370: 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
7380: 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
7390: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
73a0: 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
73b0: 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
73c0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
73d0: 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
73e0: 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
73f0: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
7400: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
7410: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
7420: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
7430: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
7440: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
7450: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7460: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
7470: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
7480: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
7490: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  pen */.  int mxP
74a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
74b0: 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20    /* Max number 
74c0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  of in-memory cac
74d0: 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  he pages */.  in
74e0: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
74f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
7500: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
7510: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
7520: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  age */.  int use
7530: 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20  Journal         
7540: 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65    /* TRUE to use
7550: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
7560: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
7570: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
7580: 70 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a  pPager;.  char *
7590: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20  zFullPathname;. 
75a0: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20   int nameLen;.  
75b0: 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74  OsFile fd;.  int
75c0: 20 72 63 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46   rc;.  int tempF
75d0: 69 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  ile;.  int readO
75e0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nly = 0;.  char 
75f0: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
7600: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20  PNAME_SIZE];..  
7610: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
7620: 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
7630: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
7640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
7650: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
7660: 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Filename ){.    
7670: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
7680: 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68  sqliteOsFullPath
7690: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
76a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
76b0: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
76c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
76d0: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
76e0: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30      tempFile = 0
76f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7700: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
7710: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
7720: 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  &fd);.    zFilen
7730: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
7740: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
7750: 20 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74   sqliteOsFullPat
7760: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
7770: 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  ;.    tempFile =
7780: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
7790: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
77a0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
77b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
77c0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
77d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
77e0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
77f0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
7800: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
7810: 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c  PEN;.  }.  nameL
7820: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
7830: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50  lPathname);.  pP
7840: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
7850: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
7860: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32  ger) + nameLen*2
7870: 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70   + 30 );.  if( p
7880: 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
7890: 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 66  sqliteOsClose(&f
78a0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  d);.    sqliteFr
78b0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
78c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
78d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
78e0: 20 20 53 45 54 5f 50 41 47 45 52 28 70 50 61 67    SET_PAGER(pPag
78f0: 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  er);.  pPager->z
7900: 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
7910: 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
7920: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
7930: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
7940: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
7950: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
7960: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46  r->zFilename, zF
7970: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
7980: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
7990: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
79a0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
79b0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
79c0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
79d0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
79e0: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
79f0: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
7a00: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61  ->fd = fd;.  pPa
7a10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7a20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7a30: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
7a40: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
7a50: 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b  r->ckptOpen = 0;
7a60: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  .  pPager->ckptI
7a70: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  nUse = 0;.  pPag
7a80: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
7a90: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
7aa0: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63   -1;.  pPager->c
7ab0: 6b 70 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  kptSize = 0;.  p
7ac0: 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65  Pager->ckptJSize
7ad0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7ae0: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
7af0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
7b00: 50 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20  Page>5 ? mxPage 
7b10: 3a 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  : 10;.  pPager->
7b20: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55  state = SQLITE_U
7b30: 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d  NLOCK;.  pPager-
7b40: 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  >errMask = 0;.  
7b50: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
7b60: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
7b70: 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
7b80: 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50  = readOnly;.  pP
7b90: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
7ba0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   0;.  pPager->no
7bb0: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
7bc0: 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
7bd0: 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
7be0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
7bf0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
7c00: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
7c10: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
7c20: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
7c30: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73  = nExtra;.  mems
7c40: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
7c50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
7c60: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a  er->aHash));.  *
7c70: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
7c80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7c90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
7ca0: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
7cb0: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
7cc0: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
7cd0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
7ce0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
7cf0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
7d00: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
7d10: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
7d20: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
7d30: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
7d40: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
7d50: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
7d60: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
7d70: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
7d80: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
7d90: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
7da0: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
7db0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c  t sqlitepager_cl
7dc0: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
7dd0: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
7de0: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
7df0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  epager_unref()..
7e00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
7e10: 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74  ger_set_destruct
7e20: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
7e30: 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
7e40: 76 6f 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65  void*)){.  pPage
7e50: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
7e60: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
7e70: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
7e80: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
7e90: 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
7ea0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
7eb0: 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f  th.** pPager..*/
7ec0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
7ed0: 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  _pagecount(Pager
7ee0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66   *pPager){.  off
7ef0: 5f 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  _t n;.  assert( 
7f00: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
7f10: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
7f20: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e>=0 ){.    retu
7f30: 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  rn pPager->dbSiz
7f40: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  e;.  }.  if( sql
7f50: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  iteOsFileSize(&p
7f60: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
7f70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7f80: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
7f90: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49   |= PAGER_ERR_DI
7fa0: 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SK;.    return 0
7fb0: 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c  ;.  }.  n /= SQL
7fc0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ITE_PAGE_SIZE;. 
7fd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
7fe0: 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  te!=SQLITE_UNLOC
7ff0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
8000: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
8010: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
8020: 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
8030: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
8040: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
8050: 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
8060: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
8070: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
8080: 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
8090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
80a0: 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
80b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
80c0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
80d0: 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
80e0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
80f0: 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
8100: 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
8110: 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
8120: 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
8130: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
8140: 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
8150: 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
8160: 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
8170: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
8180: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
8190: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
81a0: 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
81b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
81c0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
81d0: 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
81e0: 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
81f0: 61 73 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45  ase SQLITE_WRITE
8200: 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOCK: {.      sq
8210: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
8220: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
8230: 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b    sqliteOsUnlock
8240: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
8250: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
8260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8270: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
8280: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8290: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f  se SQLITE_READLO
82a0: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK: {.      sqli
82b0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
82c0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 62  er->fd);.      b
82d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
82e0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
82f0: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
8300: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
8310: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
8320: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
8330: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
8340: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
8350: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
8360: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
8370: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
8380: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
8390: 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  d);.  assert( pP
83a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
83b0: 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d  n==0 );.  /* Tem
83c0: 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
83d0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
83e0: 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
83f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
8400: 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
8410: 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65 28 70  sqliteOsDelete(p
8420: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
8430: 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20  );.  ** }.  */. 
8440: 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65   CLR_PAGER(pPage
8450: 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  r);.  sqliteFree
8460: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
8470: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8480: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8490: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
84a0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
84b0: 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73   data..*/.Pgno s
84c0: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 6e  qlitepager_pagen
84d0: 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
84e0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
84f0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
8500: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
8510: 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
8520: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
8530: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
8540: 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
8550: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 63  the page is.** c
8560: 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
8570: 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
8580: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
8590: 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
85a0: 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
85b0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 23  e freelist..*/.#
85c0: 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28  define page_ref(
85d0: 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d  P)   ((P)->nRef=
85e0: 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a  =0?_page_ref(P):
85f0: 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b  (void)(P)->nRef+
8600: 2b 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  +).static void _
8610: 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
8620: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
8630: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8640: 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
8650: 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
8660: 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
8670: 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
8680: 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
8690: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
86a0: 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
86b0: 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
86c0: 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
86d0: 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
86e0: 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
86f0: 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
8700: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
8710: 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
8720: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
8730: 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
8740: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
8750: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
8760: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
8770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8780: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
8790: 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
87a0: 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
87b0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
87c0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
87d0: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
87e0: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
87f0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
8800: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
8810: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
8820: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
8830: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
8840: 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
8850: 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
8860: 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
8870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
8880: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
8890: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
88a0: 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
88b0: 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
88c0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
88d0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
88e0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65  t sqlitepager_re
88f0: 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
8900: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
8910: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
8920: 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  ta);.  page_ref(
8930: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
8940: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8950: 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
8960: 6e 61 6c 20 61 6e 64 20 74 68 65 6e 20 77 72 69  nal and then wri
8970: 74 65 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74  te all free dirt
8980: 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
8990: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e  atabase.** file.
89a0: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69 6e 67 20 61  .**.** Writing a
89b0: 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20 70 61  ll free dirty pa
89c0: 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
89d0: 61 73 65 20 61 66 74 65 72 20 74 68 65 20 73 79  ase after the sy
89e0: 6e 63 20 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d 6f  nc is a.** non-o
89f0: 62 76 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  bvious optimizat
8a00: 69 6f 6e 2e 20 20 66 73 79 6e 63 28 29 20 69 73  ion.  fsync() is
8a10: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
8a20: 65 72 61 74 69 6f 6e 20 73 6f 20 77 65 0a 2a 2a  eration so we.**
8a30: 20 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a   want to minimiz
8a40: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 74 20  e the number ot 
8a50: 74 69 6d 65 73 20 69 74 20 69 73 20 63 61 6c 6c  times it is call
8a60: 65 64 2e 20 41 66 74 65 72 20 61 6e 20 66 73 79  ed. After an fsy
8a70: 6e 63 28 29 20 63 61 6c 6c 2c 0a 2a 2a 20 77 65  nc() call,.** we
8a80: 20 61 72 65 20 66 72 65 65 20 74 6f 20 77 72 69   are free to wri
8a90: 74 65 20 64 69 72 74 79 20 70 61 67 65 73 20 62  te dirty pages b
8aa0: 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
8ab0: 61 73 65 2e 20 20 49 74 20 69 73 20 62 65 73 74  ase.  It is best
8ac0: 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
8ad0: 61 6e 64 20 77 72 69 74 65 20 61 73 20 6d 61 6e  and write as man
8ae0: 79 20 64 69 72 74 79 20 70 61 67 65 73 20 61 73  y dirty pages as
8af0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 69 6e   possible to min
8b00: 69 6d 69 7a 65 20 0a 2a 2a 20 74 68 65 20 72 69  imize .** the ri
8b10: 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74 6f 20  sk of having to 
8b20: 64 6f 20 61 6e 6f 74 68 65 72 20 66 73 79 6e 63  do another fsync
8b30: 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20 20 57 72  () later on.  Wr
8b40: 69 74 69 6e 67 20 64 69 72 74 79 0a 2a 2a 20 66  iting dirty.** f
8b50: 72 65 65 20 70 61 67 65 73 20 69 6e 20 74 68 69  ree pages in thi
8b60: 73 20 77 61 79 20 77 61 73 20 6f 62 73 65 72 76  s way was observ
8b70: 65 64 20 74 6f 20 6d 61 6b 65 20 64 61 74 61 62  ed to make datab
8b80: 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 67  ase operations g
8b90: 6f 0a 2a 2a 20 75 70 20 74 6f 20 31 30 20 74 69  o.** up to 10 ti
8ba0: 6d 65 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  mes faster..**.*
8bb0: 2a 20 49 66 20 77 65 20 61 72 65 20 77 72 69 74  * If we are writ
8bc0: 69 6e 67 20 74 6f 20 74 65 6d 70 6f 72 61 72 79  ing to temporary
8bd0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 72 65   database, there
8be0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 70   is no need to p
8bf0: 72 65 73 65 72 76 65 0a 2a 2a 20 74 68 65 20 69  reserve.** the i
8c00: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
8c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
8c20: 20 77 65 20 63 61 6e 20 73 61 76 65 20 74 69 6d   we can save tim
8c30: 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 0a 2a  e and skip the.*
8c40: 2a 20 66 73 79 6e 63 28 29 2e 0a 2a 2f 0a 73 74  * fsync()..*/.st
8c50: 61 74 69 63 20 69 6e 74 20 73 79 6e 63 41 6c 6c  atic int syncAll
8c60: 50 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  Pages(Pager *pPa
8c70: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
8c80: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
8c90: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
8ca0: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
8cb0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
8cc0: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
8cd0: 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
8ce0: 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
8cf0: 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
8d00: 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
8d10: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
8d20: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
8d30: 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
8d40: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
8d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8d60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8d70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8d80: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
8d90: 20 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   );.#ifndef NDEB
8da0: 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
8db0: 20 20 20 6f 66 66 5f 74 20 68 64 72 53 7a 2c 20     off_t hdrSz, 
8dc0: 70 67 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64  pgSz;.        hd
8dd0: 72 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  rSz = JOURNAL_HD
8de0: 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  R_SZ(journal_for
8df0: 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20 70 67  mat);.        pg
8e00: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Sz = JOURNAL_PG_
8e10: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
8e20: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
8e30: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
8e40: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
8e50: 26 70 50 61 67 65 72 2d 3e 73 79 6e 63 4a 53 69  &pPager->syncJSi
8e60: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ze);.        if(
8e70: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
8e80: 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
8e90: 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
8ea0: 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 70 50 61  *pgSz+hdrSz==pPa
8eb0: 67 65 72 2d 3e 73 79 6e 63 4a 53 69 7a 65 20 29  ger->syncJSize )
8ec0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
8ed0: 0a 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72 6e  .      if( journ
8ee0: 61 6c 5f 66 6f 72 6d 61 74 3e 3d 33 20 29 7b 0a  al_format>=3 ){.
8ef0: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 73 7a          off_t sz
8f00: 4a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  J;.        if( p
8f10: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
8f20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  ){.          TRA
8f30: 43 45 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a 20  CE1("SYNC\n");. 
8f40: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
8f50: 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67  liteOsSync(&pPag
8f60: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
8f70: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
8f80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
8f90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
8fa0: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
8fb0: 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f 66 28 61  r->jfd, sizeof(a
8fc0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b  JournalMagic1));
8fd0: 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 33 32  .        write32
8fe0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
8ff0: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  d, pPager->nRec)
9000: 3b 0a 20 20 20 20 20 20 20 20 73 7a 4a 20 3d 20  ;.        szJ = 
9010: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a  JOURNAL_HDR_SZ(j
9020: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 2b  ournal_format) +
9030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9040: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a    pPager->nRec*J
9050: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75  OURNAL_PG_SZ(jou
9060: 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  rnal_format);.  
9070: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65        sqliteOsSe
9080: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
9090: 20 73 7a 4a 29 3b 0a 20 20 20 20 20 20 7d 0a 20   szJ);.      }. 
90a0: 20 20 20 20 20 54 52 41 43 45 31 28 22 53 59 4e       TRACE1("SYN
90b0: 43 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  C\n");.      rc 
90c0: 3d 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26  = sqliteOsSync(&
90d0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
90e0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
90f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
9100: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9110: 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
9120: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
9130: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
9140: 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
9150: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
9160: 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
9170: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
9180: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
9190: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
91a0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
91b0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
91c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
91d0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
91e0: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
91f0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
9200: 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
9210: 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
9220: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
9230: 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
9240: 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
9250: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
9260: 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
9270: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
9280: 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
9290: 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
92a0: 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
92b0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
92c0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
92d0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
92e0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
92f0: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
9300: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
9310: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
9320: 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70  ynced==pPager->p
9330: 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
9340: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
9350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
9360: 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
9370: 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
9380: 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
9390: 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
93a0: 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
93b0: 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
93c0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
93d0: 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
93e0: 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
93f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
9400: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
9410: 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
9420: 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
9430: 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
9440: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
9450: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9460: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
9470: 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20  List->pPager;.  
9480: 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
9490: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
94a0: 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
94b0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
94c0: 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
94d0: 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74  ->pgno-1)*(off_t
94e0: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
94f0: 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  E);.    rc = sql
9500: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
9510: 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
9520: 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 53 51  _DATA(pList), SQ
9530: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
9540: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9550: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
9560: 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  st->dirty = 0;. 
9570: 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
9580: 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
9590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
95a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
95b0: 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
95c0: 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
95d0: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
95e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
95f0: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
9600: 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
9610: 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
9620: 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
9630: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
9640: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
9650: 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
9660: 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
9670: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9680: 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74  PgHdr *p, *pList
9690: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ;.  pList = 0;. 
96a0: 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
96b0: 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
96c0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
96d0: 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
96e0: 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c    p->pDirty = pL
96f0: 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  ist;.      pList
9700: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = p;.    }.  }.
9710: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
9720: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
9730: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
9740: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
9750: 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
9760: 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
9770: 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
9780: 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
9790: 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
97a0: 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
97b0: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
97c0: 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f  eased..**.** A _
97d0: 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  get works for an
97e0: 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
97f0: 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
9800: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
9810: 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
9820: 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
9830: 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
9840: 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
9850: 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
9860: 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
9870: 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
9880: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
9890: 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
98a0: 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
98b0: 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
98c0: 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
98d0: 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
98e0: 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
98f0: 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
9900: 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
9910: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
9920: 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
9930: 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
9940: 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
9950: 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
9960: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
9970: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
9980: 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
9990: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
99a0: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
99b0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20  pager_lookup(). 
99c0: 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
99d0: 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
99e0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
99f0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
9a00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
9a10: 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
9a20: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
9a30: 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
9a40: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
9a50: 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
9a60: 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
9a70: 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
9a80: 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
9a90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
9aa0: 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
9ab0: 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
9ac0: 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
9ad0: 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
9ae0: 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
9af0: 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
9b00: 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
9b10: 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
9b20: 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
9b30: 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
9b40: 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
9b50: 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
9b60: 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
9b70: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67  nt sqlitepager_g
9b80: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
9b90: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
9ba0: 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50  d **ppPage){.  P
9bb0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
9bc0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   rc;..  /* Make 
9bd0: 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
9be0: 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
9bf0: 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
9c00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9c10: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9c20: 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66   pgno!=0 );.  if
9c30: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
9c40: 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
9c50: 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
9c60: 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
9c70: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
9c80: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
9c90: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
9ca0: 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
9cb0: 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 20 20  t a read lock.  
9cc0: 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
9cd0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
9ce0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
9cf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
9d00: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
9d10: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
9d20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9d30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
9d40: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
9d50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9d60: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
9d70: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
9d80: 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20 49  DLOCK;..    /* I
9d90: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
9da0: 20 65 78 69 73 74 73 2c 20 74 72 79 20 74 6f 20   exists, try to 
9db0: 70 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a 20 20  play it back..  
9dc0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
9dd0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
9de0: 26 26 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 45  && sqliteOsFileE
9df0: 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
9e00: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
9e10: 20 20 69 6e 74 20 72 63 2c 20 64 75 6d 6d 79 3b    int rc, dummy;
9e20: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ..       /* Get 
9e30: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
9e40: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
9e50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
9e60: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
9e70: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
9e80: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
9e90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9ea0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9eb0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
9ec0: 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
9ed0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
9ee0: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
9ef0: 6e 65 76 65 72 20 68 61 70 70 65 6e 21 20 2a 2f  never happen! */
9f00: 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  .           rc =
9f10: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
9f20: 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ;.         }.   
9f30: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
9f40: 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  0;.         retu
9f50: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
9f60: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
9f70: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52  tate = SQLITE_WR
9f80: 49 54 45 4c 4f 43 4b 3b 0a 0a 20 20 20 20 20 20  ITELOCK;..      
9f90: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
9fa0: 72 6e 61 6c 20 66 6f 72 20 65 78 63 6c 75 73 69  rnal for exclusi
9fb0: 76 65 20 61 63 63 65 73 73 2e 20 20 52 65 74 75  ve access.  Retu
9fc0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
9fd0: 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 63  f.       ** we c
9fe0: 61 6e 6e 6f 74 20 67 65 74 20 65 78 63 6c 75 73  annot get exclus
9ff0: 69 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68  ive access to th
a000: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
a010: 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  .       **.     
a020: 20 20 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    ** Even though
a030: 20 77 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65   we will only be
a040: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
a050: 65 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 77  e journal, not w
a060: 72 69 74 69 6e 67 2c 0a 20 20 20 20 20 20 20 2a  riting,.       *
a070: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 6f 70 65  * we have to ope
a080: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
a090: 72 20 77 72 69 74 69 6e 67 20 69 6e 20 6f 72 64  r writing in ord
a0a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 0a  er to obtain an.
a0b0: 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73         ** exclus
a0c0: 69 76 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 2e  ive access lock.
a0d0: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
a0e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f    rc = sqliteOsO
a0f0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 70 50 61  penReadWrite(pPa
a100: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
a110: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 64 75  pPager->jfd, &du
a120: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 69 66 28  mmy);.       if(
a130: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a140: 7b 0a 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  {.         rc = 
a150: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
a160: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
a170: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
a180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a190: 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
a1a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65  = 0;.         re
a1b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
a1c0: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
a1d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
a1e0: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
a1f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
a200: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 0a 20  lStarted = 0;.. 
a210: 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
a220: 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
a230: 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
a240: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
a250: 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
a260: 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
a270: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
a280: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a290: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
a2a0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
a2b0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a2c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a2d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a2e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a2f0: 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
a300: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
a310: 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
a320: 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
a330: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
a340: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
a350: 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
a360: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
a370: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
a380: 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
a390: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b  e. */.    int h;
a3a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69  .    pPager->nMi
a3b0: 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50  ss++;.    if( pP
a3c0: 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67  ager->nPage<pPag
a3d0: 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50  er->mxPage || pP
a3e0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
a3f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ){.      /* Crea
a400: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f  te a new page */
a410: 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
a420: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
a430: 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c  zeof(*pPg) + SQL
a440: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  ITE_PAGE_SIZE . 
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
a470: 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
a480: 67 65 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20  ger->nExtra );. 
a490: 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
a4a0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  ){.        *ppPa
a4b0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
a4c0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
a4d0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
a4e0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
a4f0: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
a500: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74  MEM;.        ret
a510: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a530: 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
a540: 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
a550: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
a560: 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20  = pPager;.      
a570: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  pPg->pNextAll = 
a580: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
a590: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
a5a0: 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
a5b0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50  pPager->pAll->pP
a5c0: 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  revAll = pPg;.  
a5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
a5e0: 3e 70 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20  >pPrevAll = 0;. 
a5f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
a600: 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70  l = pPg;.      p
a610: 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
a620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a630: 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
a640: 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
a650: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
a660: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
a670: 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65        ** require
a680: 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
a690: 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
a6a0: 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nal..      */.  
a6b0: 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
a6c0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  ->pFirstSynced;.
a6d0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20  .      /* If we 
a6e0: 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
a6f0: 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
a700: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
a710: 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20  sync().      ** 
a720: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
a730: 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
a740: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
a750: 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20    This is a.    
a760: 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
a770: 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
a780: 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
a790: 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
a7a0: 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69  times.      ** i
a7b0: 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
a7c0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
a7d0: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
a7e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
a7f0: 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 70 50   syncAllPages(pP
a800: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
a810: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
a820: 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
a830: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
a840: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  r);.          *p
a850: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
a860: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a870: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
a880: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20    }.        pPg 
a890: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
a8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a8b0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
a8c0: 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f  f==0 );..      /
a8d0: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
a8e0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
a8f0: 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64   file if it is d
a900: 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  irty..      */. 
a910: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69       if( pPg->di
a920: 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
a930: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
a940: 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
a950: 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
a960: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
a970: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
a980: 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
a990: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a9a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a9b0: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
a9c0: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
a9d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  );.          *pp
a9e0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
a9f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa00: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
aa10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
aa20: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
aa30: 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rty==0 );..     
aa40: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
aa50: 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
aa60: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
aa70: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
aa80: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  en.      ** set 
aa90: 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
aaa0: 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
aab0: 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
aac0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
aad0: 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  te_dont_rollback
aae0: 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
aaf0: 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
ab00: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
ab10: 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73  ..      ** It is
ab20: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
ab30: 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
ab40: 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
ab50: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20  waysRollback.   
ab60: 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72     ** might be r
ab70: 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
ab80: 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
ab90: 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
aba0: 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20  't remember.    
abb0: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
abc0: 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
abd0: 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
abe0: 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
abf0: 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  es must.      **
ac00: 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
ac10: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
ac20: 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
ac30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
ac40: 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
ac50: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
ac60: 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
ac70: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
ac80: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
ac90: 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
aca0: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
acb0: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
acc0: 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  sh table.      *
acd0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  /.      if( pPg=
ace0: 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
acf0: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ynced ){.       
ad00: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
ad10: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
ad20: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
ad30: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
ad40: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
ad50: 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
ad60: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
ad70: 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = p;.      }.   
ad80: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
ad90: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  vFree ){.       
ada0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
adb0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
adc0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
add0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ade0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
adf0: 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
ae00: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
ae10: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
ae20: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
ae30: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
ae40: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
ae50: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
ae60: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
ae70: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
ae80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ae90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
aea0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
aeb0: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  g );.        pPa
aec0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
aed0: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
aee0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
aef0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
af00: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
af10: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
af20: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
af30: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
af40: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
af50: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
af60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
af70: 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
af80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
af90: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
afa0: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
afb0: 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 65  xtHash;.      }e
afc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20 3d  lse{.        h =
afd0: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
afe0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
aff0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b000: 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b  aHash[h]==pPg );
b010: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
b020: 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
b030: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20  >pNextHash;.    
b040: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
b050: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
b060: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
b070: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76       pPager->nOv
b080: 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fl++;.    }.    
b090: 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
b0a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
b0b0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
b0c0: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
b0d0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
b0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 65  .      sqliteChe
b0f0: 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  ckMemory(pPager-
b100: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >aInJournal, pgn
b110: 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65  o/8);.      asse
b120: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
b130: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
b140: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
b150: 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
b160: 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
b170: 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
b180: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
b190: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
b1a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
b1b0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
b1c0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
b1d0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
b1e0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b1f0: 61 49 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29  aInCkpt && (int)
b200: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b  pgno<=pPager->ck
b210: 70 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  ptSize.         
b220: 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
b230: 61 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38 5d 20  aInCkpt[pgno/8] 
b240: 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
b250: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  !=0 ){.      pag
b260: 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69  e_add_to_ckpt_li
b270: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  st(pPg);.    }el
b280: 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72  se{.      page_r
b290: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70 74 5f  emove_from_ckpt_
b2a0: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
b2b0: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
b2c0: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  = 0;.    pPg->nR
b2d0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
b2e0: 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50  NFO(pPg);.    pP
b2f0: 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
b300: 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
b310: 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d  (pgno);.    pPg-
b320: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
b330: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
b340: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
b350: 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
b360: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
b370: 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
b380: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
b390: 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
b3a0: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
b3b0: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
b3c0: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
b3d0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b3e0: 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74  dbSize<0 ) sqlit
b3f0: 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  epager_pagecount
b400: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
b410: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
b420: 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20  <(int)pgno ){.  
b430: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
b440: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
b450: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
b460: 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ZE);.    }else{.
b470: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
b480: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
b490: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
b4a0: 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51  gno-1)*(off_t)SQ
b4b0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
b4c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b4d0: 74 65 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  teOsRead(&pPager
b4e0: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
b4f0: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
b500: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
b510: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b520: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b530: 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a  off_t fileSize;.
b540: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
b550: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
b560: 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69  ager->fd,&fileSi
b570: 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ze)!=SQLITE_OK. 
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
b590: 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a   fileSize>=pgno*
b5a0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
b5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
b5c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
b5d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b5e0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
b5f0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
b600: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
b610: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b630: 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
b640: 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
b650: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
b660: 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  RA(pPg), 0, pPag
b670: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
b680: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b690: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
b6a0: 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
b6b0: 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
b6c0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b     pPager->nHit+
b6d0: 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  +;.    page_ref(
b6e0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
b6f0: 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
b700: 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
b710: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b720: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
b730: 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
b740: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
b750: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
b760: 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
b770: 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
b780: 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
b790: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b7a0: 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
b7b0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
b7c0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
b7d0: 20 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65   also sqlitepage
b7e0: 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69  r_get().  The di
b7f0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
b800: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
b810: 20 61 6e 64 20 73 71 6c 69 74 65 70 61 67 65 72   and sqlitepager
b820: 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
b830: 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
b840: 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
b850: 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
b860: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b870: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
b880: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
b890: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
b8a0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
b8b0: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
b8c0: 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
b8d0: 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
b8e0: 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
b8f0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 70 61  /.void *sqlitepa
b900: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
b910: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
b920: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
b930: 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
b940: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
b950: 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
b960: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
b970: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
b980: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
b990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b9a0: 20 20 2f 2a 20 69 66 28 20 70 50 61 67 65 72 2d    /* if( pPager-
b9b0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 2a 2a  >nRef==0 ){.  **
b9c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 2a    return 0;.  **
b9d0: 20 7d 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20   }.  */.  pPg = 
b9e0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
b9f0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
ba00: 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
ba10: 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
ba20: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
ba30: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
ba40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
ba50: 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
ba60: 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
ba70: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
ba80: 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
ba90: 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
baa0: 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
bab0: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
bac0: 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
bad0: 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
bae0: 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
baf0: 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
bb00: 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
bb10: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
bb20: 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
bb30: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bb40: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  epager_unref(voi
bb50: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
bb60: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
bb70: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
bb80: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
bb90: 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
bba0: 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
bbb0: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
bbc0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
bbd0: 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
bbe0: 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
bbf0: 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
bc00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
bc10: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
bc20: 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
bc30: 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
bc40: 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
bc50: 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
bc60: 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
bc70: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
bc80: 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
bc90: 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
bca0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
bcb0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
bcc0: 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
bcd0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
bce0: 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
bcf0: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
bd00: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
bd10: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
bd20: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
bd30: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
bd40: 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
bd50: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
bd60: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
bd70: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
bd80: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
bd90: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
bda0: 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
bdb0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
bdc0: 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
bdd0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
bde0: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
bdf0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
be00: 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
be10: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
be20: 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
be30: 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
be40: 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
be50: 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
be60: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
be70: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
be80: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
be90: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
bea0: 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
beb0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
bec0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
bed0: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
bee0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
bef0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
bf00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
bf10: 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
bf20: 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
bf30: 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
bf40: 6c 72 65 61 64 79 20 62 65 20 61 20 77 72 69 74  lready be a writ
bf50: 65 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  e.** lock on the
bf60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
bf70: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
bf80: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
bf90: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
bfa0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
bfb0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
bfc0: 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
bfd0: 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
bfe0: 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
bff0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
c000: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c010: 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
c020: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c030: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
c040: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
c050: 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  ==SQLITE_WRITELO
c060: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c070: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c080: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
c090: 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
c0a0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
c0b0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
c0c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
c0d0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
c0e0: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
c0f0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
c100: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c110: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
c120: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61  er->fd);.    pPa
c130: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
c140: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
c150: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c160: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
c170: 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78  = sqliteOsOpenEx
c180: 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
c190: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
c1a0: 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74  r->jfd,pPager->t
c1b0: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
c1c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c1d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
c1e0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
c1f0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
c200: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
c210: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61  .    sqliteOsRea
c220: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
c230: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
c240: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
c250: 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  EADLOCK;.    ret
c260: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
c270: 50 45 4e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  PEN;.  }.  pPage
c280: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
c290: 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
c2a0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
c2b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
c2c0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
c2d0: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
c2e0: 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
c2f0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71  ->nRec = 0;.  sq
c300: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
c310: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
c320: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
c330: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
c340: 7a 65 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61  ze;.  if( journa
c350: 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41  l_format==JOURNA
c360: 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20  L_FORMAT_3 ){.  
c370: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
c380: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
c390: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
c3a0: 33 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  3, sizeof(aJourn
c3b0: 61 6c 4d 61 67 69 63 33 29 29 3b 0a 20 20 20 20  alMagic3));.    
c3c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c3d0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
c3e0: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
c3f0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
c400: 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 30 78 66  ->tempFile ? 0xf
c410: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
c420: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
c430: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c440: 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d     pPager->cksum
c450: 49 6e 69 74 20 3d 20 28 75 33 32 29 73 71 6c 69  Init = (u32)sqli
c460: 74 65 52 61 6e 64 6f 6d 49 6e 74 65 67 65 72 28  teRandomInteger(
c470: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
c480: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
c490: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
c4a0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
c4b0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f  }.  }else if( jo
c4c0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f  urnal_format==JO
c4d0: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 20 29  URNAL_FORMAT_2 )
c4e0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c4f0: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
c500: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
c510: 61 67 69 63 32 2c 20 73 69 7a 65 6f 66 28 61 4a  agic2, sizeof(aJ
c520: 6f 75 72 6e 61 6c 4d 61 67 69 63 32 29 29 3b 0a  ournalMagic2));.
c530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
c540: 65 72 74 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72  ert( journal_for
c550: 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52  mat==JOURNAL_FOR
c560: 4d 41 54 5f 31 20 29 3b 0a 20 20 20 20 72 63 20  MAT_1 );.    rc 
c570: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
c580: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
c590: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 2c 20 73 69  ournalMagic1, si
c5a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
c5b0: 69 63 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ic1));.  }.  if(
c5c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c5d0: 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  {.    rc = write
c5e0: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
c5f0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  jfd, pPager->dbS
c600: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ize);.  }.  if( 
c610: 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f  pPager->ckptAuto
c620: 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
c630: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c640: 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b  = sqlitepager_ck
c650: 70 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  pt_begin(pPager)
c660: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
c670: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c680: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
c690: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
c6a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c6b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c6c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
c6d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 6e  ;.    }.  }.#ifn
c6e0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 70 50 61  def NDEBUG.  pPa
c6f0: 67 65 72 2d 3e 73 79 6e 63 4a 53 69 7a 65 20 3d  ger->syncJSize =
c700: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
c710: 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a  urn rc;  .}../*.
c720: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
c730: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
c740: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
c750: 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
c760: 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
c770: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
c780: 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
c790: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f    sqlitepager_co
c7a0: 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
c7b0: 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
c7c0: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
c7d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
c7e0: 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f   *  sqlitepager_
c7f0: 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
c800: 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
c810: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  epager_unref() i
c820: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
c830: 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
c840: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
c850: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
c860: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
c870: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
c880: 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
c890: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
c8a0: 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
c8b0: 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
c8c0: 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
c8d0: 65 72 65 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75  erely.** to acqu
c8e0: 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
c8f0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
c900: 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
c910: 66 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  f that there.** 
c920: 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
c930: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
c940: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  tabase..**.** A 
c950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
c960: 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
c970: 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
c980: 79 20 66 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20  y file.  For.** 
c990: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
c9a0: 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
c9b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c9c0: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
c9d0: 69 6c 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  il.** there is a
c9e0: 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  n actual need to
c9f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
ca00: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
ca10: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ca20: 61 6c 72 65 61 64 79 20 77 72 69 74 65 2d 6c 6f  already write-lo
ca30: 63 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  cked, this routi
ca40: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
ca50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
ca60: 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44  r_begin(void *pD
ca70: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
ca80: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
ca90: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
caa0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
cab0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
cac0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cad0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
cae0: 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
caf0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
cb00: 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
cb10: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
cb20: 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52  >state==SQLITE_R
cb30: 45 41 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  EADLOCK ){.    a
cb40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
cb50: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
cb60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
cb70: 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67  sWriteLock(&pPag
cb80: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28  er->fd);.    if(
cb90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
cbb0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
cbc0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
cbd0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20  ITE_WRITELOCK;. 
cbe0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
cbf0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 54 52  File = 0;.    TR
cc00: 41 43 45 31 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE1("TRANSACTIO
cc10: 4e 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  N\n");.    if( p
cc20: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
cc30: 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
cc40: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
cc50: 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
cc60: 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
cc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
cc80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cc90: 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
cca0: 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
ccb0: 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
ccc0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
ccd0: 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
cce0: 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
ccf0: 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
cd00: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
cd10: 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
cd20: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
cd30: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
cd40: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
cd50: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
cd60: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
cd70: 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
cd80: 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
cd90: 72 65 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  res a write lock
cda0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
cdb0: 2e 20 20 49 66 20 74 68 65 20 77 72 69 74 65 0a  .  If the write.
cdc0: 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
cdd0: 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
cde0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
cdf0: 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
ce00: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
ce10: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
ce20: 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
ce30: 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
ce40: 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
ce50: 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
ce60: 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
ce70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
ce80: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
ce90: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
cea0: 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
ceb0: 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
cec0: 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
ced0: 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
cee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
cef0: 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
cf00: 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
cf10: 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
cf20: 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
cf30: 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
cf40: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
cf50: 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
cf60: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
cf70: 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  l to sqlitepager
cf80: 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
cf90: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
cfa0: 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
cfb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
cfc0: 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
cfd0: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
cfe0: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
cff0: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
d000: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
d010: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
d020: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d030: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
d040: 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
d050: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
d060: 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ask ){ .    retu
d070: 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
d080: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
d090: 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
d0a0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
d0b0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
d0c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
d0d0: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
d0e0: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
d0f0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
d100: 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
d110: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
d120: 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
d130: 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
d140: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
d150: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
d160: 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
d170: 69 6e 43 6b 70 74 20 7c 7c 20 70 50 61 67 65 72  inCkpt || pPager
d180: 2d 3e 63 6b 70 74 49 6e 55 73 65 3d 3d 30 29 20  ->ckptInUse==0) 
d190: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
d1a0: 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20  irtyFile = 1;.  
d1b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d1c0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
d1d0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
d1e0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
d1f0: 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
d200: 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65  o be.  ** writte
d210: 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
d220: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
d230: 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
d240: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62  ournal.  ** or b
d250: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  oth..  **.  ** F
d260: 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
d270: 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
d280: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
d290: 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63  xists and.  ** c
d2a0: 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
d2b0: 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  oes not..  */.  
d2c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d2d0: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e  state!=SQLITE_UN
d2e0: 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
d2f0: 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e  qlitepager_begin
d300: 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  (pData);.  if( r
d310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d320: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d330: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
d340: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49  ger->state==SQLI
d350: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a  TE_WRITELOCK );.
d360: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
d370: 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
d380: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
d390: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
d3a0: 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
d3b0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
d3c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d3d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d3e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d3f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
d400: 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
d410: 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72  rnal );.  pPager
d420: 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b  ->dirtyFile = 1;
d430: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  ..  /* The trans
d440: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
d450: 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
d460: 20 68 61 76 65 20 61 20 77 72 69 74 65 20 6c 6f   have a write lo
d470: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d  ck on the.  ** m
d480: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
d490: 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
d4a0: 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
d4b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
d4c0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69   ** journal if i
d4d0: 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
d4e0: 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69  lready..  */.  i
d4f0: 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
d500: 61 6c 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  al && pPager->us
d510: 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
d520: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
d530: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
d540: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
d550: 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
d560: 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20    u32 saved;.   
d570: 20 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66     if( journal_f
d580: 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat>=JOURNAL_F
d590: 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 20  ORMAT_3 ){.     
d5a0: 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70     u32 cksum = p
d5b0: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
d5c0: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44  r, pPg->pgno, pD
d5d0: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 61  ata);.        sa
d5e0: 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48  ved = *(u32*)PGH
d5f0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
d600: 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33  ;.        store3
d610: 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
d620: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
d630: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  ZE);.        szP
d640: 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g = SQLITE_PAGE_
d650: 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 7d 65  SIZE+8;.      }e
d660: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 7a 50  lse{.        szP
d670: 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g = SQLITE_PAGE_
d680: 53 49 5a 45 2b 34 3b 0a 20 20 20 20 20 20 7d 0a  SIZE+4;.      }.
d690: 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
d6a0: 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
d6b0: 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 72 63 20  , -4);.      rc 
d6c0: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
d6d0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28  &pPager->jfd, &(
d6e0: 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
d6f0: 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  ], szPg);.      
d700: 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  if( journal_form
d710: 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  at>=JOURNAL_FORM
d720: 41 54 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20  AT_3 ){.        
d730: 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
d740: 45 58 54 52 41 28 70 50 67 29 20 3d 20 73 61 76  EXTRA(pPg) = sav
d750: 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
d760: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
d770: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d780: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d790: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
d7a0: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
d7b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
d7c0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
d7d0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
d7e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d7f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
d800: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
d810: 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
d820: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
d830: 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
d840: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
d850: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
d860: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
d870: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
d880: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
d890: 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
d8a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b    if( pPager->ck
d8b0: 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  ptInUse ){.     
d8c0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
d8d0: 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  pt[pPg->pgno/8] 
d8e0: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
d8f0: 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  &7);.        pag
d900: 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69  e_add_to_ckpt_li
d910: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  st(pPg);.      }
d920: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a  .      TRACE3("J
d930: 4f 55 52 4e 41 4c 20 25 64 20 25 64 5c 6e 22 2c  OURNAL %d %d\n",
d940: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
d950: 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
d960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
d970: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
d980: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
d990: 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
d9a0: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54  >noSync;.      T
d9b0: 52 41 43 45 33 28 22 41 50 50 45 4e 44 20 25 64  RACE3("APPEND %d
d9c0: 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
d9d0: 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
d9e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
d9f0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
da00: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
da10: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
da20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
da30: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
da40: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
da50: 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
da60: 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20  not in it,.  ** 
da70: 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
da80: 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
da90: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
daa0: 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
dab0: 74 0a 20 20 2a 2a 20 74 68 65 20 63 68 65 63 6b  t.  ** the check
dac0: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  point journal al
dad0: 77 61 79 73 20 75 73 65 73 20 74 68 65 20 73 69  ways uses the si
dae0: 6d 70 6c 69 65 72 20 66 6f 72 6d 61 74 20 32 20  mplier format 2 
daf0: 74 68 61 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20  that lacks.  ** 
db00: 63 68 65 63 6b 73 75 6d 73 2e 20 20 54 68 65 20  checksums.  The 
db10: 68 65 61 64 65 72 20 69 73 20 61 6c 73 6f 20 6f  header is also o
db20: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
db30: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
db40: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
db50: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
db60: 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74   && !pPg->inCkpt
db70: 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
db80: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74  no<=pPager->ckpt
db90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
dba0: 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
dbb0: 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
dbc0: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
dbd0: 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73  gDbSize );.    s
dbe0: 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
dbf0: 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
dc00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
dc10: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
dc20: 63 70 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  cpfd, &((char*)p
dc30: 44 61 74 61 29 5b 2d 34 5d 2c 20 53 51 4c 49 54  Data)[-4], SQLIT
dc40: 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a  E_PAGE_SIZE+4);.
dc50: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dc60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
dc70: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
dc80: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
dc90: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
dca0: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
dcb0: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75  FULL;.      retu
dcc0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
dcd0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65   pPager->ckptNRe
dce0: 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
dcf0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
dd00: 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
dd10: 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e  r->aInCkpt[pPg->
dd20: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
dd30: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
dd40: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70   page_add_to_ckp
dd50: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
dd60: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
dd70: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
dd80: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
dd90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
dda0: 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e  bSize<(int)pPg->
ddb0: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
ddc0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
ddd0: 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
dde0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ddf0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
de00: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
de10: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
de20: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
de30: 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
de40: 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e  tepager_write().
de50: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
de60: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
de70: 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
de80: 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
de90: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
dea0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
deb0: 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76  er_iswriteable(v
dec0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
ded0: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
dee0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
def0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
df00: 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dirty;.}../*.** 
df10: 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
df20: 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
df30: 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
df40: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
df50: 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
df60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
df70: 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
df80: 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
df90: 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
dfa0: 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
dfb0: 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
dfc0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
dfd0: 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
dfe0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
dff0: 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
e000: 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
e010: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
e020: 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
e030: 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
e040: 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
e050: 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
e060: 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
e070: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
e080: 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
e090: 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
e0a0: 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
e0b0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 70 61   the.** sqlitepa
e0c0: 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
e0d0: 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
e0e0: 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
e0f0: 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
e100: 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
e110: 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
e120: 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
e130: 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
e140: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
e150: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
e160: 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
e170: 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
e180: 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
e190: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
e1a0: 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  itepager_dont_ro
e1b0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
e1c0: 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
e1d0: 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
e1e0: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
e1f0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
e200: 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
e210: 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
e220: 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
e230: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
e240: 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
e250: 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
e260: 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
e270: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
e280: 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
e290: 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
e2a0: 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
e2b0: 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
e2c0: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
e2d0: 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
e2e0: 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
e2f0: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
e300: 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
e310: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
e320: 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
e330: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
e340: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e350: 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
e360: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
e370: 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64  ns.** critical d
e380: 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
e390: 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
e3a0: 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63   gets rolled bac
e3b0: 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66  k in spite.** of
e3c0: 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
e3d0: 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
e3e0: 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64  id sqlitepager_d
e3f0: 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20  ont_write(Pager 
e400: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
e410: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
e420: 67 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  g;..  pPg = page
e430: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
e440: 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61   pgno);.  pPg->a
e450: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
e460: 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26 20  1;.  if( pPg && 
e470: 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
e480: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
e490: 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e  Size==(int)pPg->
e4a0: 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e  pgno && pPager->
e4b0: 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65  origDbSize<pPage
e4c0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
e4d0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61     /* If this pa
e4e0: 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  ges is the last 
e4f0: 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
e500: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
e510: 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a  s grown.      **
e520: 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
e530: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
e540: 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72   then do NOT mar
e550: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
e560: 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68  ean..      ** Wh
e570: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
e580: 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d  file grows, we m
e590: 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ust make sure th
e5a0: 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
e5b0: 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77  .      ** gets w
e5c0: 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20  ritten at least 
e5d0: 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65  once so that the
e5e0: 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20   disk file will 
e5f0: 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  be the correct. 
e600: 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66       ** size. If
e610: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74   you do not writ
e620: 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20  e this page and 
e630: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e640: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  file.      ** on
e650: 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75   the disk ends u
e660: 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c  p being too smal
e670: 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64  l, that can lead
e680: 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20   to database.   
e690: 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e     ** corruption
e6a0: 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74   during the next
e6b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e6c0: 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
e6d0: 7b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  {.      TRACE2("
e6e0: 44 4f 4e 54 5f 57 52 49 54 45 20 25 64 5c 6e 22  DONT_WRITE %d\n"
e6f0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  , pgno);.      p
e700: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
e710: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e720: 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
e730: 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
e740: 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
e750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
e760: 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
e770: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
e780: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
e790: 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
e7a0: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
e7b0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
e7c0: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
e7d0: 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
e7e0: 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
e7f0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
e800: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
e810: 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  epager_dont_roll
e820: 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
e830: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
e840: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
e850: 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
e860: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
e870: 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
e880: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
e890: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c  ITE_WRITELOCK ||
e8a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e8b0: 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
e8c0: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
e8d0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
e8e0: 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
e8f0: 6c 62 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a  lback ) return;.
e900: 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
e910: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
e920: 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
e930: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
e940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e950: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
e960: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
e970: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
e980: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
e990: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
e9a0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
e9b0: 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  l = 1;.    if( p
e9c0: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
e9d0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
e9e0: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
e9f0: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
ea00: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
ea10: 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b    page_add_to_ck
ea20: 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  pt_list(pPg);.  
ea30: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 32 28 22    }.    TRACE2("
ea40: 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 25 64  DONT_ROLLBACK %d
ea50: 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
ea60: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
ea70: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20  r->ckptInUse && 
ea80: 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20  !pPg->inCkpt && 
ea90: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
eaa0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
eab0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
eac0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
ead0: 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
eae0: 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
eaf0: 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
eb00: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  t( pPager->aInCk
eb10: 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  pt!=0 );.    pPa
eb20: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67  ger->aInCkpt[pPg
eb30: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
eb40: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
eb50: 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63     page_add_to_c
eb60: 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  kpt_list(pPg);. 
eb70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d   }.}../*.** Comm
eb80: 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
eb90: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
eba0: 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
ebb0: 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
ebc0: 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
ebd0: 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
ebe0: 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
ebf0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
ec00: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
ec10: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
ec20: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
ec30: 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
ec40: 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
ec50: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ec60: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67  pager_commit(Pag
ec70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
ec80: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
ec90: 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
eca0: 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47  er->errMask==PAG
ecb0: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
ecc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
ecd0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
ece0: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
ecf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ed00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ed10: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
ed20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
ed30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
ed40: 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
ed50: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
ed60: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
ed70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
ed80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
ed90: 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te!=SQLITE_WRITE
eda0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
edb0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
edc0: 0a 20 20 7d 0a 20 20 54 52 41 43 45 31 28 22 43  .  }.  TRACE1("C
edd0: 4f 4d 4d 49 54 5c 6e 22 29 3b 0a 20 20 69 66 28  OMMIT\n");.  if(
ede0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
edf0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  le==0 ){.    /* 
ee00: 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68  Exit early (with
ee10: 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69  out doing the ti
ee20: 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c  me-consuming sql
ee30: 69 74 65 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  iteOsSync() call
ee40: 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
ee50: 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
ee60: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
ee70: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
ee80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ee90: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  ger->needSync==0
eea0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
eeb0: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
eec0: 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
eed0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
eee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
eef0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
ef00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
ef10: 6e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  n );.  if( pPage
ef20: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 26 26 20 73  r->needSync && s
ef30: 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61  qliteOsSync(&pPa
ef40: 67 65 72 2d 3e 6a 66 64 29 21 3d 53 51 4c 49 54  ger->jfd)!=SQLIT
ef50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
ef60: 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
ef70: 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
ef80: 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
ef90: 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
efa0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72  if( pPg ){.    r
efb0: 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
efc0: 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
efd0: 20 20 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70     if( rc || (!p
efe0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
eff0: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70   sqliteOsSync(&p
f000: 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49  Pager->fd)!=SQLI
f010: 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
f020: 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
f030: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
f040: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
f050: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
f060: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f070: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
f080: 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  c;..  /* Jump he
f090: 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  re if anything g
f0a0: 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67  oes wrong during
f0b0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
f0c0: 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74  ess..  */.commit
f0d0: 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73  _abort:.  rc = s
f0e0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
f0f0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ack(pPager);.  i
f100: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f110: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f120: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
f130: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f140: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
f150: 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
f160: 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
f170: 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20  ck to read-only 
f180: 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
f190: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
f1a0: 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
f1b0: 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
f1c0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
f1d0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
f1e0: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
f1f0: 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
f200: 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
f210: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
f220: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
f230: 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
f240: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
f250: 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  (SQLITE_PROTOCOL
f260: 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  ) or unless some
f270: 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
f280: 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
f290: 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
f2a0: 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
f2b0: 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
f2c0: 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
f2d0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
f2e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
f2f0: 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
f300: 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
f310: 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
f320: 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
f330: 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
f340: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
f350: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
f360: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
f370: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
f380: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
f390: 52 41 43 45 31 28 22 52 4f 4c 4c 42 41 43 4b 5c  RACE1("ROLLBACK\
f3a0: 6e 22 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  n");.  if( !pPag
f3b0: 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 7c 7c  er->dirtyFile ||
f3c0: 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
f3d0: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
f3e0: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
f3f0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
f400: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f410: 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
f420: 20 72 63 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65   rc;.  }..#if de
f430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
f440: 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  T) && !defined(N
f450: 44 45 42 55 47 29 0a 20 20 2f 2a 20 54 72 75 6e  DEBUG).  /* Trun
f460: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
f470: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 69 74 20   to the size it 
f480: 77 61 73 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  was at the concl
f490: 75 73 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  usion of the.  *
f4a0: 2a 20 6c 61 73 74 20 73 71 6c 69 74 65 4f 73 53  * last sqliteOsS
f4b0: 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 69  ync() call.  Thi
f4c0: 73 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 65  s is really an e
f4d0: 72 72 6f 72 20 63 68 65 63 6b 2e 20 20 49 66 20  rror check.  If 
f4e0: 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  the.  ** rollbac
f4f0: 6b 20 73 74 69 6c 6c 20 77 6f 72 6b 73 2c 20 69  k still works, i
f500: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
f510: 20 72 6f 6c 6c 62 61 63 6b 20 77 6f 75 6c 64 20   rollback would 
f520: 68 61 76 65 20 61 6c 73 6f 0a 20 20 2a 2a 20 77  have also.  ** w
f530: 6f 72 6b 65 64 20 69 66 20 69 74 20 68 61 64 20  orked if it had 
f540: 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 61  occurred after a
f550: 6e 20 4f 53 20 63 72 61 73 68 20 6f 72 20 75 6e  n OS crash or un
f560: 65 78 70 65 63 74 65 64 20 70 6f 77 65 72 0a 20  expected power. 
f570: 20 2a 2a 20 6c 6f 73 73 2e 0a 20 20 2a 2f 0a 20   ** loss..  */. 
f580: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
f590: 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
f5a0: 6d 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  m = JOURNAL_HDR_
f5b0: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
f5c0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
f5d0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
f5e0: 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
f5f0: 67 65 72 2d 3e 73 79 6e 63 4a 53 69 7a 65 3c 6d  ger->syncJSize<m
f600: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f610: 2d 3e 73 79 6e 63 4a 53 69 7a 65 20 3d 20 6d 3b  ->syncJSize = m;
f620: 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
f630: 32 28 22 54 52 55 4e 43 41 54 45 20 4a 4f 55 52  2("TRUNCATE JOUR
f640: 4e 41 4c 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61  NAL %lld\n", pPa
f650: 67 65 72 2d 3e 73 79 6e 63 4a 53 69 7a 65 29 3b  ger->syncJSize);
f660: 0a 20 20 20 20 72 63 20 3d 20 20 73 71 6c 69 74  .    rc =  sqlit
f670: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
f680: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
f690: 2d 3e 73 79 6e 63 4a 53 69 7a 65 29 3b 0a 20 20  ->syncJSize);.  
f6a0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
f6b0: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
f6c0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  ->nRec = 0;.  }.
f6d0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
f6e0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
f6f0: 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
f700: 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
f710: 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
f720: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51  Pager->state>=SQ
f730: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
f740: 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
f750: 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
f760: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
f770: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
f780: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
f790: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
f7a0: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
f7b0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
f7c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
f7d0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
f7e0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
f7f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f800: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
f810: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
f820: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
f830: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
f840: 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50  ORRUPT;.  }.  pP
f850: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
f860: 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
f870: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f880: 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
f890: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
f8a0: 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
f8b0: 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
f8c0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
f8d0: 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
f8e0: 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
f8f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 72 65  sqlitepager_isre
f900: 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
f910: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
f920: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
f930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f940: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
f950: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
f960: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
f970: 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 70 61 67  /.int *sqlitepag
f980: 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a  er_stats(Pager *
f990: 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
f9a0: 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b  c int a[9];.  a[
f9b0: 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
f9c0: 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
f9d0: 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
f9e0: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
f9f0: 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
fa00: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
fa10: 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
fa20: 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
fa30: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20  ager->errMask;. 
fa40: 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
fa50: 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
fa60: 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
fa70: 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
fa80: 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  Ovfl;.  return a
fa90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
faa0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a  he checkpoint..*
fab0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fac0: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
fad0: 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
fae0: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
faf0: 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
fb00: 20 20 41 20 6e 65 77 20 63 68 65 63 6b 70 6f 69    A new checkpoi
fb10: 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
fb20: 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
fb30: 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
fb40: 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
fb50: 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
fb60: 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
fb70: 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
fb80: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
fb90: 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e  pager_ckpt_begin
fba0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
fbb0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
fbc0: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
fbd0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
fbe0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
fbf0: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
fc00: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74   pPager->ckptAut
fc10: 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
fc20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fc30: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
fc40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
fc50: 65 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  en );.  assert( 
fc60: 21 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55  !pPager->ckptInU
fc70: 73 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  se );.  pPager->
fc80: 61 49 6e 43 6b 70 74 20 3d 20 73 71 6c 69 74 65  aInCkpt = sqlite
fc90: 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
fca0: 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
fcb0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
fcc0: 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nCkpt==0 ){.    
fcd0: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
fce0: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
fcf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
fd10: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
fd20: 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  = sqliteOsFileSi
fd30: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
fd40: 20 26 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53   &pPager->ckptJS
fd50: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
fd60: 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e   goto ckpt_begin
fd70: 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
fd80: 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  t( pPager->ckptJ
fd90: 53 69 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50 61  Size == .    pPa
fda0: 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41  ger->nRec*JOURNA
fdb0: 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
fdc0: 66 6f 72 6d 61 74 29 2b 4a 4f 55 52 4e 41 4c 5f  format)+JOURNAL_
fdd0: 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66  HDR_SZ(journal_f
fde0: 6f 72 6d 61 74 29 20 29 3b 0a 23 65 6e 64 69 66  ormat) );.#endif
fdf0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  .  pPager->ckptJ
fe00: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Size = pPager->n
fe10: 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
fe20: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
fe30: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
fe40: 20 20 20 20 20 20 20 20 20 20 20 2b 20 4a 4f 55             + JOU
fe50: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72  RNAL_HDR_SZ(jour
fe60: 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 70  nal_format);.  p
fe70: 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20  Pager->ckptSize 
fe80: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
fe90: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
fea0: 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >ckptOpen ){.   
feb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
fec0: 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
fed0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29  , &pPager->cpfd)
fee0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
fef0: 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66  oto ckpt_begin_f
ff00: 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
ff10: 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 31 3b  r->ckptOpen = 1;
ff20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
ff30: 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
ff40: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
ff50: 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
ff60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 63 6b   SQLITE_OK;. .ck
ff70: 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  pt_begin_failed:
ff80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
ff90: 49 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20 73 71  InCkpt ){.    sq
ffa0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
ffb0: 3e 61 49 6e 43 6b 70 74 29 3b 0a 20 20 20 20 70  >aInCkpt);.    p
ffc0: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d  Pager->aInCkpt =
ffd0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
ffe0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
fff0: 6d 6d 69 74 20 61 20 63 68 65 63 6b 70 6f 69 6e  mmit a checkpoin
10000 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10010 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69  pager_ckpt_commi
10020 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
10030 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
10040 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  ckptInUse ){.   
10050 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
10060 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  ext;.    sqliteO
10070 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63  sSeek(&pPager->c
10080 70 66 64 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  pfd, 0);.    /* 
10090 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65  sqliteOsTruncate
100a0 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
100b0 30 29 3b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  0); */.    pPage
100c0 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b  r->ckptNRec = 0;
100d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
100e0 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
100f0 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
10100 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 3b 0a 20  er->aInCkpt );. 
10110 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
10120 70 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  pt = 0;.    for(
10130 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 43 6b 70  pPg=pPager->pCkp
10140 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
10150 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
10160 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  = pPg->pNextCkpt
10170 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10180 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 3b 0a 20  pPg->inCkpt );. 
10190 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74       pPg->inCkpt
101a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
101b0 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70 50 67  >pPrevCkpt = pPg
101c0 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 30 3b  ->pNextCkpt = 0;
101d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
101e0 72 2d 3e 70 43 6b 70 74 20 3d 20 30 3b 0a 20 20  r->pCkpt = 0;.  
101f0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  }.  pPager->ckpt
10200 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
10210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
10230 61 63 6b 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  ack a checkpoint
10240 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
10250 61 67 65 72 5f 63 6b 70 74 5f 72 6f 6c 6c 62 61  ager_ckpt_rollba
10260 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
10270 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
10280 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
10290 6e 55 73 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  nUse ){.    rc =
102a0 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79   pager_ckpt_play
102b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
102c0 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b    sqlitepager_ck
102d0 70 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72  pt_commit(pPager
102e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
102f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10300 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b    }.  pPager->ck
10310 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  ptAutoopen = 0;.
10320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10330 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
10340 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  ST./*.** Print a
10350 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
10360 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
10370 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
10380 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
10390 6c 69 74 65 70 61 67 65 72 5f 72 65 66 64 75 6d  litepager_refdum
103a0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
103b0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
103c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
103d0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
103e0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
103f0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
10400 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
10410 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 41  ;.    printf("PA
10420 47 45 20 25 33 64 20 61 64 64 72 3d 30 78 25 30  GE %3d addr=0x%0
10430 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  8x nRef=%d\n", .
10440 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
10450 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f  , (int)PGHDR_TO_
10460 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
10470 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
10480 64 69 66 0a                                      dif.