/ Hex Artifact Content
Login

Artifact 6c50e8dc861bb08f8c52b1fe9aabef6554d61c95:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 38 35  : pager.c,v 1.85
0350: 20 32 30 30 33 2f 30 36 2f 31 34 20 31 31 3a 34   2003/06/14 11:4
0360: 32 3a 35 38 20 64 72 68 20 45 78 70 20 24 0a 2a  2:58 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
10b0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
10e0: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
10f0: 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   */.  /* SQLITE_
1100: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
1110: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1120: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1130: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1140: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1150: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1160: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1170: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
1180: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1190: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
11a0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
11b0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
11c0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
11d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
11e0: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
11f0: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
1200: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
1210: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
1220: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
1230: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
1240: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
1250: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1260: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f  E_PAGE_SIZE])../
1270: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1280: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1290: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
12a0: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
12b0: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
12c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
12d0: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
12e0: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
12f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1300: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1310: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1320: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1330: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1340: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1350: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1360: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1370: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1380: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1390: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
13a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
13d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
13f0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1400: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1420: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1430: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
1440: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
1450: 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20 20 20  File cpfd;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1480: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1490: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
14a0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
14b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14c0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14d0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
14e0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1500: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1510: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1520: 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20    int ckptSize; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1550: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1560: 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  ckpt_begin() */.
1570: 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a    off_t ckptJSiz
1580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1590: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
15a0: 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29   at ckpt_begin()
15b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15e0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
15f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1600: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1620: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
1630: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
1640: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
1650: 69 6e 74 20 63 6b 70 74 4e 52 65 63 3b 20 20 20  int ckptNRec;   
1660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1670: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
1680: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
1690: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
16a0: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
16d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
16e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
16f0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
1700: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61  r)(void*); /* Ca
1710: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1720: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1730: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  es */.  int nPag
1740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1750: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1760: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
1770: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1780: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17a0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
17b0: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
17c0: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
17d0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
17e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
17f0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
1800: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
1810: 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69  che */.  int nHi
1820: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
1830: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
1840: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
1850: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
1860: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
1870: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1880: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
1890: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18a0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
18b0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
18c0: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
18d0: 20 54 72 75 65 20 69 66 20 69 6e 69 74 69 61 6c   True if initial
18e0: 20 6d 61 67 69 63 20 6f 66 20 6a 6f 75 72 6e 61   magic of journa
18f0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
1900: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 44 6f 20 6e 6f 74 20 75 73 65 20 61 20 72 6f 6c  Do not use a rol
1930: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
1940: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1950: 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20  u8 ckptOpen;    
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1970: 72 75 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  rue if the check
1980: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  point journal is
1990: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b   open */.  u8 ck
19a0: 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  ptInUse;        
19b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
19c0: 65 20 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b  e are in a check
19d0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 63 6b  point */.  u8 ck
19e0: 70 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  ptAutoopen;     
19f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
1a00: 6b 70 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  kpt journal when
1a10: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
1a20: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
1a30: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
1a40: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a50: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
1a60: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
1a70: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1a90: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
1aa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1ab0: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
1ac0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f  SQLITE_UNLOCK, _
1af0: 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49  READLOCK or _WRI
1b00: 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65  TELOCK */.  u8 e
1b10: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
1b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
1b50: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1b70: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
1b80: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
1b90: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
1bc0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1bd0: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
1c00: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
1c10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c20: 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b  .  u8 dirtyFile;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62 61  * True if databa
1c50: 73 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  se file has chan
1c60: 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a  ged in any way *
1c70: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c80: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c90: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1ca0: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  rollback() for a
1cb0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1cc0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
1cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1ce0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
1cf0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1d00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
1d10: 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20  *aInCkpt;       
1d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1d30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
1d40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1d50: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  e */.  PgHdr *pF
1d60: 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20  irst, *pLast;   
1d70: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1d80: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
1d90: 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65  Hdr *pFirstSynce
1da0: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d;        /* Fir
1db0: 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74  st free page wit
1dc0: 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  h PgHdr.needSync
1dd0: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
1de0: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
1df0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e00: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
1e10: 67 48 64 72 20 2a 70 43 6b 70 74 3b 20 20 20 20  gHdr *pCkpt;    
1e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1e30: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
1e40: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
1e50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
1e60: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
1e70: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
1e80: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
1e90: 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72   number of PgHdr
1ea0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1eb0: 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61  ese are bits tha
1ec0: 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20  t can be set in 
1ed0: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a  Pager.errMask..*
1ee0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1ef0: 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30  ERR_FULL     0x0
1f00: 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20  1  /* a write() 
1f10: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
1f20: 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20  e PAGER_ERR_MEM 
1f30: 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61       0x02  /* ma
1f40: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f  lloc() failed */
1f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1f60: 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34  RR_LOCK     0x04
1f70: 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68    /* error in th
1f80: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
1f90: 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ol */.#define PA
1fa0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
1fb0: 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61   0x08  /* databa
1fc0: 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f  se or journal co
1fd0: 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  rruption */.#def
1fe0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49  ine PAGER_ERR_DI
1ff0: 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20  SK     0x10  /* 
2000: 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f  general disk I/O
2010: 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72   error - bad har
2020: 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a  d drive? */../*.
2030: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
2040: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67  ile contains pag
2050: 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
2060: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f   following.** fo
2070: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75  rmat..**.** Actu
2080: 61 6c 6c 79 2c 20 74 68 69 73 20 73 74 72 75 63  ally, this struc
2090: 74 75 72 65 20 69 73 20 74 68 65 20 63 6f 6d 70  ture is the comp
20a0: 6c 65 74 65 20 70 61 67 65 20 72 65 63 6f 72 64  lete page record
20b0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66 6f   for pager.** fo
20c0: 72 6d 61 74 73 20 6c 65 73 73 20 74 68 61 6e 20  rmats less than 
20d0: 33 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20 77 69  3.  Beginning wi
20e0: 74 68 20 66 6f 72 6d 61 74 20 33 2c 20 74 68 69  th format 3, thi
20f0: 73 20 72 65 63 6f 72 64 20 69 73 20 73 75 72 72  s record is surr
2100: 6f 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77 6f  ounded.** by two
2110: 20 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74   checksums..*/.t
2120: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
2130: 67 65 52 65 63 6f 72 64 20 50 61 67 65 52 65 63  geRecord PageRec
2140: 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65  ord;.struct Page
2150: 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20  Record {.  Pgno 
2160: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2180: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2190: 20 20 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c    char aData[SQL
21a0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20  ITE_PAGE_SIZE]; 
21b0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74   /* Original dat
21c0: 61 20 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20  a for page pgno 
21d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  */.};../*.** Jou
21e0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
21f0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
2200: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
2210: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
2220: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2230: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
2240: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
2250: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
2260: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2270: 65 20 74 68 72 65 65 20 6a 6f 75 72 6e 61 6c 20  e three journal 
2280: 66 6f 72 6d 61 74 73 20 28 73 6f 20 66 61 72 29  formats (so far)
2290: 2e 20 54 68 65 20 31 73 74 20 6a 6f 75 72 6e 61  . The 1st journa
22a0: 6c 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a  l format writes.
22b0: 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ** 32-bit intege
22c0: 72 73 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f  rs in the byte-o
22d0: 72 64 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74  rder of the host
22e0: 20 6d 61 63 68 69 6e 65 2e 20 20 4e 65 77 0a 2a   machine.  New.*
22f0: 2a 20 66 6f 72 6d 61 74 73 20 77 72 69 74 65 73  * formats writes
2300: 20 69 6e 74 65 67 65 72 73 20 61 73 20 62 69 67   integers as big
2310: 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65  -endian.  All ne
2320: 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74  w journals use t
2330: 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74  he.** new format
2340: 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 74 6f  , but we have to
2350: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64   be able to read
2360: 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61   an older journa
2370: 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  l in order.** to
2380: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2390: 6c 73 20 63 72 65 61 74 65 64 20 62 79 20 6f 6c  ls created by ol
23a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
23b0: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a  the library..**.
23c0: 2a 2a 20 54 68 65 20 33 72 64 20 6a 6f 75 72 6e  ** The 3rd journ
23d0: 61 6c 20 66 6f 72 6d 61 74 20 28 61 64 64 65 64  al format (added
23e0: 20 66 6f 72 20 32 2e 38 2e 30 29 20 61 64 64 73   for 2.8.0) adds
23f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
2400: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
2410: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2420: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
2430: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
2440: 68 69 6c 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  hile the.** jour
2450: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
2460: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
2470: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
2480: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 0a 2a  ight appear in.*
2490: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
24a0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
24b0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
24c0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
24d0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
24e0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
24f0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2500: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
2510: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
2520: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
2530: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
2540: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
2550: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
2560: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
2570: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
2580: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
2590: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
25a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
25b0: 68 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66  he 3rd journal f
25c0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
25d0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
25e0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
25f0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
2600: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
2610: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
2620: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
2630: 65 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e SQLITE_PAGE_SI
2640: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
2650: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
2660: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
2670: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
2680: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
2690: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
26a0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
26b0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
26c0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
26d0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
26e0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
26f0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
2700: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
2710: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2720: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
2730: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
2740: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
2750: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
2760: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
2770: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
2780: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
2790: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
27a0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
27b0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
27c0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
27d0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
27e0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
27f0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
2800: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
2810: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
2820: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
2830: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
2840: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
2850: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2860: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
2870: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 5b 5d 20 3d  ournalMagic1[] =
2880: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
2890: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
28a0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
28b0: 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63  xd4,.};.static c
28c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
28d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
28e0: 32 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  2[] = {.  0xd9, 
28f0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
2900: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
2910: 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 73 74 61  63, 0xd5,.};.sta
2920: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
2930: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
2940: 4d 61 67 69 63 33 5b 5d 20 3d 20 7b 0a 20 20 30  Magic3[] = {.  0
2950: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
2960: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
2970: 31 2c 20 30 78 36 33 2c 20 30 78 64 36 2c 0a 7d  1, 0x63, 0xd6,.}
2980: 3b 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  ;.#define JOURNA
2990: 4c 5f 46 4f 52 4d 41 54 5f 31 20 31 0a 23 64 65  L_FORMAT_1 1.#de
29a0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  fine JOURNAL_FOR
29b0: 4d 41 54 5f 32 20 32 0a 23 64 65 66 69 6e 65 20  MAT_2 2.#define 
29c0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33  JOURNAL_FORMAT_3
29d0: 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   3../*.** The fo
29e0: 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20  llowing integer 
29f0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 61 74 20  determines what 
2a00: 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 77 68  format to use wh
2a10: 65 6e 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20 6e  en creating.** n
2a20: 65 77 20 70 72 69 6d 61 72 79 20 6a 6f 75 72 6e  ew primary journ
2a30: 61 6c 20 66 69 6c 65 73 2e 20 20 42 79 20 64 65  al files.  By de
2a40: 66 61 75 6c 74 20 77 65 20 61 6c 77 61 79 73 20  fault we always 
2a50: 75 73 65 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a  use format 3..**
2a60: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 77   When testing, w
2a70: 65 20 63 61 6e 20 73 65 74 20 74 68 69 73 20 76  e can set this v
2a80: 61 6c 75 65 20 74 6f 20 6f 6c 64 65 72 20 6a 6f  alue to older jo
2a90: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 69 6e  urnal formats in
2aa0: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b   order to.** mak
2ab0: 65 20 73 75 72 65 20 74 68 61 74 20 6e 65 77 65  e sure that newe
2ac0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  r versions of th
2ad0: 65 20 6c 69 62 72 61 72 79 20 61 72 65 20 61 62  e library are ab
2ae0: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  le to rollback o
2af0: 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  lder.** journal 
2b00: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  files..**.** Not
2b10: 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e  e that checkpoin
2b20: 74 20 6a 6f 75 72 6e 61 6c 73 20 61 6c 77 61 79  t journals alway
2b30: 73 20 75 73 65 20 66 6f 72 6d 61 74 20 32 20 61  s use format 2 a
2b40: 6e 64 20 6f 6d 69 74 20 74 68 65 20 68 65 61 64  nd omit the head
2b50: 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  er..*/.#ifdef SQ
2b60: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 6a 6f  LITE_TEST.int jo
2b70: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d 20 33  urnal_format = 3
2b80: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2b90: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20   journal_format 
2ba0: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
2bb0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
2bc0: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
2bd0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
2be0: 6f 75 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63  ournal varies ac
2bf0: 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68  cording.** to wh
2c00: 69 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ich journal form
2c10: 61 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  at is being used
2c20: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2c30: 20 6d 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f   macros figure o
2c40: 75 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20  ut.** the sizes 
2c50: 62 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20  based on format 
2c60: 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66  numbers..*/.#def
2c70: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
2c80: 53 5a 28 58 29 20 5c 0a 20 20 20 28 73 69 7a 65  SZ(X) \.   (size
2c90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2ca0: 31 29 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f  1) + sizeof(Pgno
2cb0: 29 20 2b 20 28 28 58 29 3e 3d 33 29 2a 32 2a 73  ) + ((X)>=3)*2*s
2cc0: 69 7a 65 6f 66 28 75 33 32 29 29 0a 23 64 65 66  izeof(u32)).#def
2cd0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
2ce0: 5a 28 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54  Z(X) \.   (SQLIT
2cf0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69  E_PAGE_SIZE + si
2d00: 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58  zeof(Pgno) + ((X
2d10: 29 3e 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32  )>=3)*sizeof(u32
2d20: 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  ))../*.** Enable
2d30: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2d40: 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a   tracking here:.
2d50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2d60: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
2d70: 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  r_refinfo_enable
2d80: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
2d90: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
2da0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
2db0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
2dc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
2dd0: 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  ger_refinfo_enab
2de0: 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  le ) return;.   
2df0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20   printf(.       
2e00: 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64  "REFCNT: %4d add
2e10: 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
2e20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
2e30: 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f  gno, (int)PGHDR_
2e40: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
2e50: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
2e60: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
2e70: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
2e80: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
2e90: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
2ea0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
2eb0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
2ec0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
2ed0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
2ee0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
2ef0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
2f00: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
2f10: 69 70 74 6f 72 0a 2a 2f 0a 73 74 61 74 69 63 20  iptor.*/.static 
2f20: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 69  int read32bits(i
2f30: 6e 74 20 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c  nt format, OsFil
2f40: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
2f50: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
2f60: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
2f70: 71 6c 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20  qliteOsRead(fd, 
2f80: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
2f90: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
2fa0: 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61  LITE_OK && forma
2fb0: 74 3e 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  t>JOURNAL_FORMAT
2fc0: 5f 31 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  _1 ){.    unsign
2fd0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
2fe0: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
2ff0: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
3000: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
3010: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
3020: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
3030: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
3040: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
3050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3060: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3070: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
3080: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3090: 2e 20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73  .  Writing.** is
30a0: 20 61 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69   always done usi
30b0: 6e 67 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  ng the new journ
30c0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74  al format..*/.st
30d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
30e0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
30f0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
3100: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
3110: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
3120: 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20  format<=1 ){.   
3130: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73   return sqliteOs
3140: 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20  Write(fd, &val, 
3150: 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20  4);.  }.  ac[0] 
3160: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3170: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
3180: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
3190: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
31a0: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
31b0: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
31c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
31d0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
31e0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  4);.}../*.** Wri
31f0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
3200: 67 65 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20  ger into a page 
3210: 68 65 61 64 65 72 20 72 69 67 68 74 20 62 65 66  header right bef
3220: 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ore the.** page 
3230: 64 61 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c  data.  This will
3240: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 50   overwrite the P
3250: 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
3260: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
3270: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
3280: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
3290: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
32a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32b0: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 63  *ac;.  ac = &((c
32c0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
32d0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
32e0: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
32f0: 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 6d  rmat<=1 ){.    m
3300: 65 6d 63 70 79 28 61 63 2c 20 26 76 61 6c 2c 20  emcpy(ac, &val, 
3310: 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
3320: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
3330: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  4) & 0xff;.    a
3340: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
3350: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b   & 0xff;.    ac[
3360: 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20  2] = (val>>8) & 
3370: 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 33 5d 20  0xff;.    ac[3] 
3380: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3390: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  }.}.../*.** Conv
33a0: 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  ert the bits in 
33b0: 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  the pPager->errM
33c0: 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ask into an appr
33d0: 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e  oprate.** return
33e0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
33f0: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f   int pager_errco
3400: 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
3410: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3420: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
3430: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3440: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3450: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
3460: 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28  _PROTOCOL;.  if(
3470: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3480: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53   & PAGER_ERR_DIS
3490: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
34a0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20  TE_IOERR;.  if( 
34b0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
34c0: 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  & PAGER_ERR_FULL
34d0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
34e0: 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50  E_FULL;.  if( pP
34f0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3500: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20  PAGER_ERR_MEM ) 
3510: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3520: 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61  NOMEM;.  if( pPa
3530: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3540: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3550: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
3560: 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e  ORRUPT;.  return
3570: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
3580: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
3590: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
35a0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
35b0: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
35c0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
35d0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
35e0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
35f0: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
3600: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
3610: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
3620: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
3630: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
3640: 20 74 68 65 20 73 71 6c 69 74 65 70 61 67 65 72   the sqlitepager
3650: 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _ckpt_commit().*
3660: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
3670: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
3680: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
3690: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
36a0: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
36b0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
36c0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
36d0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
36e0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
36f0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63  id page_add_to_c
3700: 6b 70 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  kpt_list(PgHdr *
3710: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
3720: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
3730: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
3740: 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b  inCkpt ) return;
3750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
3760: 70 50 72 65 76 43 6b 70 74 3d 3d 30 20 26 26 20  pPrevCkpt==0 && 
3770: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d  pPg->pNextCkpt==
3780: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
3790: 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20 69 66 28  vCkpt = 0;.  if(
37a0: 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 29   pPager->pCkpt )
37b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43  {.    pPager->pC
37c0: 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d  kpt->pPrevCkpt =
37d0: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
37e0: 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 61  >pNextCkpt = pPa
37f0: 67 65 72 2d 3e 70 43 6b 70 74 3b 0a 20 20 70 50  ger->pCkpt;.  pP
3800: 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50  ager->pCkpt = pP
3810: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74  g;.  pPg->inCkpt
3820: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
3830: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
3840: 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 50  from_ckpt_list(P
3850: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
3860: 28 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29  ( !pPg->inCkpt )
3870: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3880: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 29 7b  Pg->pPrevCkpt ){
3890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
38a0: 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65  ->pPrevCkpt->pNe
38b0: 78 74 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  xtCkpt==pPg );. 
38c0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70     pPg->pPrevCkp
38d0: 74 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70  t->pNextCkpt = p
38e0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20  Pg->pNextCkpt;. 
38f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3900: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
3910: 3e 70 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  >pCkpt==pPg );. 
3920: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
3930: 70 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pCkpt = pPg->pNe
3940: 78 74 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 69 66  xtCkpt;.  }.  if
3950: 28 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  ( pPg->pNextCkpt
3960: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3970: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e  pPg->pNextCkpt->
3980: 70 50 72 65 76 43 6b 70 74 3d 3d 70 50 67 20 29  pPrevCkpt==pPg )
3990: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
39a0: 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20  Ckpt->pPrevCkpt 
39b0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74  = pPg->pPrevCkpt
39c0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
39d0: 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50  xtCkpt = 0;.  pP
39e0: 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30  g->pPrevCkpt = 0
39f0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20  ;.  pPg->inCkpt 
3a00: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
3a10: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
3a20: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
3a30: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
3a40: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
3a50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3a60: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
3a70: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
3a80: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
3a90: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
3aa0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
3ab0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
3ac0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
3ad0: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
3ae0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
3af0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
3b00: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
3b10: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
3b20: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
3b30: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
3b40: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
3b50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
3b60: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
3b70: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
3b80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
3b90: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
3ba0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
3bb0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
3bc0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
3bd0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
3be0: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
3bf0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
3c00: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
3c10: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
3c20: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
3c30: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
3c40: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
3c50: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
3c60: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
3c70: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
3c80: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
3c90: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
3ca0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3cb0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
3cc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
3cd0: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
3ce0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
3cf0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
3d00: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
3d10: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
3d20: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
3d30: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
3d40: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
3d50: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
3d60: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
3d70: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
3d80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
3d90: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
3da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61   ){.    sqlitepa
3db0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
3dc0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
3dd0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
3de0: 65 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65  er->fd);.  pPage
3df0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
3e00: 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  E_UNLOCK;.  pPag
3e10: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
3e20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
3e30: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
3e40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
3e50: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
3e60: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
3e70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
3e80: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
3e90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
3ea0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74  en and.** a writ
3eb0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
3ec0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
3ed0: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74  utine releases t
3ee0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77  he database.** w
3ef0: 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  rite lock and ac
3f00: 71 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f  quires a read lo
3f10: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
3f20: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
3f30: 6c 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64  le.** is deleted
3f40: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a   and closed..*/.
3f50: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
3f60: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
3f70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3f80: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
3f90: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
3fa0: 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f  r->state<SQLITE_
3fb0: 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75  WRITELOCK ) retu
3fc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3fd0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
3fe0: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
3ff0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
4000: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  kptOpen ){.    s
4010: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
4020: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
4030: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
4040: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
4050: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4060: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
4070: 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  teOsClose(&pPage
4080: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
4090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
40a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
40b0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
40c0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
40d0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
40e0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
40f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
4100: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
4110: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
4120: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
4130: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
4140: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
4150: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
4160: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
4170: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
4180: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
41a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
41b0: 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  tyFile==0 || pPa
41c0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
41d0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  =0 );.  }.  rc =
41e0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
41f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
4200: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
4220: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
4230: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65  E_READLOCK;.  }e
4240: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
4250: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
4260: 20 69 66 20 61 20 70 72 6f 63 65 73 73 20 64 6f   if a process do
4270: 65 73 20 61 20 42 45 47 49 4e 2c 20 74 68 65 6e  es a BEGIN, then
4280: 20 66 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a 20   forks and the. 
4290: 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63     ** child proc
42a0: 65 73 73 20 64 6f 65 73 20 74 68 65 20 43 4f 4d  ess does the COM
42b0: 4d 49 54 2e 20 20 42 65 63 61 75 73 65 20 6f 66  MIT.  Because of
42c0: 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
42d0: 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69  f unix.    ** fi
42e0: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20  le locking, the 
42f0: 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c  unlock will fail
4300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
4310: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
4320: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  ITE_UNLOCK;.  }.
4330: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4340: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
4350: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
4360: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
4370: 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61   of data..*/.sta
4380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
4390: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
43a0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
43b0: 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29  nst char *aData)
43c0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
43d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
43e0: 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75  t + pgno;.  retu
43f0: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
4410: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
4420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
4430: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
4440: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
4450: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
4460: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
4470: 72 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66  re are three dif
4480: 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  ferent journal f
4490: 6f 72 6d 61 74 73 2e 20 20 54 68 65 20 66 6f 72  ormats.  The for
44a0: 6d 61 74 20 70 61 72 61 6d 65 74 65 72 20 64 65  mat parameter de
44b0: 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 69 63  termines.** whic
44c0: 68 20 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64  h format is used
44d0: 20 62 79 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   by the journal 
44e0: 74 68 61 74 20 69 73 20 70 6c 61 79 65 64 20 62  that is played b
44f0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
4500: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
4510: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
4520: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
4530: 20 2a 6a 66 64 2c 20 69 6e 74 20 66 6f 72 6d 61   *jfd, int forma
4540: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
4550: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
4560: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
4570: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
4580: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
4590: 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b  ageRecord pgRec;
45a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 0a 20  .  u32 cksum;.. 
45b0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
45c0: 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 70  (format, jfd, &p
45d0: 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66  gRec.pgno);.  if
45e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
45f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
4600: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
4610: 28 6a 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61  (jfd, &pgRec.aDa
4620: 74 61 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63  ta, sizeof(pgRec
4630: 2e 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20  .aData));.  if( 
4640: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
4650: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
4660: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
4670: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
4680: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
4690: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
46a0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
46b0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
46c0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
46d0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
46e0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
46f0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
4700: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
4710: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
4720: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
4730: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
4740: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
4750: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
4760: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
4770: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
4780: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
4790: 28 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20  ( pgRec.pgno==0 
47a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
47b0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
47c0: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e   if( pgRec.pgno>
47d0: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
47e0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
47f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4800: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f 72 6d  ;.  }.  if( form
4810: 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  at>=JOURNAL_FORM
4820: 41 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20 3d  AT_3 ){.    rc =
4830: 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d   read32bits(form
4840: 61 74 2c 20 6a 66 64 2c 20 26 63 6b 73 75 6d 29  at, jfd, &cksum)
4850: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
4860: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
4870: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
4880: 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f  ager, pgRec.pgno
4890: 2c 20 70 67 52 65 63 2e 61 44 61 74 61 29 21 3d  , pgRec.aData)!=
48a0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
48b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
48c0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
48d0: 2f 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  /* Playback the 
48e0: 70 61 67 65 2e 20 20 55 70 64 61 74 65 20 74 68  page.  Update th
48f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79  e in-memory copy
4900: 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a   of the page.  *
4910: 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  * at the same ti
4920: 6d 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  me, if there is 
4930: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  one..  */.  pPg 
4940: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
4950: 50 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e  Pager, pgRec.pgn
4960: 6f 29 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c  o);.  TRACE2("PL
4970: 41 59 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 67  AYBACK %d\n", pg
4980: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 73 71 6c  Rec.pgno);.  sql
4990: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
49a0: 72 2d 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67  r->fd, (pgRec.pg
49b0: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
49c0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
49d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
49e0: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
49f0: 2c 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53  , pgRec.aData, S
4a00: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
4a10: 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
4a20: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
4a30: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 6d  ==0 ||.        m
4a40: 65 6d 63 6d 70 28 50 47 48 44 52 5f 54 4f 5f 44  emcmp(PGHDR_TO_D
4a50: 41 54 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e  ATA(pPg), pgRec.
4a60: 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  aData, SQLITE_PA
4a70: 47 45 5f 53 49 5a 45 29 3d 3d 30 0a 20 20 20 20  GE_SIZE)==0.    
4a80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
4a90: 6f 74 20 75 70 64 61 74 65 20 74 68 65 20 64 61  ot update the da
4aa0: 74 61 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ta on this page 
4ab0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  if the page is i
4ac0: 6e 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 61  n use.      ** a
4ad0: 6e 64 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nd the page has 
4ae0: 6e 65 76 65 72 20 62 65 65 6e 20 6d 6f 64 69 66  never been modif
4af0: 69 65 64 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ied.  This avoid
4b00: 73 20 72 65 73 65 74 74 69 6e 67 0a 20 20 20 20  s resetting.    
4b10: 20 20 2a 2a 20 74 68 65 20 22 65 78 74 72 61 22    ** the "extra"
4b20: 20 64 61 74 61 2e 20 20 54 68 61 74 20 69 6e 20   data.  That in 
4b30: 74 75 72 6e 20 61 76 6f 69 64 73 20 69 6e 76 61  turn avoids inva
4b40: 6c 69 64 61 74 69 6e 67 20 42 54 72 65 65 20 63  lidating BTree c
4b50: 75 72 73 6f 72 73 0a 20 20 20 20 20 20 2a 2a 20  ursors.      ** 
4b60: 69 6e 20 74 72 65 65 73 20 74 68 61 74 20 68 61  in trees that ha
4b70: 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 6d 6f  ve never been mo
4b80: 64 69 66 69 65 64 2e 20 20 54 68 65 20 65 6e 64  dified.  The end
4b90: 20 72 65 73 75 6c 74 20 69 73 20 74 68 61 74 0a   result is that.
4ba0: 20 20 20 20 20 20 2a 2a 20 79 6f 75 20 63 61 6e        ** you can
4bb0: 20 68 61 76 65 20 61 20 53 45 4c 45 43 54 20 67   have a SELECT g
4bc0: 6f 69 6e 67 20 6f 6e 20 69 6e 20 6f 6e 65 20 74  oing on in one t
4bd0: 61 62 6c 65 20 61 6e 64 20 52 4f 4c 4c 42 41 43  able and ROLLBAC
4be0: 4b 20 63 68 61 6e 67 65 73 0a 20 20 20 20 20 20  K changes.      
4bf0: 2a 2a 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ** to a differen
4c00: 74 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  t table and the 
4c10: 53 45 4c 45 43 54 20 69 73 20 75 6e 61 66 66 65  SELECT is unaffe
4c20: 63 74 65 64 20 62 79 20 74 68 65 20 52 4f 4c 4c  cted by the ROLL
4c30: 42 41 43 4b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  BACK..      */. 
4c40: 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
4c50: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
4c60: 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c  pgRec.aData, SQL
4c70: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
4c80: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
4c90: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
4ca0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
4cb0: 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
4cc0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
4cd0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
4ce0: 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
4cf0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4d00: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
4d10: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
4d20: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
4d30: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
4d40: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
4d50: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
4d60: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
4d70: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
4d80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
4d90: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
4da0: 77 73 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e  ws:  There is an
4db0: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66 69 6c 65   initial.** file
4dc0: 2d 74 79 70 65 20 73 74 72 69 6e 67 20 66 6f 72  -type string for
4dd0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4de0: 2e 20 20 54 68 65 6e 20 74 68 65 72 65 20 69 73  .  Then there is
4df0: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 50 67 6e   a single.** Pgn
4e00: 6f 20 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69  o number which i
4e10: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
4e20: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
4e30: 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
4e40: 63 68 61 6e 67 65 73 20 77 65 72 65 20 6d 61 64  changes were mad
4e50: 65 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  e.  The database
4e60: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
4e70: 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a 2a 20 4e   this size..** N
4e80: 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f 20 6f 72  ext come zero or
4e90: 20 6d 6f 72 65 20 70 61 67 65 20 72 65 63 6f 72   more page recor
4ea0: 64 73 20 77 68 65 72 65 20 65 61 63 68 20 70 61  ds where each pa
4eb0: 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20 63 6f 6e  ge record.** con
4ec0: 73 69 73 74 73 20 6f 66 20 61 20 50 67 6e 6f 20  sists of a Pgno 
4ed0: 61 6e 64 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  and SQLITE_PAGE_
4ee0: 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61  SIZE bytes of da
4ef0: 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  ta.  See.** the 
4f00: 50 61 67 65 52 65 63 6f 72 64 20 73 74 72 75 63  PageRecord struc
4f10: 74 75 72 65 20 66 6f 72 20 64 65 74 61 69 6c 73  ture for details
4f20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
4f30: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
4f40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
4f50: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
4f60: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
4f70: 69 6c 65 20 28 61 73 20 64 65 74 65 72 6d 69 6e  ile (as determin
4f80: 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
4f90: 20 74 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   the magic numbe
4fa0: 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
4fb0: 6e 6e 69 6e 67 29 20 74 68 65 6e 20 74 68 69 73  nning) then this
4fc0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4fd0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
4fe0: 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 74 68 65  ..** If any othe
4ff0: 72 20 65 72 72 6f 72 73 20 6f 63 63 75 72 20 64  r errors occur d
5000: 75 72 69 6e 67 20 70 6c 61 79 62 61 63 6b 2c 20  uring playback, 
5010: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
5020: 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20 62 65 20 63  l.** likely be c
5030: 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65  orrupted, so the
5040: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
5050: 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  PT bit is set in
5060: 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  .** pPager->errM
5070: 61 73 6b 20 61 6e 64 20 53 51 4c 49 54 45 5f 43  ask and SQLITE_C
5080: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
5090: 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 0a 2a  ed.  If it all.*
50a0: 2a 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68  * works, then th
50b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
50c0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
50d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
50e0: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
50f0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75 73   *pPager, int us
5100: 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a 20  eJournalSize){. 
5110: 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20   off_t szJ;     
5120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
5130: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
5140: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
5150: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5170: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
5180: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
5190: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
51c0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
51d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
51e0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
51f0: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
5200: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 6d  es */.  int form
5210: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
5220: 20 2f 2a 20 46 6f 72 6d 61 74 20 6f 66 20 74 68   /* Format of th
5230: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
5240: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5250: 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66  ar aMagic[sizeof
5260: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29  (aJournalMagic1)
5270: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
5280: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
5290: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
52a0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
52b0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
52c0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
52d0: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
52e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
52f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
5300: 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65   );.  sqliteOsSe
5310: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
5320: 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
5330: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
5340: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
5350: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5360: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
5370: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
5380: 20 20 7d 0a 20 20 69 66 28 20 73 7a 4a 20 3c 20    }.  if( szJ < 
5390: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b 73  sizeof(aMagic)+s
53a0: 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a 20  izeof(Pgno) ){. 
53b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
53c0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
53d0: 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69  Read the beginni
53e0: 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
53f0: 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 74  l and truncate t
5400: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
5410: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
5420: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
5430: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
5440: 69 74 65 4f 73 52 65 61 64 28 26 70 50 61 67 65  iteOsRead(&pPage
5450: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
5460: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b  sizeof(aMagic));
5470: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5480: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
5490: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
54a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
54b0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69  layback;.  }.  i
54c0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
54d0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33  , aJournalMagic3
54e0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
54f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d  )==0 ){.    form
5500: 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  at = JOURNAL_FOR
5510: 4d 41 54 5f 33 3b 0a 20 20 7d 65 6c 73 65 20 69  MAT_3;.  }else i
5520: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
5530: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32  , aJournalMagic2
5540: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
5550: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d  )==0 ){.    form
5560: 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  at = JOURNAL_FOR
5570: 4d 41 54 5f 32 3b 0a 20 20 7d 65 6c 73 65 20 69  MAT_2;.  }else i
5580: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
5590: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  , aJournalMagic1
55a0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
55b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d  )==0 ){.    form
55c0: 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  at = JOURNAL_FOR
55d0: 4d 41 54 5f 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  MAT_1;.  }else{.
55e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
55f0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f  PROTOCOL;.    go
5600: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
5610: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f 72 6d 61  .  }.  if( forma
5620: 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t>=JOURNAL_FORMA
5630: 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  T_3 ){.    rc = 
5640: 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61  read32bits(forma
5650: 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  t, &pPager->jfd,
5660: 20 26 6e 52 65 63 29 3b 0a 20 20 20 20 69 66 28   &nRec);.    if(
5670: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
5680: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 72 63 20  layback;.    rc 
5690: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
56a0: 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  mat, &pPager->jf
56b0: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  d, &pPager->cksu
56c0: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  mInit);.    if( 
56d0: 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  rc ) goto end_pl
56e0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 69 66 28 20  ayback;.    if( 
56f0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
5700: 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69   || useJournalSi
5710: 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ze ){.      nRec
5720: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
5730: 4c 5f 48 44 52 5f 53 5a 28 33 29 29 2f 4a 4f 55  L_HDR_SZ(3))/JOU
5740: 52 4e 41 4c 5f 50 47 5f 53 5a 28 33 29 3b 0a 20  RNAL_PG_SZ(3);. 
5750: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5760: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
5770: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32  JOURNAL_HDR_SZ(2
5780: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
5790: 28 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (2);.    assert(
57a0: 20 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47   nRec*JOURNAL_PG
57b0: 5f 53 5a 28 32 29 2b 4a 4f 55 52 4e 41 4c 5f 48  _SZ(2)+JOURNAL_H
57c0: 44 52 5f 53 5a 28 32 29 3d 3d 73 7a 4a 20 29 3b  DR_SZ(2)==szJ );
57d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 61 64  .  }.  rc = read
57e0: 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26  32bits(format, &
57f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78  pPager->jfd, &mx
5800: 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Pg);.  if( rc!=S
5810: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5820: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
5830: 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
5840: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
5850: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
5860: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
5870: 50 67 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Pg );.  rc = sql
5880: 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70  iteOsTruncate(&p
5890: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
58a0: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
58b0: 5f 74 29 6d 78 50 67 29 3b 0a 20 20 69 66 28 20  _t)mxPg);.  if( 
58c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
58d0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
58e0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
58f0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
5900: 78 50 67 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  xPg;.  .  /* Cop
5910: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
5920: 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
5930: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
5940: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
5950: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ile..  */.  for(
5960: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
5970: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
5980: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
5990: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
59a0: 67 65 72 2d 3e 6a 66 64 2c 20 66 6f 72 6d 61 74  ger->jfd, format
59b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
59c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
59d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
59e0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
59f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5a00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5a10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5a20: 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74  .  /* Pages that
5a30: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
5a40: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
5a50: 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63  l but never sync
5a60: 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f  ed.  ** where no
5a70: 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68  t restored by th
5a80: 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57  e loop above.  W
5a90: 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72  e have to restor
5aa0: 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67  e those.  ** pag
5ab0: 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  es by reading th
5ac0: 65 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  e back from the 
5ad0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
5ae0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
5af0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5b00: 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
5b10: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
5b20: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
5b30: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
5b40: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
5b50: 66 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  f[SQLITE_PAGE_SI
5b60: 5a 45 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ZE];.      if( !
5b70: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
5b80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5b90: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
5ba0: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
5bb0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
5bc0: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
5bd0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
5be0: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
5bf0: 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  _t)(pPg->pgno-1)
5c00: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
5c10: 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50  sqliteOsRead(&pP
5c20: 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
5c30: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5c40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5c50: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
5c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5c70: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
5c80: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5c90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5ca0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
5cb0: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
5cc0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
5cd0: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
5ce0: 45 5f 53 49 5a 45 29 20 29 7b 0a 20 20 20 20 20  E_SIZE) ){.     
5cf0: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
5d00: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), 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 6d  SIZE);.        m
5d30: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
5d40: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
5d50: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
5d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
5d70: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
5d80: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
5d90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5da0: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
5db0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5dc0: 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  OK ){.    pager_
5dd0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
5de0: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
5df0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
5e00: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
5e10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
5e20: 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
5e30: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
5e40: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
5e50: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
5e60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
5e70: 6c 61 79 62 61 63 6b 20 74 68 65 20 63 68 65 63  layback the chec
5e80: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
5e90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
5ea0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
5eb0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
5ec0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
5ed0: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
5ee0: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
5ef0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
5f00: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
5f10: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
5f20: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
5f30: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
5f40: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
5f50: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
5f60: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 2c 20 6e 6f  er->ckptSize, no
5f70: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
5f80: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
5f90: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
5fa0: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
5fb0: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
5fc0: 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ck the checkpoin
5fd0: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
5fe0: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
5ff0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
6000: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6010: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
6020: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
6030: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
6040: 63 6b 70 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  ckptJSize..*/.st
6050: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 63  atic int pager_c
6060: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  kpt_playback(Pag
6070: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
6080: 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20  ff_t szJ;       
6090: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
60a0: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
60b0: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  nal */.  int nRe
60c0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
60d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
60e0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
60f0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
6100: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
6110: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
6120: 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65  ;..  /* Truncate
6130: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
6140: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
6150: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
6160: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75  rc = sqliteOsTru
6170: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
6180: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
6190: 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65  IZE*(off_t)pPage
61a0: 72 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a 20 20  r->ckptSize);.  
61b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
61c0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
61d0: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
61e0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
61f0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
6200: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
6210: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
6220: 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  t( pPager->ckptI
6230: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
6240: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
6250: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
6260: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b  Pager->cpfd, 0);
6270: 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
6280: 2d 3e 63 6b 70 74 4e 52 65 63 3b 0a 20 20 0a 20  ->ckptNRec;.  . 
6290: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
62a0: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
62b0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
62c0: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
62d0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
62e0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
62f0: 65 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b  e that the check
6300: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  point journal al
6310: 77 61 79 73 20 75 73 65 73 20 66 6f 72 6d 61 74  ways uses format
6320: 0a 20 20 2a 2a 20 32 20 69 6e 73 74 65 61 64 20  .  ** 2 instead 
6330: 6f 66 20 66 6f 72 6d 61 74 20 33 20 73 69 6e 63  of format 3 sinc
6340: 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  e it does not ne
6350: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
6360: 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 70 6f 77  ed with.  ** pow
6370: 65 72 20 66 61 69 6c 75 72 65 73 20 63 6f 72 72  er failures corr
6380: 75 70 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  upting the journ
6390: 61 6c 20 61 6e 64 20 63 61 6e 20 74 68 75 73 20  al and can thus 
63a0: 6f 6d 69 74 20 74 68 65 20 63 68 65 63 6b 73 75  omit the checksu
63b0: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ms..  */.  for(i
63c0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
63d0: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
63e0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
63f0: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
6400: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 32 29 3b  Pager->cpfd, 2);
6410: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
6420: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
6430: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6440: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
6450: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _ckpt_playback;.
6460: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
6470: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61   out how many pa
6480: 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
6490: 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
64a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
64b0: 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  * journal..  */.
64c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53    rc = sqliteOsS
64d0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
64e0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53  , pPager->ckptJS
64f0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
6500: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6510: 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70   goto end_ckpt_p
6520: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
6530: 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
6540: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
6550: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
6560: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6570: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b  .    goto end_ck
6580: 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  pt_playback;.  }
6590: 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d  .  nRec = (szJ -
65a0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
65b0: 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ze)/JOURNAL_PG_S
65c0: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
65d0: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  );.  for(i=nRec-
65e0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
65f0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
6600: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
6610: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
6620: 3e 6a 66 64 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f  >jfd, journal_fo
6630: 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28 20 72  rmat);.    if( r
6640: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6650: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
6660: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
6670: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
6680: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  ckpt_playback;. 
6690: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f     }.  }.  .end_
66a0: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  ckpt_playback:. 
66b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
66c0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
66d0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
66e0: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
66f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6700: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72  CORRUPT;.  }.  r
6710: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6720: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
6730: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
6740: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
6750: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
6760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
6770: 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68  mum number is th
6780: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
6790: 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70   of the mxPage p
67a0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
67b0: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
67c0: 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66  ve, the noSync f
67d0: 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  lag is also set.
67e0: 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65    noSync bypasse
67f0: 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  s.** calls to sq
6800: 6c 69 74 65 4f 73 53 79 6e 63 28 29 2e 20 20 54  liteOsSync().  T
6810: 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75  he pager runs mu
6820: 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20 6e  ch faster with n
6830: 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74  oSync on,.** but
6840: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
6850: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
6860: 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e 20   or there is an 
6870: 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a  abrupt power .**
6880: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61   failure, the da
6890: 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68  tabase file migh
68a0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  t be left in an 
68b0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
68c0: 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65  .** unrepairable
68d0: 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69   state.  .*/.voi
68e0: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65  d sqlitepager_se
68f0: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
6900: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
6910: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
6920: 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Page>=0 ){.    p
6930: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
6940: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
6950: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6960: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
6970: 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20  1;.    mxPage = 
6980: 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69  -mxPage;.  }.  i
6990: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
69a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
69b0: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
69c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
69d0: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
69e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
69f0: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
6a00: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
6a10: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
6a20: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
6a30: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
6a40: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
6a50: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
6a60: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
6a70: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
6a80: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
6a90: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 79        sqliteOsSy
6aa0: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
6ab0: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
6ac0: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
6ad0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
6ae0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
6af0: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
6b00: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
6b10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
6b20: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
6b30: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
6b40: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
6b50: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
6b60: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
6b70: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
6b80: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
6ba0: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
6bb0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
6bc0: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
6bd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
6be0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
6bf0: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
6c00: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
6c10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
6c20: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
6c30: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
6c40: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
6c70: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
6c80: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
6c90: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
6ca0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
6cb0: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
6cc0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
6cd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
6ce0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
6cf0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
6d00: 66 6f 72 6d 61 74 69 6f 6e 20 62 65 69 6e 67 20  formation being 
6d10: 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 20  written.**      
6d20: 20 20 20 20 20 20 20 20 69 6e 20 62 65 74 77 65          in betwe
6d30: 65 6e 20 74 68 65 20 74 77 6f 20 73 79 6e 63 73  en the two syncs
6d40: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
6d50: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
6d60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
6d70: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
6d80: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
6d90: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
6da0: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
6db0: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
6dc0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
6dd0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
6de0: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
6e00: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
6e10: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
6e20: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
6e30: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
6e40: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
6e50: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
6e60: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
6e70: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
6e80: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
6e90: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
6ea0: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
6eb0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
6ec0: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
6ed0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
6ee0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
6ef0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
6f00: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
6f10: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
6f20: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
6f30: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
6f40: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
6f50: 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61  e.  Write the na
6f60: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  me of the file i
6f70: 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e  nto zName.** (zN
6f80: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ame must be at l
6f90: 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50  east SQLITE_TEMP
6fa0: 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20  NAME_SIZE bytes 
6fb0: 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a  long.)  Write.**
6fc0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
6fd0: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
6fe0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
6ff0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
7000: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
7010: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
7020: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
7030: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
7040: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
7050: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
7060: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
7070: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
7080: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70  t sqlitepager_op
7090: 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69  entemp(char *zFi
70a0: 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b  le, OsFile *fd){
70b0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
70c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a    int rc;.  do{.
70d0: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
70e0: 71 6c 69 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e  qliteOsTempFileN
70f0: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
7100: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65  rc = sqliteOsOpe
7110: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
7120: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
7130: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
7140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
7150: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7160: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
7170: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
7180: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
7190: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
71a0: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
71b0: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
71c0: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
71d0: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
71e0: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
71f0: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
7200: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70   call to sqlitep
7210: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
7220: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
7230: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
7240: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
7250: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
7260: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
7270: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
7280: 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
7290: 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
72a0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
72b0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
72c0: 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
72d0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
72e0: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
72f0: 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
7300: 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
7310: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  it is closed..*/
7320: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
7330: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
7340: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
7350: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
7360: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
7370: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
7380: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
7390: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
73a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
73b0: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
73c0: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
73d0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
73e0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
73f0: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
7400: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
7410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
7420: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
7430: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7440: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
7450: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20   useJournal     
7460: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
7470: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
7480: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7490: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
74a0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
74b0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
74c0: 65 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  e;.  int nameLen
74d0: 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20  ;.  OsFile fd;. 
74e0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74   int rc;.  int t
74f0: 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  empFile;.  int r
7500: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63  eadOnly = 0;.  c
7510: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
7520: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
7530: 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  ..  *ppPager = 0
7540: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  ;.  if( sqlite_m
7550: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
7560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7570: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
7580: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a  f( zFilename ){.
7590: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
75a0: 65 20 3d 20 73 71 6c 69 74 65 4f 73 46 75 6c 6c  e = sqliteOsFull
75b0: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
75c0: 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  me);.    rc = sq
75d0: 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72  liteOsOpenReadWr
75e0: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
75f0: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
7600: 79 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  y);.    tempFile
7610: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
7630: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
7640: 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46  mp, &fd);.    zF
7650: 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b  ilename = zTemp;
7660: 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61  .    zFullPathna
7670: 6d 65 20 3d 20 73 71 6c 69 74 65 4f 73 46 75 6c  me = sqliteOsFul
7680: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
7690: 61 6d 65 29 3b 0a 20 20 20 20 74 65 6d 70 46 69  ame);.    tempFi
76a0: 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  le = 1;.  }.  if
76b0: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
76c0: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
76d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
76e0: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  M;.  }.  if( rc!
76f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7700: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
7710: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
7720: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7730: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e  ANTOPEN;.  }.  n
7740: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
7750: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
7760: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
7770: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7780: 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
7790: 65 6e 2a 32 20 2b 20 33 30 20 29 3b 0a 20 20 69  en*2 + 30 );.  i
77a0: 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  f( pPager==0 ){.
77b0: 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73      sqliteOsClos
77c0: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
77d0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
77e0: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
77f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7800: 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28    }.  SET_PAGER(
7810: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
7820: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
7830: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
7840: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
7850: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
7860: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
7870: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
7880: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
7890: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
78a0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
78b0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75  r->zJournal, zFu
78c0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
78d0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
78e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
78f0: 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
7900: 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22  rnal[nameLen], "
7910: 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50  -journal");.  pP
7920: 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
7930: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7940: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
7950: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
7960: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70   useJournal;.  p
7970: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
7980: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  = 0;.  pPager->c
7990: 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  kptInUse = 0;.  
79a0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
79b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
79c0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
79d0: 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 30 3b  r->ckptSize = 0;
79e0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  .  pPager->ckptJ
79f0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
7a00: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
7a10: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
7a20: 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50  = mxPage>5 ? mxP
7a30: 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67  age : 10;.  pPag
7a40: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
7a50: 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  TE_UNLOCK;.  pPa
7a60: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
7a70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  ;.  pPager->temp
7a80: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
7a90: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
7aa0: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
7ab0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7ac0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
7ad0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
7ae0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
7af0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
7b00: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
7b10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
7b20: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
7b30: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
7b40: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  0;.  pPager->nEx
7b50: 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20  tra = nExtra;.  
7b60: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
7b70: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
7b80: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
7b90: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
7ba0: 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
7bb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7bc0: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
7bd0: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
7be0: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
7bf0: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
7c00: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
7c10: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
7c20: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
7c30: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
7c40: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
7c50: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
7c60: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
7c70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
7c80: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
7c90: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
7ca0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
7cb0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
7cc0: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
7cd0: 65 73 75 6c 74 20 73 71 6c 69 74 65 70 61 67 65  esult sqlitepage
7ce0: 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  r_close().  .** 
7cf0: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
7d00: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
7d10: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
7d20: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
7d30: 74 65 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74  tepager_set_dest
7d40: 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
7d50: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
7d60: 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a 20 20 70  sc)(void*)){.  p
7d70: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
7d80: 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
7d90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7da0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7db0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
7dc0: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
7dd0: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
7de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
7df0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
7e00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7e10: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
7e20: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
7e30: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
7e40: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
7e50: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
7e60: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
7e70: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
7e80: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  e(&pPager->fd, &
7e90: 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  n)!=SQLITE_OK ){
7ea0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
7eb0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
7ec0: 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75  R_DISK;.    retu
7ed0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d  rn 0;.  }.  n /=
7ee0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
7ef0: 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  E;.  if( pPager-
7f00: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
7f10: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
7f20: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
7f30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
7f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
7f50: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
7f60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
7f70: 41 6c 6c 50 61 67 65 73 28 50 61 67 65 72 2a 29  AllPages(Pager*)
7f80: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
7f90: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
7fa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
7fb0: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
7fc0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
7fd0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
7fe0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
7ff0: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
8000: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
8010: 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ize<0 ){.    sql
8020: 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75  itepager_pagecou
8030: 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
8040: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
8050: 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
8060: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
8070: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
8080: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
8090: 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
80a0: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
80b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
80c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
80d0: 7d 0a 20 20 73 79 6e 63 41 6c 6c 50 61 67 65 73  }.  syncAllPages
80e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
80f0: 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74   sqliteOsTruncat
8100: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
8110: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
8120: 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20  (off_t)nPage);. 
8130: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8140: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
8150: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
8160: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8170: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
8180: 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
8190: 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
81a0: 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
81b0: 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
81c0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
81d0: 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
81e0: 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
81f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
8200: 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
8210: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
8220: 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
8230: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
8240: 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
8250: 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
8260: 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
8270: 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
8280: 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
8290: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
82a0: 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
82b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
82c0: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
82d0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
82e0: 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
82f0: 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28  litepager_close(
8300: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8310: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
8320: 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Next;.  switch( 
8330: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
8340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8350: 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20  _WRITELOCK: {.  
8360: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
8370: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
8380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
8390: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
83a0: 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
83b0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
83c0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
83d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
83e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
83f0: 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20  READLOCK: {.    
8400: 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b    sqliteOsUnlock
8410: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
8420: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8430: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
8440: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
8450: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
8460: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
8470: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
8480: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
8490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
84a0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
84b0: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
84c0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 73 71  e(pPg);.  }.  sq
84d0: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61  liteOsClose(&pPa
84e0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65  ger->fd);.  asse
84f0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
8500: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
8510: 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
8520: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
8530: 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
8540: 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
8550: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
8560: 20 2a 2a 20 20 20 73 71 6c 69 74 65 4f 73 44 65   **   sqliteOsDe
8570: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
8580: 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
8590: 20 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52    */.  CLR_PAGER
85a0: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
85b0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
85c0: 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65  e!=(char*)&pPage
85d0: 72 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  r[1] ){.    sqli
85e0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
85f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
8600: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
8610: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  ->zJournal);.  }
8620: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
8630: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
8640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8650: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
8660: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
8670: 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
8680: 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
8690: 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  tepager_pagenumb
86a0: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  er(void *pData){
86b0: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41  .  PgHdr *p = DA
86c0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
86d0: 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  a);.  return p->
86e0: 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pgno;.}../*.** I
86f0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
8700: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
8710: 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68 65   a page.  If the
8720: 20 70 61 67 65 20 69 73 0a 2a 2a 20 63 75 72 72   page is.** curr
8730: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
8740: 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
8750: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
8760: 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
8770: 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
8780: 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66  reelist..*/.#def
8790: 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
87a0: 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
87b0: 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
87c0: 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
87d0: 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
87e0: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
87f0: 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
8800: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
8810: 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
8820: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
8830: 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
8840: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
8850: 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
8860: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
8870: 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
8880: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
8890: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
88a0: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
88b0: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
88c0: 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
88d0: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
88e0: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
88f0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
8900: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
8910: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
8920: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
8930: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
8940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
8950: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
8960: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
8970: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
8980: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
8990: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
89a0: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
89b0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
89c0: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
89d0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
89e0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
89f0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
8a00: 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
8a10: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
8a20: 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
8a30: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
8a40: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
8a50: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
8a60: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
8a70: 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
8a80: 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
8a90: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
8aa0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
8ab0: 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66 28 76  qlitepager_ref(v
8ac0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
8ad0: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
8ae0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
8af0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
8b00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
8b10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8b20: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
8b30: 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20   and then write 
8b40: 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20 70  all free dirty p
8b50: 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
8b60: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a  base.** file..**
8b70: 0a 2a 2a 20 57 72 69 74 69 6e 67 20 61 6c 6c 20  .** Writing all 
8b80: 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65 73  free dirty pages
8b90: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8ba0: 20 61 66 74 65 72 20 74 68 65 20 73 79 6e 63 20   after the sync 
8bb0: 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69  is a.** non-obvi
8bc0: 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
8bd0: 2e 20 20 66 73 79 6e 63 28 29 20 69 73 20 61 6e  .  fsync() is an
8be0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
8bf0: 74 69 6f 6e 20 73 6f 20 77 65 0a 2a 2a 20 77 61  tion so we.** wa
8c00: 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  nt to minimize t
8c10: 68 65 20 6e 75 6d 62 65 72 20 6f 74 20 74 69 6d  he number ot tim
8c20: 65 73 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e  es it is called.
8c30: 20 41 66 74 65 72 20 61 6e 20 66 73 79 6e 63 28   After an fsync(
8c40: 29 20 63 61 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72  ) call,.** we ar
8c50: 65 20 66 72 65 65 20 74 6f 20 77 72 69 74 65 20  e free to write 
8c60: 64 69 72 74 79 20 70 61 67 65 73 20 62 61 63 6b  dirty pages back
8c70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8c80: 2e 20 20 49 74 20 69 73 20 62 65 73 74 0a 2a 2a  .  It is best.**
8c90: 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
8ca0: 20 77 72 69 74 65 20 61 73 20 6d 61 6e 79 20 64   write as many d
8cb0: 69 72 74 79 20 70 61 67 65 73 20 61 73 20 70 6f  irty pages as po
8cc0: 73 73 69 62 6c 65 20 74 6f 20 6d 69 6e 69 6d 69  ssible to minimi
8cd0: 7a 65 20 0a 2a 2a 20 74 68 65 20 72 69 73 6b 20  ze .** the risk 
8ce0: 6f 66 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  of having to do 
8cf0: 61 6e 6f 74 68 65 72 20 66 73 79 6e 63 28 29 20  another fsync() 
8d00: 6c 61 74 65 72 20 6f 6e 2e 20 20 57 72 69 74 69  later on.  Writi
8d10: 6e 67 20 64 69 72 74 79 0a 2a 2a 20 66 72 65 65  ng dirty.** free
8d20: 20 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 77   pages in this w
8d30: 61 79 20 77 61 73 20 6f 62 73 65 72 76 65 64 20  ay was observed 
8d40: 74 6f 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  to make database
8d50: 20 6f 70 65 72 61 74 69 6f 6e 73 20 67 6f 0a 2a   operations go.*
8d60: 2a 20 75 70 20 74 6f 20 31 30 20 74 69 6d 65 73  * up to 10 times
8d70: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
8d80: 66 20 77 65 20 61 72 65 20 77 72 69 74 69 6e 67  f we are writing
8d90: 20 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 64 61   to temporary da
8da0: 74 61 62 61 73 65 2c 20 74 68 65 72 65 20 69 73  tabase, there is
8db0: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 70 72 65 73   no need to pres
8dc0: 65 72 76 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65  erve.** the inte
8dd0: 67 72 69 74 79 20 6f 66 20 74 68 65 20 6a 6f 75  grity of the jou
8de0: 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 77 65  rnal file, so we
8df0: 20 63 61 6e 20 73 61 76 65 20 74 69 6d 65 20 61   can save time a
8e00: 6e 64 20 73 6b 69 70 20 74 68 65 0a 2a 2a 20 66  nd skip the.** f
8e10: 73 79 6e 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sync()..*/.stati
8e20: 63 20 69 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67  c int syncAllPag
8e30: 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
8e40: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
8e50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8e60: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
8e70: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
8e80: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
8e90: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
8ea0: 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
8eb0: 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
8ec0: 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
8ed0: 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
8ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
8ef0: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
8f00: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
8f10: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
8f20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8f30: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
8f40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
8f50: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
8f60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
8f70: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
8f80: 6f 66 66 5f 74 20 68 64 72 53 7a 2c 20 70 67 53  off_t hdrSz, pgS
8f90: 7a 2c 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  z, jSz;.        
8fa0: 68 64 72 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f  hdrSz = JOURNAL_
8fb0: 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66  HDR_SZ(journal_f
8fc0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20  ormat);.        
8fd0: 70 67 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50  pgSz = JOURNAL_P
8fe0: 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  G_SZ(journal_for
8ff0: 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  mat);.        rc
9000: 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53   = sqliteOsFileS
9010: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
9020: 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20  , &jSz);.       
9030: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
9040: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
9050: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9060: 6e 52 65 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d  nRec*pgSz+hdrSz=
9070: 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
9080: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
9090: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e   journal_format>
90a0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  =3 ){.        of
90b0: 66 5f 74 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f_t szJ;.       
90c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
90d0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
90e0: 20 20 20 54 52 41 43 45 31 28 22 53 59 4e 43 5c     TRACE1("SYNC\
90f0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  n");.          r
9100: 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79 6e 63  c = sqliteOsSync
9110: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
9120: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
9130: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
9140: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9150: 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28     sqliteOsSeek(
9160: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69  &pPager->jfd, si
9170: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9180: 69 63 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72  ic1));.        r
9190: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
91a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
91b0: 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
91c0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
91d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
91e0: 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48   szJ = JOURNAL_H
91f0: 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f  DR_SZ(journal_fo
9200: 72 6d 61 74 29 20 2b 0a 20 20 20 20 20 20 20 20  rmat) +.        
9210: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
9220: 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47  >nRec*JOURNAL_PG
9230: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
9240: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  at);.        sql
9250: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
9260: 72 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20  r->jfd, szJ);.  
9270: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
9280: 45 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20  E1("SYNC\n");.  
9290: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
92a0: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a  sSync(&pPager->j
92b0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
92c0: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
92d0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
92e0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
92f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
9300: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9310: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
9320: 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
9330: 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
9340: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
9350: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
9360: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
9370: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
9380: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
9390: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
93a0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
93b0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
93c0: 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
93d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
93e0: 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
93f0: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
9400: 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
9410: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
9420: 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
9430: 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
9440: 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
9450: 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
9460: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
9470: 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
9480: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
9490: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
94a0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
94b0: 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
94c0: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
94d0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
94e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
94f0: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
9500: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
9510: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
9520: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9530: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
9540: 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
9550: 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
9560: 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
9570: 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
9580: 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
9590: 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
95a0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
95b0: 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
95c0: 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
95d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
95e0: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
95f0: 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
9600: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
9610: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
9620: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
9630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
9640: 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
9650: 67 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  ger;.  while( pL
9660: 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
9670: 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
9680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53  );.    sqliteOsS
9690: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
96a0: 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
96b0: 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50  *(off_t)SQLITE_P
96c0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72  AGE_SIZE);.    r
96d0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
96e0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  e(&pPager->fd, P
96f0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
9700: 73 74 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  st), SQLITE_PAGE
9710: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
9720: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9730: 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
9740: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
9750: 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
9760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9770: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9780: 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
9790: 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
97a0: 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
97b0: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
97c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
97d0: 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
97e0: 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
97f0: 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
9800: 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
9810: 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
9820: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
9830: 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
9840: 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
9850: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
9860: 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
9870: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
9880: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
9890: 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
98a0: 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
98b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
98c0: 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
98d0: 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
98e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
98f0: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
9900: 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
9910: 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
9920: 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
9930: 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
9940: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
9950: 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
9960: 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
9970: 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
9980: 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
9990: 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
99a0: 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
99b0: 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
99c0: 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
99d0: 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
99e0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
99f0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9a00: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
9a10: 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
9a20: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
9a30: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
9a40: 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
9a50: 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
9a60: 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
9a70: 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
9a80: 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
9a90: 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
9aa0: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
9ab0: 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
9ac0: 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
9ad0: 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
9ae0: 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
9af0: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
9b00: 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
9b10: 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
9b20: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
9b30: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
9b40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
9b50: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
9b60: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
9b70: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
9b80: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f   sqlitepager_loo
9b90: 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
9ba0: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
9bb0: 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
9bc0: 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
9bd0: 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
9be0: 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
9bf0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
9c00: 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
9c10: 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
9c20: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
9c30: 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
9c40: 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
9c50: 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
9c60: 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
9c70: 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
9c80: 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
9c90: 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
9ca0: 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
9cb0: 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
9cc0: 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
9cd0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
9ce0: 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
9cf0: 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
9d00: 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
9d10: 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
9d20: 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
9d30: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
9d40: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9d50: 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
9d60: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
9d70: 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
9d80: 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
9d90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
9da0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
9db0: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
9dc0: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
9dd0: 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
9de0: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
9df0: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
9e00: 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
9e10: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9e20: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
9e30: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
9e40: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
9e50: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
9e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9e70: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
9e80: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
9e90: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
9ea0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
9eb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
9ec0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
9ed0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
9ee0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
9ef0: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
9f00: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
9f10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9f20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9f30: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
9f40: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
9f50: 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f  READLOCK;..    /
9f60: 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
9f70: 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79 20  ile exists, try 
9f80: 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 2e  to play it back.
9f90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9fa0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
9fb0: 61 6c 20 26 26 20 73 71 6c 69 74 65 4f 73 46 69  al && sqliteOsFi
9fc0: 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
9fd0: 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  >zJournal) ){.  
9fe0: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
9ff0: 20 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72       /* Get a wr
a000: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
a010: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
a020: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
a030: 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b  qliteOsWriteLock
a040: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
a050: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a060: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a070: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73      if( sqliteOs
a080: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
a090: 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  fd)!=SQLITE_OK )
a0a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {.           /* 
a0b0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
a0c0: 72 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20 20 20  r happen! */.   
a0d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
a0e0: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
a0f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a100: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a110: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
a120: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
a130: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a  ITE_WRITELOCK;..
a140: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
a150: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
a160: 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
a170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
a180: 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65   if.       ** we
a190: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f   are unable to o
a1a0: 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
a1b0: 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a  file. .       **
a1c0: 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  .       ** The j
a1d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
a1e0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
a1f0: 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20  locked itself.  
a200: 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f  The.       ** jo
a210: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
a220: 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
a230: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
a240: 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
a250: 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
a260: 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
a270: 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
a280: 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
a290: 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  .       ** proce
a2a0: 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65  sses opening the
a2b0: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20   journal at the 
a2c0: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20  same time..     
a2d0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
a2e0: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61   sqliteOsOpenRea
a2f0: 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a  dOnly(pPager->zJ
a300: 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
a310: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  >jfd);.       if
a320: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a330: 29 7b 0a 20 20 20 20 20 20 20 20 20 72 63 20 3d  ){.         rc =
a340: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
a350: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
a360: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
a370: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
a380: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a390: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
a3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
a3b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
a3c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61   = 1;.       pPa
a3d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
a3e0: 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ted = 0;..      
a3f0: 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
a400: 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
a410: 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
a420: 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
a430: 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
a440: 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
a450: 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
a460: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
a470: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
a480: 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
a490: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a4a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
a4b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
a4c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
a4d0: 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
a4e0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
a4f0: 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  r page in cache 
a500: 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
a510: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
a520: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
a530: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
a540: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
a550: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
a560: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
a570: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20   */.    int h;. 
a580: 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73     pPager->nMiss
a590: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
a5a0: 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
a5b0: 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67  ->mxPage || pPag
a5c0: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 29 7b  er->pFirst==0 ){
a5d0: 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
a5e0: 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
a5f0: 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
a600: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
a610: 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54  of(*pPg) + SQLIT
a620: 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  E_PAGE_SIZE .   
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
a650: 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
a660: 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20 20 20  r->nExtra );.   
a670: 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
a680: 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75  .        pager_u
a690: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
a6a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
a6b0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
a6c0: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20  AGER_ERR_MEM;.  
a6d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a6e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a6f0: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
a700: 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
a710: 70 50 67 29 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg));.      pPg
a720: 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
a730: 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
a740: 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
a750: 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28  >pAll;.      if(
a760: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
a770: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
a780: 3e 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20  >pAll->pPrevAll 
a790: 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20  = pPg;.      }. 
a7a0: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 41       pPg->pPrevA
a7b0: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ll = 0;.      pP
a7c0: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
a7d0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
a7e0: 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nPage++;.    }el
a7f0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  se{.      /* Fin
a800: 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
a810: 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
a820: 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
a830: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
a840: 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
a850: 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
a860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
a870: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67      */.      pPg
a880: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
a890: 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20  tSynced;..      
a8a0: 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
a8b0: 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
a8c0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
a8d0: 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
a8e0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
a8f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
a900: 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
a910: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
a920: 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65  is a.      ** ve
a930: 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
a940: 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
a950: 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
a960: 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
a970: 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74       ** it can't
a980: 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20   be helped..    
a990: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
a9a0: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
a9b0: 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 41 6c   int rc = syncAl
a9c0: 6c 50 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  lPages(pPager);.
a9d0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a9e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
a9f0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
aa00: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
aa10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
aa20: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
aa30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
aa40: 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
aa50: 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
aa60: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
aa70: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  Ref==0 );..     
aa80: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
aa90: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
aaa0: 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
aab0: 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f   dirty..      */
aac0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
aad0: 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
aae0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
aaf0: 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
ab00: 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
ab10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
ab20: 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
ab30: 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
ab40: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
ab50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ab60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67         sqlitepag
ab70: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
ab80: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
ab90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
aba0: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
abb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
abc0: 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
abd0: 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  0 );..      /* I
abe0: 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
abf0: 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
ac00: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
ac10: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
ac20: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67      ** set the g
ac30: 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
ac40: 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
ac50: 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
ac60: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f      ** sqlite_do
ac70: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
ac80: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
ac90: 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
aca0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
acb0: 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65     ** It is nece
acc0: 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
acd0: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
ace0: 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
acf0: 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
ad00: 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
ad10: 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
ad20: 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
ad30: 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
ad40: 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  member.      ** 
ad50: 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
ad60: 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
ad70: 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
ad80: 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
ad90: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d  st.      ** be m
ada0: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
adb0: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
adc0: 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20  e on out..      
add0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
ade0: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
adf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
ae00: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
ae10: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
ae20: 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b  .      /* Unlink
ae30: 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
ae40: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
ae50: 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
ae60: 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
ae70: 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
ae80: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
ae90: 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64   ){.        PgHd
aea0: 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
aeb0: 74 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 77  tFree;.        w
aec0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
aed0: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
aee0: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
aef0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
af00: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
af10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
af20: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
af30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
af40: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
af50: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
af60: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65  xtFree;.      }e
af70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
af80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
af90: 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
afa0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
afb0: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
afc0: 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ree;.      }.   
afd0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
afe0: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  tFree ){.       
aff0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
b000: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
b010: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
b020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b030: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b040: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
b050: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
b060: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
b070: 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a  evFree;.      }.
b080: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
b090: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
b0a0: 76 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  vFree = 0;.     
b0b0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
b0c0: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ash ){.        p
b0d0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
b0e0: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
b0f0: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 20 20 20  pPrevHash;.     
b100: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
b110: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
b120: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65         pPg->pPre
b130: 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
b140: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
b150: 68 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  h;.      }else{.
b160: 20 20 20 20 20 20 20 20 68 20 3d 20 70 61 67 65          h = page
b170: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
b180: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b190: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
b1a0: 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  [h]==pPg );.    
b1b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
b1c0: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
b1d0: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  tHash;.      }. 
b1e0: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
b1f0: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
b200: 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
b210: 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
b220: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
b230: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
b240: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
b250: 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
b260: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
b270: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
b280: 20 20 73 71 6c 69 74 65 43 68 65 63 6b 4d 65 6d    sqliteCheckMem
b290: 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
b2a0: 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
b2b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b2c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
b2d0: 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
b2e0: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
b2f0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
b300: 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
b310: 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
b320: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
b330: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
b340: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
b350: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
b360: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
b370: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
b380: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  f( pPager->aInCk
b390: 70 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  pt && (int)pgno<
b3a0: 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  =pPager->ckptSiz
b3b0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  e.             &
b3c0: 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  & (pPager->aInCk
b3d0: 70 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  pt[pgno/8] & (1<
b3e0: 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29  <(pgno&7)))!=0 )
b3f0: 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  {.      page_add
b400: 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50  _to_ckpt_list(pP
b410: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
b420: 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
b430: 5f 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28  _from_ckpt_list(
b440: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
b450: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
b460: 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
b470: 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
b480: 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  Pg);.    pPager-
b490: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d  >nRef++;.    h =
b4a0: 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f   pager_hash(pgno
b4b0: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
b4c0: 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
b4d0: 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
b4e0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
b4f0: 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
b500: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
b510: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
b520: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
b530: 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
b540: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
b550: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
b560: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
b570: 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
b580: 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
b590: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
b5a0: 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  RA(pPg), 0, pPag
b5b0: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
b5c0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
b5d0: 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71  r->dbSize<0 ) sq
b5e0: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
b5f0: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
b600: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b610: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
b620: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
b630: 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
b640: 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63  (pPg));.      rc
b650: 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
b660: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
b670: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
b680: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
b690: 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e  >dbSize<(int)pgn
b6a0: 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
b6b0: 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
b6c0: 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f  pPg), 0, SQLITE_
b6d0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
b6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
b6f0: 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
b700: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
b710: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f  >fd, (pgno-1)*(o
b720: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
b730: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63  _SIZE);.      rc
b740: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
b750: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
b760: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
b770: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
b780: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
b790: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b7a0: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c         off_t fil
b7b0: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
b7c0: 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53  f( sqliteOsFileS
b7d0: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
b7e0: 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49  &fileSize)!=SQLI
b7f0: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
b800: 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65       || fileSize
b810: 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41  >=pgno*SQLITE_PA
b820: 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
b830: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
b840: 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
b850: 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
b860: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
b870: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b880: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
b890: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
b8a0: 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
b8b0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
b8c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b8d0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b8e0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
b8f0: 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
b900: 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
b910: 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b     pPager->nHit+
b920: 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  +;.    page_ref(
b930: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
b940: 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
b950: 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
b960: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b970: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
b980: 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
b990: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
b9a0: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
b9b0: 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
b9c0: 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
b9d0: 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
b9e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b9f0: 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
ba00: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
ba10: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
ba20: 20 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65   also sqlitepage
ba30: 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69  r_get().  The di
ba40: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
ba50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
ba60: 20 61 6e 64 20 73 71 6c 69 74 65 70 61 67 65 72   and sqlitepager
ba70: 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
ba80: 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
ba90: 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
baa0: 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
bab0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
bac0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
bad0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
bae0: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
baf0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
bb00: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
bb10: 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
bb20: 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
bb30: 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
bb40: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 70 61  /.void *sqlitepa
bb50: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
bb60: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
bb70: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
bb80: 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
bb90: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
bba0: 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
bbb0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
bbc0: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
bbd0: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
bbe0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
bbf0: 20 20 2f 2a 20 69 66 28 20 70 50 61 67 65 72 2d    /* if( pPager-
bc00: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 2a 2a  >nRef==0 ){.  **
bc10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 2a    return 0;.  **
bc20: 20 7d 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20   }.  */.  pPg = 
bc30: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
bc40: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
bc50: 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
bc60: 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
bc70: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
bc80: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
bc90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
bca0: 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
bcb0: 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
bcc0: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
bcd0: 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
bce0: 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
bcf0: 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
bd00: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
bd10: 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
bd20: 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
bd30: 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
bd40: 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
bd50: 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
bd60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
bd70: 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
bd80: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bd90: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  epager_unref(voi
bda0: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
bdb0: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
bdc0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
bdd0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
bde0: 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
bdf0: 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
be00: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
be10: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
be20: 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
be30: 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
be40: 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
be50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
be60: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
be70: 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
be80: 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
be90: 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
bea0: 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
beb0: 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
bec0: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
bed0: 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
bee0: 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
bef0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
bf00: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
bf10: 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
bf20: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
bf30: 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
bf40: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
bf50: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
bf60: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
bf70: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
bf80: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
bf90: 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
bfa0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
bfb0: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
bfc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
bfd0: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
bfe0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
bff0: 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
c000: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
c010: 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
c020: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
c030: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
c040: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
c050: 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
c060: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
c070: 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
c080: 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
c090: 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
c0a0: 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
c0b0: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
c0c0: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
c0d0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
c0e0: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
c0f0: 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
c100: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c110: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
c120: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
c130: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
c140: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
c150: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
c160: 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
c170: 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
c180: 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
c190: 6c 72 65 61 64 79 20 62 65 20 61 20 77 72 69 74  lready be a writ
c1a0: 65 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  e.** lock on the
c1b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
c1c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
c1d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
c1e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
c1f0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
c200: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
c210: 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
c220: 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
c230: 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
c240: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
c250: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c260: 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
c270: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c280: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
c290: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
c2a0: 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  ==SQLITE_WRITELO
c2b0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c2c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c2d0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
c2e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
c2f0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
c300: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
c310: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
c320: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
c330: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
c340: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
c350: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c360: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
c370: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61  er->fd);.    pPa
c380: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
c390: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
c3a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c3b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
c3c0: 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78  = sqliteOsOpenEx
c3d0: 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
c3e0: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
c3f0: 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74  r->jfd,pPager->t
c400: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
c410: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c420: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
c430: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
c440: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
c450: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
c460: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61  .    sqliteOsRea
c470: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
c480: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
c490: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
c4a0: 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  EADLOCK;.    ret
c4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
c4c0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  PEN;.  }.  pPage
c4d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
c4e0: 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
c4f0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
c500: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
c510: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
c520: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
c530: 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
c540: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71  ->nRec = 0;.  sq
c550: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
c560: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
c570: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
c580: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
c590: 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
c5a0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
c5b0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
c5c0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
c5d0: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
c5e0: 65 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c  e;.  if( journal
c5f0: 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c  _format==JOURNAL
c600: 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
c610: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
c620: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
c630: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33  , aJournalMagic3
c640: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
c650: 6c 4d 61 67 69 63 33 29 29 3b 0a 20 20 20 20 69  lMagic3));.    i
c660: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c670: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
c680: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
c690: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
c6a0: 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
c6b0: 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 20 20 7d  ffff : 0);.    }
c6c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c6d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c6e0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
c6f0: 74 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 52  t = (u32)sqliteR
c700: 61 6e 64 6f 6d 49 6e 74 65 67 65 72 28 29 3b 0a  andomInteger();.
c710: 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
c720: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
c730: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  jfd, pPager->cks
c740: 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 7d 0a 20  umInit);.    }. 
c750: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 75 72 6e   }else if( journ
c760: 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e  al_format==JOURN
c770: 41 4c 5f 46 4f 52 4d 41 54 5f 32 20 29 7b 0a 20  AL_FORMAT_2 ){. 
c780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
c790: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
c7a0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
c7b0: 63 32 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  c2, sizeof(aJour
c7c0: 6e 61 6c 4d 61 67 69 63 32 29 29 3b 0a 20 20 7d  nalMagic2));.  }
c7d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
c7e0: 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  ( journal_format
c7f0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  ==JOURNAL_FORMAT
c800: 5f 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  _1 );.    rc = s
c810: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
c820: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
c830: 6e 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f  nalMagic1, sizeo
c840: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
c850: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ));.  }.  if( rc
c860: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c870: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
c880: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
c890: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
c8a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
c8b0: 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65  ger->ckptAutoope
c8c0: 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
c8d0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
c8e0: 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
c8f0: 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  begin(pPager);. 
c900: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
c910: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
c920: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
c930: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
c940: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c950: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
c960: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
c970: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c980: 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  n rc;  .}../*.**
c990: 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
c9a0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
c9b0: 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
c9c0: 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
c9d0: 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
c9e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
c9f0: 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
ca00: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d  sqlitepager_comm
ca10: 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  it() is called..
ca20: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61  **   *  sqlitepa
ca30: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69  ger_rollback() i
ca40: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
ca50: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c    sqlitepager_cl
ca60: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
ca70: 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70  .**   *  sqlitep
ca80: 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20  ager_unref() is 
ca90: 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
caa0: 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
cab0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
cac0: 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
cad0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
cae0: 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
caf0: 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
cb00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
cb10: 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
cb20: 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
cb30: 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
cb40: 65 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72  ely.** to acquir
cb50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
cb60: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
cb70: 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
cb80: 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 69 73  that there.** is
cb90: 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
cba0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
cbb0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  base..**.** A jo
cbc0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
cbd0: 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
cbe0: 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
cbf0: 66 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 65  file.  For.** te
cc00: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74  mporary files, t
cc10: 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
cc20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
cc30: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
cc40: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20  .** there is an 
cc50: 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
cc60: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
cc70: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
cc80: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
cc90: 72 65 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b  ready write-lock
cca0: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
ccb0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ccc0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
ccd0: 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
cce0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
ccf0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
cd00: 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
cd10: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
cd20: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
cd30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
cd40: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
cd50: 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
cd60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
cd70: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b  SQLITE_UNLOCK );
cd80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
cd90: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41  tate==SQLITE_REA
cda0: 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  DLOCK ){.    ass
cdb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
cdc0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
cdd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
cde0: 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72  riteLock(&pPager
cdf0: 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  ->fd);.    if( r
ce00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ce10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
ce20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
ce30: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
ce40: 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20  E_WRITELOCK;.   
ce50: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
ce60: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 54 52 41 43  le = 0;.    TRAC
ce70: 45 31 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 5c  E1("TRANSACTION\
ce80: 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  n");.    if( pPa
ce90: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
cea0: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
ceb0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
cec0: 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
ced0: 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
cee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
cef0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
cf00: 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
cf10: 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
cf20: 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
cf30: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
cf40: 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
cf50: 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
cf60: 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
cf70: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
cf80: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
cf90: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
cfa0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
cfb0: 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
cfc0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
cfd0: 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
cfe0: 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
cff0: 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
d000: 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  s a write lock o
d010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
d020: 20 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a   If the write.**
d030: 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
d040: 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
d050: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
d060: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
d070: 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
d080: 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
d090: 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
d0a0: 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
d0b0: 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
d0c0: 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
d0d0: 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
d0e0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
d0f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
d100: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
d110: 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
d120: 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
d130: 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
d140: 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
d150: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
d160: 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
d170: 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
d180: 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
d190: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
d1a0: 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
d1b0: 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
d1c0: 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
d1d0: 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
d1e0: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  to sqlitepager_c
d1f0: 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
d200: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
d210: 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
d220: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
d230: 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44  r_write(void *pD
d240: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
d250: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
d260: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
d270: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
d280: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
d290: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d2a0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
d2b0: 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
d2c0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
d2d0: 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  k ){ .    return
d2e0: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
d2f0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
d300: 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
d310: 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
d320: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
d330: 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
d340: 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
d350: 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
d360: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
d370: 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
d380: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
d390: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
d3a0: 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
d3b0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
d3c0: 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
d3d0: 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e  rnal && (pPg->in
d3e0: 43 6b 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Ckpt || pPager->
d3f0: 63 6b 70 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  ckptInUse==0) ){
d400: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
d410: 74 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  tyFile = 1;.    
d420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d430: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
d440: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
d450: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
d460: 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
d470: 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  be.  ** written 
d480: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
d490: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
d4a0: 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
d4b0: 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74  rnal.  ** or bot
d4c0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72  h..  **.  ** Fir
d4d0: 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
d4e0: 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
d4f0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
d500: 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65  sts and.  ** cre
d510: 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
d520: 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s not..  */.  as
d530: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d540: 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f  ate!=SQLITE_UNLO
d550: 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  CK );.  rc = sql
d560: 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28 70  itepager_begin(p
d570: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21  Data);.  if( rc!
d580: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d590: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d5b0: 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45  r->state==SQLITE
d5c0: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20  _WRITELOCK );.  
d5d0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
d5e0: 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
d5f0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
d600: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d610: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
d620: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
d630: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d640: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
d650: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d660: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
d670: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
d680: 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al );.  pPager->
d690: 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 0a  dirtyFile = 1;..
d6a0: 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
d6b0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
d6c0: 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
d6d0: 61 76 65 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  ave a write lock
d6e0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69   on the.  ** mai
d6f0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
d700: 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
d710: 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
d720: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
d730: 2a 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  * journal if it 
d740: 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
d750: 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eady..  */.  if(
d760: 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
d770: 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
d780: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 66  ournal ){.    if
d790: 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
d7a0: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
d7b0: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
d7c0: 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20  int szPg;.      
d7d0: 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20  u32 saved;.     
d7e0: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
d7f0: 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52  mat>=JOURNAL_FOR
d800: 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 20 20 20  MAT_3 ){.       
d810: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61 67   u32 cksum = pag
d820: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
d830: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74   pPg->pgno, pDat
d840: 61 29 3b 0a 20 20 20 20 20 20 20 20 73 61 76 65  a);.        save
d850: 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52  d = *(u32*)PGHDR
d860: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b 0a  _TO_EXTRA(pPg);.
d870: 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
d880: 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20  its(cksum, pPg, 
d890: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
d8a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20  );.        szPg 
d8b0: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
d8c0: 5a 45 2b 38 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ZE+8;.      }els
d8d0: 65 7b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20  e{.        szPg 
d8e0: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
d8f0: 5a 45 2b 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ZE+4;.      }.  
d900: 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
d910: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20  pPg->pgno, pPg, 
d920: 2d 34 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  -4);.      rc = 
d930: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
d940: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63  Pager->jfd, &((c
d950: 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c  har*)pData)[-4],
d960: 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 69 66   szPg);.      if
d970: 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  ( journal_format
d980: 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  >=JOURNAL_FORMAT
d990: 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  _3 ){.        *(
d9a0: 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
d9b0: 54 52 41 28 70 50 67 29 20 3d 20 73 61 76 65 64  TRA(pPg) = saved
d9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d9d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d9e0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
d9f0: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
da00: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
da10: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
da20: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
da30: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72 65  FULL;.        re
da40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
da50: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
da60: 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Rec++;.      ass
da70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
da80: 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
da90: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
daa0: 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
dab0: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
dac0: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
dad0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
dae0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
daf0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
db00: 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  rnal = 1;.      
db10: 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  if( pPager->ckpt
db20: 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
db30: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
db40: 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
db50: 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
db60: 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
db70: 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74  add_to_ckpt_list
db80: 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
db90: 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55       TRACE3("JOU
dba0: 52 4e 41 4c 20 25 64 20 25 64 5c 6e 22 2c 20 70  RNAL %d %d\n", p
dbb0: 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
dbc0: 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65  eedSync);.    }e
dbd0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
dbe0: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
dbf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
dc00: 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
dc10: 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54 52 41  oSync;.      TRA
dc20: 43 45 33 28 22 41 50 50 45 4e 44 20 25 64 20 25  CE3("APPEND %d %
dc30: 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
dc40: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
dc50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
dc60: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
dc70: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
dc80: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
dc90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
dca0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
dcb0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
dcc0: 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
dcd0: 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68  t in it,.  ** th
dce0: 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
dcf0: 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
dd00: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
dd10: 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
dd20: 20 20 2a 2a 20 74 68 65 20 63 68 65 63 6b 70 6f    ** the checkpo
dd30: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61  int journal alwa
dd40: 79 73 20 75 73 65 73 20 74 68 65 20 73 69 6d 70  ys uses the simp
dd50: 6c 69 65 72 20 66 6f 72 6d 61 74 20 32 20 74 68  lier format 2 th
dd60: 61 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20 63 68  at lacks.  ** ch
dd70: 65 63 6b 73 75 6d 73 2e 20 20 54 68 65 20 68 65  ecksums.  The he
dd80: 61 64 65 72 20 69 73 20 61 6c 73 6f 20 6f 6d 69  ader is also omi
dd90: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 68  tted from the ch
dda0: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
ddb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
ddc0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26  ger->ckptInUse &
ddd0: 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26  & !pPg->inCkpt &
dde0: 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
ddf0: 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  <=pPager->ckptSi
de00: 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
de10: 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
de20: 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
de30: 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
de40: 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 74 6f  bSize );.    sto
de50: 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
de60: 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
de70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
de80: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 63 70  rite(&pPager->cp
de90: 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
dea0: 74 61 29 5b 2d 34 5d 2c 20 53 51 4c 49 54 45 5f  ta)[-4], SQLITE_
deb0: 50 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20 20  PAGE_SIZE+4);.  
dec0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ded0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
dee0: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
def0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
df00: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
df10: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
df20: 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  LL;.      return
df30: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
df40: 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63 2b  Pager->ckptNRec+
df50: 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
df60: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21 3d  Pager->aInCkpt!=
df70: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
df80: 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
df90: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
dfa0: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
dfb0: 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f  age_add_to_ckpt_
dfc0: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  list(pPg);.  }..
dfd0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
dfe0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
dff0: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
e000: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
e010: 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
e020: 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
e030: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
e040: 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
e050: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e060: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
e070: 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
e080: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
e090: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
e0a0: 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
e0b0: 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20  pager_write().  
e0c0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
e0d0: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
e0e0: 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
e0f0: 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
e100: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
e110: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
e120: 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69  _iswriteable(voi
e130: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
e140: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
e150: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
e160: 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
e170: 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
e180: 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
e190: 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
e1a0: 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
e1b0: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
e1c0: 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
e1d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
e1e0: 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50  ager_overwrite(P
e1f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
e200: 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
e210: 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Data){.  void *p
e220: 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
e230: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61  .  rc = sqlitepa
e240: 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
e250: 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
e260: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e270: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
e280: 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74 65  qlitepager_write
e290: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
e2a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e2b0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
e2c0: 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51 4c  Page, pData, SQL
e2d0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
e2e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e2f0: 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
e300: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
e310: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
e320: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
e330: 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
e340: 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
e350: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
e360: 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
e370: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
e380: 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f  e "pgno" back to
e390: 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
e3a0: 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
e3b0: 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
e3c0: 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
e3d0: 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
e3e0: 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
e3f0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
e400: 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
e410: 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
e420: 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
e430: 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
e440: 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
e450: 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
e460: 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
e470: 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
e480: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
e490: 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
e4a0: 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
e4b0: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
e4c0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 70 61 67 65  he.** sqlitepage
e4d0: 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
e4e0: 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
e4f0: 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
e500: 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
e510: 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
e520: 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
e530: 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
e540: 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
e550: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
e560: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
e570: 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
e580: 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
e590: 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
e5a0: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
e5b0: 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  epager_dont_roll
e5c0: 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
e5d0: 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
e5e0: 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
e5f0: 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
e600: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
e610: 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
e620: 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
e630: 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
e640: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
e650: 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
e660: 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
e670: 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
e680: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
e690: 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
e6a0: 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
e6b0: 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
e6c0: 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
e6d0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
e6e0: 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
e6f0: 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
e700: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
e710: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e720: 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
e730: 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64  reused,.** the d
e740: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72  ont_rollback() r
e750: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e760: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
e770: 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
e780: 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74  .** critical dat
e790: 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
e7a0: 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
e7b0: 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ets rolled back 
e7c0: 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74  in spite.** of t
e7d0: 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
e7e0: 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
e7f0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e   sqlitepager_don
e800: 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
e810: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
e820: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
e830: 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
e840: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
e850: 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  gno);.  pPg->alw
e860: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
e870: 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50  .  if( pPg && pP
e880: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
e890: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
e8a0: 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
e8b0: 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
e8c0: 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
e8d0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
e8e0: 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
e8f0: 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
e900: 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
e910: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
e920: 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
e930: 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
e940: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
e950: 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
e960: 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
e970: 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
e980: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e990: 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
e9a0: 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
e9b0: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
e9c0: 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
e9d0: 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
e9e0: 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
e9f0: 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
ea00: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
ea10: 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
ea20: 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
ea30: 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
ea40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
ea50: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
ea60: 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
ea70: 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
ea80: 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
ea90: 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
eaa0: 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
eab0: 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
eac0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
ead0: 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
eae0: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 44 4f        TRACE2("DO
eaf0: 4e 54 5f 57 52 49 54 45 20 25 64 5c 6e 22 2c 20  NT_WRITE %d\n", 
eb00: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 67  pgno);.      pPg
eb10: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
eb20: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
eb30: 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
eb40: 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
eb50: 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
eb60: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
eb70: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
eb80: 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
eb90: 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
eba0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
ebb0: 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
ebc0: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
ebd0: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
ebe0: 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
ebf0: 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
ec00: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
ec10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
ec20: 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
ec30: 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ck(void *pData){
ec40: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
ec50: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
ec60: 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
ec70: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
ec80: 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ger;..  if( pPag
ec90: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
eca0: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20 70  E_WRITELOCK || p
ecb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
ecc0: 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
ecd0: 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
ece0: 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
ecf0: 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
ed00: 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ack ) return;.  
ed10: 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
ed20: 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
ed30: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
ed40: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
ed50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ed60: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
ed70: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ed80: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
ed90: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
eda0: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
edb0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
edc0: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
edd0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29  ger->ckptInUse )
ede0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
edf0: 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e  aInCkpt[pPg->pgn
ee00: 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
ee10: 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
ee20: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74  page_add_to_ckpt
ee30: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
ee40: 7d 0a 20 20 20 20 54 52 41 43 45 32 28 22 44 4f  }.    TRACE2("DO
ee50: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  NT_ROLLBACK %d\n
ee60: 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ", pPg->pgno);. 
ee70: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
ee80: 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 21 70  >ckptInUse && !p
ee90: 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69  Pg->inCkpt && (i
eea0: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
eeb0: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29  ager->ckptSize )
eec0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
eed0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
eee0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
eef0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
ef00: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
ef10: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
ef20: 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
ef30: 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e  r->aInCkpt[pPg->
ef40: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
ef50: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
ef60: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70   page_add_to_ckp
ef70: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
ef80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
ef90: 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
efa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
efb0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
efc0: 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
efd0: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
efe0: 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
eff0: 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
f000: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
f010: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
f020: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
f030: 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
f040: 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
f050: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
f060: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
f070: 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  ger_commit(Pager
f080: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
f090: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
f0a0: 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
f0b0: 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52  ->errMask==PAGER
f0c0: 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
f0d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
f0e0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
f0f0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
f100: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f110: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
f120: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ULL;.    }.    r
f130: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
f140: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
f150: 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
f160: 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
f170: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
f180: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
f190: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
f1a0: 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  !=SQLITE_WRITELO
f1b0: 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
f1c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
f1d0: 20 7d 0a 20 20 54 52 41 43 45 31 28 22 43 4f 4d   }.  TRACE1("COM
f1e0: 4d 49 54 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70  MIT\n");.  if( p
f1f0: 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65  Pager->dirtyFile
f200: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78  ==0 ){.    /* Ex
f210: 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75  it early (withou
f220: 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65  t doing the time
f230: 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74  -consuming sqlit
f240: 65 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29  eOsSync() calls)
f250: 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65  .    ** if there
f260: 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
f270: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
f280: 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
f290: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f2a0: 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  r->needSync==0 )
f2b0: 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
f2c0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
f2d0: 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
f2e0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
f2f0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f300: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
f310: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
f320: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f330: 3e 6e 65 65 64 53 79 6e 63 20 26 26 20 73 71 6c  >needSync && sql
f340: 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65  iteOsSync(&pPage
f350: 72 2d 3e 6a 66 64 29 21 3d 53 51 4c 49 54 45 5f  r->jfd)!=SQLITE_
f360: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
f370: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
f380: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67  .  pPg = pager_g
f390: 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
f3a0: 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  es(pPager);.  if
f3b0: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20  ( pPg ){.    rc 
f3c0: 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
f3d0: 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
f3e0: 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61   if( rc || (!pPa
f3f0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73  ger->noSync && s
f400: 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61  qliteOsSync(&pPa
f410: 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45  ger->fd)!=SQLITE
f420: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  _OK) ){.      go
f430: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
f440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20  .    }.  }.  rc 
f450: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
f460: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
f470: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f480: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
f490: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
f4a0: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
f4b0: 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
f4c0: 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
f4d0: 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
f4e0: 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c  bort:.  rc = sql
f4f0: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
f500: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
f510: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f520: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
f530: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
f540: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f550: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
f560: 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
f570: 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
f580: 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f   to read-only mo
f590: 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
f5a0: 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
f5b0: 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
f5c0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
f5d0: 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
f5e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
f5f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
f600: 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
f610: 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
f620: 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
f630: 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
f640: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
f650: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53  king protocol (S
f660: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20  QLITE_PROTOCOL) 
f670: 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
f680: 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
f690: 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
f6a0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
f6b0: 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
f6c0: 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
f6d0: 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
f6e0: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
f6f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
f700: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
f710: 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
f720: 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
f730: 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
f740: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
f750: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
f760: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
f770: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
f780: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
f790: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41  .  int rc;.  TRA
f7a0: 43 45 31 28 22 52 4f 4c 4c 42 41 43 4b 5c 6e 22  CE1("ROLLBACK\n"
f7b0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
f7c0: 2d 3e 64 69 72 74 79 46 69 6c 65 20 7c 7c 20 21  ->dirtyFile || !
f7d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f7e0: 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
f7f0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
f800: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
f810: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f820: 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
f830: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f840: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
f850: 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
f860: 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
f870: 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
f880: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51  Pager->state>=SQ
f890: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
f8a0: 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
f8b0: 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
f8c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
f8d0: 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
f8e0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
f8f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
f900: 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te!=SQLITE_WRITE
f910: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
f920: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f930: 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70  }.  rc = pager_p
f940: 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
f950: 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  1);.  if( rc!=SQ
f960: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
f970: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
f980: 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  PT;.    pPager->
f990: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
f9a0: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
f9b0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
f9c0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
f9d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f9e0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
f9f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
fa00: 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
fa10: 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
fa20: 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
fa30: 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
fa40: 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
fa50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
fa60: 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
fa70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
fa80: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
fa90: 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
faa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fab0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
fac0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
fad0: 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
fae0: 69 74 65 70 61 67 65 72 5f 73 74 61 74 73 28 50  itepager_stats(P
faf0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
fb00: 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d   static int a[9]
fb10: 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
fb20: 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
fb30: 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
fb40: 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
fb50: 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
fb60: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
fb70: 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
fb80: 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
fb90: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ] = pPager->errM
fba0: 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ask;.  a[6] = pP
fbb0: 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
fbc0: 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
fbd0: 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
fbe0: 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65  ger->nOvfl;.  re
fbf0: 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn a;.}../*.**
fc00: 20 53 65 74 20 74 68 65 20 63 68 65 63 6b 70 6f   Set the checkpo
fc10: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
fc20: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
fc30: 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
fc40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
fc50: 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
fc60: 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63 68   open.  A new ch
fc70: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
fc80: 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
fc90: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
fca0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
fcb0: 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
fcc0: 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
fcd0: 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
fce0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
fcf0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
fd00: 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  _begin(Pager *pP
fd10: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
fd20: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
fd30: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
fd40: 5a 45 5d 3b 0a 20 20 69 66 28 20 21 70 50 61 67  ZE];.  if( !pPag
fd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
fd60: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  ){.    pPager->c
fd70: 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  kptAutoopen = 1;
fd80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fd90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
fda0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
fdb0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73  rnalOpen );.  as
fdc0: 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 63  sert( !pPager->c
fdd0: 6b 70 74 49 6e 55 73 65 20 29 3b 0a 20 20 70 50  kptInUse );.  pP
fde0: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20  ager->aInCkpt = 
fdf0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
fe00: 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
fe10: 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
fe20: 65 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29  er->aInCkpt==0 )
fe30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65  {.    sqliteOsRe
fe40: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
fe50: 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fd);.    return 
fe60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fe70: 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
fe80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
fe90: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
fea0: 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
feb0: 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  ckptJSize);.  if
fec0: 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74  ( rc ) goto ckpt
fed0: 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
fee0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
fef0: 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 3d 20 0a 20  >ckptJSize == . 
ff00: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a     pPager->nRec*
ff10: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f  JOURNAL_PG_SZ(jo
ff20: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a 4f  urnal_format)+JO
ff30: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75  URNAL_HDR_SZ(jou
ff40: 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b 0a  rnal_format) );.
ff50: 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
ff60: 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 70 50 61  >ckptJSize = pPa
ff70: 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41  ger->nRec*JOURNA
ff80: 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
ff90: 66 6f 72 6d 61 74 29 0a 20 20 20 20 20 20 20 20  format).        
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   + JOURNAL_HDR_S
ffc0: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
ffd0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  );.  pPager->ckp
ffe0: 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
fff0: 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70  dbSize;.  if( !p
10000 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
10010 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10020 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  tepager_opentemp
10030 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d  (zTemp, &pPager-
10040 3e 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20  >cpfd);.    if( 
10050 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62  rc ) goto ckpt_b
10060 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
10070 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
10080 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  n = 1;.    pPage
10090 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b  r->ckptNRec = 0;
100a0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63  .  }.  pPager->c
100b0 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  kptInUse = 1;.  
100c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
100d0 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f 66  ;. .ckpt_begin_f
100e0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61  ailed:.  if( pPa
100f0 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b 0a  ger->aInCkpt ){.
10100 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10110 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29 3b  Pager->aInCkpt);
10120 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
10130 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Ckpt = 0;.  }.  
10140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10150 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68 65  .** Commit a che
10160 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  ckpoint..*/.int 
10170 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
10180 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
10190 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
101a0 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
101b0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
101c0 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 73  g, *pNext;.    s
101d0 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
101e0 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20  ger->cpfd, 0);. 
101f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 4f 73 54 72     /* sqliteOsTr
10200 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
10210 63 70 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  cpfd, 0); */.   
10220 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65   pPager->ckptNRe
10230 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
10240 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 30  r->ckptInUse = 0
10250 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
10260 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
10270 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t );.    pPager-
10280 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20  >aInCkpt = 0;.  
10290 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
102a0 2d 3e 70 43 6b 70 74 3b 20 70 50 67 3b 20 70 50  ->pCkpt; pPg; pP
102b0 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
102c0 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
102d0 78 74 43 6b 70 74 3b 0a 20 20 20 20 20 20 61 73  xtCkpt;.      as
102e0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 43 6b 70  sert( pPg->inCkp
102f0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
10300 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  inCkpt = 0;.    
10310 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74    pPg->pPrevCkpt
10320 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70   = pPg->pNextCkp
10330 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
10340 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d   pPager->pCkpt =
10350 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
10360 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d  ->ckptAutoopen =
10370 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
10380 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10390 20 52 6f 6c 6c 62 61 63 6b 20 61 20 63 68 65 63   Rollback a chec
103a0 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  kpoint..*/.int s
103b0 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
103c0 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
103d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
103e0 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
103f0 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20  >ckptInUse ){.  
10400 20 20 72 63 20 3d 20 70 61 67 65 72 5f 63 6b 70    rc = pager_ckp
10410 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
10420 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61  r);.    sqlitepa
10430 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28  ger_ckpt_commit(
10440 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
10450 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
10460 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10470 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e  er->ckptAutoopen
10480 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
10490 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
104a0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
104b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
104c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
104d0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
104e0 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
104f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
10500 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
10510 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 23 69  zFilename;.}..#i
10520 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
10530 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
10540 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
10550 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
10560 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
10570 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
10580 74 65 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  tepager_refdump(
10590 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
105a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
105b0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
105c0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
105d0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
105e0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
105f0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
10600 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45      printf("PAGE
10610 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78   %3d addr=0x%08x
10620 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
10630 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
10640 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
10650 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
10660 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
10670 66 0a                                            f.