/ Hex Artifact Content
Login

Artifact dd1dfa4d929a58b44175f3117360ff1553671173:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 37 39  : pager.c,v 1.79
0350: 20 32 30 30 33 2f 30 33 2f 31 39 20 30 33 3a 31   2003/03/19 03:1
0360: 34 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a 2a  4:02 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
10b0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
10e0: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
10f0: 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   */.  /* SQLITE_
1100: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
1110: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1120: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1130: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1140: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1150: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1160: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1170: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
1180: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1190: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
11a0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
11b0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
11c0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
11d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
11e0: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
11f0: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
1200: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
1210: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
1220: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
1230: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
1240: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
1250: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1260: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f  E_PAGE_SIZE])../
1270: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1280: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1290: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
12a0: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
12b0: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
12c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
12d0: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
12e0: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
12f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1300: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1310: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1320: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1330: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1340: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1350: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1360: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1370: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1380: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1390: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
13a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
13d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
13f0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1400: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1420: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1430: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
1440: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
1450: 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20 20 20  File cpfd;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1480: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1490: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
14a0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
14b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14c0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14d0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
14e0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1500: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1510: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1520: 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20    int ckptSize; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1550: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1560: 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  ckpt_begin() */.
1570: 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a    off_t ckptJSiz
1580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1590: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
15a0: 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29   at ckpt_begin()
15b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15e0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
15f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1600: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1620: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
1630: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
1640: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
1650: 69 6e 74 20 63 6b 70 74 4e 52 65 63 3b 20 20 20  int ckptNRec;   
1660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1670: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
1680: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
1690: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
16a0: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
16d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
16e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
16f0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
1700: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61  r)(void*); /* Ca
1710: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1720: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1730: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  es */.  int nPag
1740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1750: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1760: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
1770: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1780: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17a0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
17b0: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
17c0: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
17d0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
17e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
17f0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
1800: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
1810: 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69  che */.  int nHi
1820: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
1830: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
1840: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
1850: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
1860: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
1870: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1880: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
1890: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18a0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
18b0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
18c0: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
18d0: 20 54 72 75 65 20 69 66 20 69 6e 69 74 69 61 6c   True if initial
18e0: 20 6d 61 67 69 63 20 6f 66 20 6a 6f 75 72 6e 61   magic of journa
18f0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
1900: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 44 6f 20 6e 6f 74 20 75 73 65 20 61 20 72 6f 6c  Do not use a rol
1930: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
1940: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1950: 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20  u8 ckptOpen;    
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1970: 72 75 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  rue if the check
1980: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  point journal is
1990: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b   open */.  u8 ck
19a0: 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  ptInUse;        
19b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
19c0: 65 20 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b  e are in a check
19d0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 63 6b  point */.  u8 ck
19e0: 70 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  ptAutoopen;     
19f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
1a00: 6b 70 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  kpt journal when
1a10: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
1a20: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
1a30: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
1a40: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a50: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
1a60: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
1a70: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1a90: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
1aa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1ab0: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
1ac0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f  SQLITE_UNLOCK, _
1af0: 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49  READLOCK or _WRI
1b00: 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65  TELOCK */.  u8 e
1b10: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
1b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
1b50: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1b70: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
1b80: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
1b90: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
1bc0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1bd0: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
1c00: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
1c10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c20: 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b  .  u8 dirtyFile;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62 61  * True if databa
1c50: 73 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  se file has chan
1c60: 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a  ged in any way *
1c70: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c80: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c90: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1ca0: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  rollback() for a
1cb0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1cc0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
1cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1ce0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
1cf0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1d00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
1d10: 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20  *aInCkpt;       
1d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1d30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
1d40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1d50: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  e */.  PgHdr *pF
1d60: 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20  irst, *pLast;   
1d70: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1d80: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
1d90: 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65  Hdr *pFirstSynce
1da0: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d;        /* Fir
1db0: 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74  st free page wit
1dc0: 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  h PgHdr.needSync
1dd0: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
1de0: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
1df0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e00: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
1e10: 67 48 64 72 20 2a 70 43 6b 70 74 3b 20 20 20 20  gHdr *pCkpt;    
1e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1e30: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
1e40: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
1e50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
1e60: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
1e70: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
1e80: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
1e90: 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72   number of PgHdr
1ea0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1eb0: 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61  ese are bits tha
1ec0: 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20  t can be set in 
1ed0: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a  Pager.errMask..*
1ee0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1ef0: 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30  ERR_FULL     0x0
1f00: 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20  1  /* a write() 
1f10: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
1f20: 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20  e PAGER_ERR_MEM 
1f30: 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61       0x02  /* ma
1f40: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f  lloc() failed */
1f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1f60: 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34  RR_LOCK     0x04
1f70: 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68    /* error in th
1f80: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
1f90: 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ol */.#define PA
1fa0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
1fb0: 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61   0x08  /* databa
1fc0: 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f  se or journal co
1fd0: 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  rruption */.#def
1fe0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49  ine PAGER_ERR_DI
1ff0: 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20  SK     0x10  /* 
2000: 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f  general disk I/O
2010: 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72   error - bad har
2020: 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a  d drive? */../*.
2030: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
2040: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67  ile contains pag
2050: 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
2060: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f   following.** fo
2070: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75  rmat..**.** Actu
2080: 61 6c 6c 79 2c 20 74 68 69 73 20 73 74 72 75 63  ally, this struc
2090: 74 75 72 65 20 69 73 20 74 68 65 20 63 6f 6d 70  ture is the comp
20a0: 6c 65 74 65 20 70 61 67 65 20 72 65 63 6f 72 64  lete page record
20b0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66 6f   for pager.** fo
20c0: 72 6d 61 74 73 20 6c 65 73 73 20 74 68 61 6e 20  rmats less than 
20d0: 33 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20 77 69  3.  Beginning wi
20e0: 74 68 20 66 6f 72 6d 61 74 20 33 2c 20 74 68 69  th format 3, thi
20f0: 73 20 72 65 63 6f 72 64 20 69 73 20 73 75 72 72  s record is surr
2100: 6f 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77 6f  ounded.** by two
2110: 20 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74   checksums..*/.t
2120: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
2130: 67 65 52 65 63 6f 72 64 20 50 61 67 65 52 65 63  geRecord PageRec
2140: 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65  ord;.struct Page
2150: 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20  Record {.  Pgno 
2160: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2180: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2190: 20 20 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c    char aData[SQL
21a0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20  ITE_PAGE_SIZE]; 
21b0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74   /* Original dat
21c0: 61 20 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20  a for page pgno 
21d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  */.};../*.** Jou
21e0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
21f0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
2200: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
2210: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
2220: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2230: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
2240: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
2250: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
2260: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2270: 65 20 74 68 72 65 65 20 6a 6f 75 72 6e 61 6c 20  e three journal 
2280: 66 6f 72 6d 61 74 73 20 28 73 6f 20 66 61 72 29  formats (so far)
2290: 2e 20 54 68 65 20 31 73 74 20 6a 6f 75 72 6e 61  . The 1st journa
22a0: 6c 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a  l format writes.
22b0: 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ** 32-bit intege
22c0: 72 73 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f  rs in the byte-o
22d0: 72 64 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74  rder of the host
22e0: 20 6d 61 63 68 69 6e 65 2e 20 20 4e 65 77 0a 2a   machine.  New.*
22f0: 2a 20 66 6f 72 6d 61 74 73 20 77 72 69 74 65 73  * formats writes
2300: 20 69 6e 74 65 67 65 72 73 20 61 73 20 62 69 67   integers as big
2310: 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65  -endian.  All ne
2320: 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74  w journals use t
2330: 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74  he.** new format
2340: 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 74 6f  , but we have to
2350: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64   be able to read
2360: 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61   an older journa
2370: 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  l in order.** to
2380: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2390: 6c 73 20 63 72 65 61 74 65 64 20 62 79 20 6f 6c  ls created by ol
23a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
23b0: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a  the library..**.
23c0: 2a 2a 20 54 68 65 20 33 72 64 20 6a 6f 75 72 6e  ** The 3rd journ
23d0: 61 6c 20 66 6f 72 6d 61 74 20 28 61 64 64 65 64  al format (added
23e0: 20 66 6f 72 20 32 2e 38 2e 30 29 20 61 64 64 73   for 2.8.0) adds
23f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
2400: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
2410: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2420: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
2430: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
2440: 68 69 6c 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  hile the.** jour
2450: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
2460: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
2470: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
2480: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 0a 2a  ight appear in.*
2490: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
24a0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
24b0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
24c0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
24d0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
24e0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
24f0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2500: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
2510: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
2520: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
2530: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
2540: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
2550: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
2560: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
2570: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
2580: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
2590: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
25a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
25b0: 68 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66  he 3rd journal f
25c0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
25d0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
25e0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
25f0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
2600: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
2610: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
2620: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
2630: 65 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e SQLITE_PAGE_SI
2640: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
2650: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
2660: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
2670: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
2680: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
2690: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
26a0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
26b0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
26c0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
26d0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
26e0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
26f0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
2700: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
2710: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2720: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
2730: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
2740: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
2750: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
2760: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
2770: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
2780: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
2790: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
27a0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
27b0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
27c0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
27d0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
27e0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
27f0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
2800: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
2810: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
2820: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
2830: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
2840: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
2850: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2860: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
2870: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 5b 5d 20 3d  ournalMagic1[] =
2880: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
2890: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
28a0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
28b0: 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63  xd4,.};.static c
28c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
28d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
28e0: 32 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  2[] = {.  0xd9, 
28f0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
2900: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
2910: 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 73 74 61  63, 0xd5,.};.sta
2920: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
2930: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
2940: 4d 61 67 69 63 33 5b 5d 20 3d 20 7b 0a 20 20 30  Magic3[] = {.  0
2950: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
2960: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
2970: 31 2c 20 30 78 36 33 2c 20 30 78 64 36 2c 0a 7d  1, 0x63, 0xd6,.}
2980: 3b 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  ;.#define JOURNA
2990: 4c 5f 46 4f 52 4d 41 54 5f 31 20 31 0a 23 64 65  L_FORMAT_1 1.#de
29a0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  fine JOURNAL_FOR
29b0: 4d 41 54 5f 32 20 32 0a 23 64 65 66 69 6e 65 20  MAT_2 2.#define 
29c0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33  JOURNAL_FORMAT_3
29d0: 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   3../*.** The fo
29e0: 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20  llowing integer 
29f0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 61 74 20  determines what 
2a00: 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 77 68  format to use wh
2a10: 65 6e 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20 6e  en creating.** n
2a20: 65 77 20 70 72 69 6d 61 72 79 20 6a 6f 75 72 6e  ew primary journ
2a30: 61 6c 20 66 69 6c 65 73 2e 20 20 42 79 20 64 65  al files.  By de
2a40: 66 61 75 6c 74 20 77 65 20 61 6c 77 61 79 73 20  fault we always 
2a50: 75 73 65 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a  use format 3..**
2a60: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 77   When testing, w
2a70: 65 20 63 61 6e 20 73 65 74 20 74 68 69 73 20 76  e can set this v
2a80: 61 6c 75 65 20 74 6f 20 6f 6c 64 65 72 20 6a 6f  alue to older jo
2a90: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 69 6e  urnal formats in
2aa0: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b   order to.** mak
2ab0: 65 20 73 75 72 65 20 74 68 61 74 20 6e 65 77 65  e sure that newe
2ac0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  r versions of th
2ad0: 65 20 6c 69 62 72 61 72 79 20 61 72 65 20 61 62  e library are ab
2ae0: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  le to rollback o
2af0: 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  lder.** journal 
2b00: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  files..**.** Not
2b10: 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e  e that checkpoin
2b20: 74 20 6a 6f 75 72 6e 61 6c 73 20 61 6c 77 61 79  t journals alway
2b30: 73 20 75 73 65 20 66 6f 72 6d 61 74 20 32 20 61  s use format 2 a
2b40: 6e 64 20 6f 6d 69 74 20 74 68 65 20 68 65 61 64  nd omit the head
2b50: 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  er..*/.#ifdef SQ
2b60: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 6a 6f  LITE_TEST.int jo
2b70: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d 20 33  urnal_format = 3
2b80: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2b90: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20   journal_format 
2ba0: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
2bb0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
2bc0: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
2bd0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
2be0: 6f 75 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63  ournal varies ac
2bf0: 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68  cording.** to wh
2c00: 69 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ich journal form
2c10: 61 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  at is being used
2c20: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2c30: 20 6d 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f   macros figure o
2c40: 75 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20  ut.** the sizes 
2c50: 62 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20  based on format 
2c60: 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66  numbers..*/.#def
2c70: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
2c80: 53 5a 28 58 29 20 5c 0a 20 20 20 28 73 69 7a 65  SZ(X) \.   (size
2c90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2ca0: 31 29 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f  1) + sizeof(Pgno
2cb0: 29 20 2b 20 28 28 58 29 3e 3d 33 29 2a 32 2a 73  ) + ((X)>=3)*2*s
2cc0: 69 7a 65 6f 66 28 75 33 32 29 29 0a 23 64 65 66  izeof(u32)).#def
2cd0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
2ce0: 5a 28 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54  Z(X) \.   (SQLIT
2cf0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69  E_PAGE_SIZE + si
2d00: 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58  zeof(Pgno) + ((X
2d10: 29 3e 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32  )>=3)*sizeof(u32
2d20: 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  ))../*.** Enable
2d30: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2d40: 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a   tracking here:.
2d50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2d60: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
2d70: 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  r_refinfo_enable
2d80: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
2d90: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
2da0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
2db0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
2dc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
2dd0: 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  ger_refinfo_enab
2de0: 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  le ) return;.   
2df0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20   printf(.       
2e00: 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64  "REFCNT: %4d add
2e10: 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
2e20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
2e30: 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f  gno, (int)PGHDR_
2e40: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
2e50: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
2e60: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
2e70: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
2e80: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
2e90: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
2ea0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
2eb0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
2ec0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
2ed0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
2ee0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
2ef0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
2f00: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
2f10: 69 70 74 6f 72 0a 2a 2f 0a 73 74 61 74 69 63 20  iptor.*/.static 
2f20: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 69  int read32bits(i
2f30: 6e 74 20 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c  nt format, OsFil
2f40: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
2f50: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
2f60: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
2f70: 71 6c 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20  qliteOsRead(fd, 
2f80: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
2f90: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
2fa0: 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61  LITE_OK && forma
2fb0: 74 3e 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  t>JOURNAL_FORMAT
2fc0: 5f 31 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  _1 ){.    unsign
2fd0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
2fe0: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
2ff0: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
3000: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
3010: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
3020: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
3030: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
3040: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
3050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3060: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3070: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
3080: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3090: 2e 20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73  .  Writing.** is
30a0: 20 61 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69   always done usi
30b0: 6e 67 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  ng the new journ
30c0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74  al format..*/.st
30d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
30e0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
30f0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
3100: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
3110: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
3120: 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20  format<=1 ){.   
3130: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73   return sqliteOs
3140: 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20  Write(fd, &val, 
3150: 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20  4);.  }.  ac[0] 
3160: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3170: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
3180: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
3190: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
31a0: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
31b0: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
31c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
31d0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
31e0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  4);.}../*.** Wri
31f0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
3200: 67 65 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20  ger into a page 
3210: 68 65 61 64 65 72 20 72 69 67 68 74 20 62 65 66  header right bef
3220: 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ore the.** page 
3230: 64 61 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c  data.  This will
3240: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 50   overwrite the P
3250: 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
3260: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
3270: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
3280: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
3290: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
32a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32b0: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 63  *ac;.  ac = &((c
32c0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
32d0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
32e0: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
32f0: 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 6d  rmat<=1 ){.    m
3300: 65 6d 63 70 79 28 61 63 2c 20 26 76 61 6c 2c 20  emcpy(ac, &val, 
3310: 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
3320: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
3330: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  4) & 0xff;.    a
3340: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
3350: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b   & 0xff;.    ac[
3360: 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20  2] = (val>>8) & 
3370: 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 33 5d 20  0xff;.    ac[3] 
3380: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3390: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  }.}.../*.** Conv
33a0: 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  ert the bits in 
33b0: 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  the pPager->errM
33c0: 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ask into an appr
33d0: 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e  oprate.** return
33e0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
33f0: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f   int pager_errco
3400: 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
3410: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3420: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
3430: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3440: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3450: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
3460: 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28  _PROTOCOL;.  if(
3470: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3480: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53   & PAGER_ERR_DIS
3490: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
34a0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20  TE_IOERR;.  if( 
34b0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
34c0: 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  & PAGER_ERR_FULL
34d0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
34e0: 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50  E_FULL;.  if( pP
34f0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3500: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20  PAGER_ERR_MEM ) 
3510: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3520: 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61  NOMEM;.  if( pPa
3530: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3540: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3550: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
3560: 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e  ORRUPT;.  return
3570: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
3580: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
3590: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
35a0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
35b0: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
35c0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
35d0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
35e0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
35f0: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
3600: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
3610: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
3620: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
3630: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
3640: 20 74 68 65 20 73 71 6c 69 74 65 70 61 67 65 72   the sqlitepager
3650: 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _ckpt_commit().*
3660: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
3670: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
3680: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
3690: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
36a0: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
36b0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
36c0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
36d0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
36e0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
36f0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63  id page_add_to_c
3700: 6b 70 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  kpt_list(PgHdr *
3710: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
3720: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
3730: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
3740: 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b  inCkpt ) return;
3750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
3760: 70 50 72 65 76 43 6b 70 74 3d 3d 30 20 26 26 20  pPrevCkpt==0 && 
3770: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d  pPg->pNextCkpt==
3780: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
3790: 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20 69 66 28  vCkpt = 0;.  if(
37a0: 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 29   pPager->pCkpt )
37b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43  {.    pPager->pC
37c0: 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d  kpt->pPrevCkpt =
37d0: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
37e0: 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 61  >pNextCkpt = pPa
37f0: 67 65 72 2d 3e 70 43 6b 70 74 3b 0a 20 20 70 50  ger->pCkpt;.  pP
3800: 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50  ager->pCkpt = pP
3810: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74  g;.  pPg->inCkpt
3820: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
3830: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
3840: 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 50  from_ckpt_list(P
3850: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
3860: 28 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29  ( !pPg->inCkpt )
3870: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3880: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 29 7b  Pg->pPrevCkpt ){
3890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
38a0: 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65  ->pPrevCkpt->pNe
38b0: 78 74 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  xtCkpt==pPg );. 
38c0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70     pPg->pPrevCkp
38d0: 74 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70  t->pNextCkpt = p
38e0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20  Pg->pNextCkpt;. 
38f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3900: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
3910: 3e 70 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20  >pCkpt==pPg );. 
3920: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
3930: 70 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pCkpt = pPg->pNe
3940: 78 74 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 69 66  xtCkpt;.  }.  if
3950: 28 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  ( pPg->pNextCkpt
3960: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3970: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e  pPg->pNextCkpt->
3980: 70 50 72 65 76 43 6b 70 74 3d 3d 70 50 67 20 29  pPrevCkpt==pPg )
3990: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
39a0: 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20  Ckpt->pPrevCkpt 
39b0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74  = pPg->pPrevCkpt
39c0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
39d0: 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50  xtCkpt = 0;.  pP
39e0: 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30  g->pPrevCkpt = 0
39f0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20  ;.  pPg->inCkpt 
3a00: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
3a10: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
3a20: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
3a30: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
3a40: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
3a50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3a60: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
3a70: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
3a80: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
3a90: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
3aa0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
3ab0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
3ac0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
3ad0: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
3ae0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
3af0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
3b00: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
3b10: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
3b20: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
3b30: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
3b40: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
3b50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
3b60: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
3b70: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
3b80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
3b90: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
3ba0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
3bb0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
3bc0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
3bd0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
3be0: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
3bf0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
3c00: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
3c10: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
3c20: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
3c30: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
3c40: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
3c50: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
3c60: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
3c70: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
3c80: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
3c90: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
3ca0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3cb0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
3cc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
3cd0: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
3ce0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
3cf0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
3d00: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
3d10: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
3d20: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
3d30: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
3d40: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
3d50: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
3d60: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
3d70: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
3d80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
3d90: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
3da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61   ){.    sqlitepa
3db0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
3dc0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
3dd0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
3de0: 65 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65  er->fd);.  pPage
3df0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
3e00: 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  E_UNLOCK;.  pPag
3e10: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
3e20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
3e30: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
3e40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
3e50: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
3e60: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
3e70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
3e80: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
3e90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
3ea0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74  en and.** a writ
3eb0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
3ec0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
3ed0: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74  utine releases t
3ee0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77  he database.** w
3ef0: 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  rite lock and ac
3f00: 71 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f  quires a read lo
3f10: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
3f20: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
3f30: 6c 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64  le.** is deleted
3f40: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a   and closed..*/.
3f50: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
3f60: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
3f70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3f80: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
3f90: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
3fa0: 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f  r->state<SQLITE_
3fb0: 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75  WRITELOCK ) retu
3fc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3fd0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
3fe0: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
3ff0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
4000: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  kptOpen ){.    s
4010: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
4020: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
4030: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
4040: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
4050: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4060: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
4070: 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  teOsClose(&pPage
4080: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
4090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
40a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
40b0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
40c0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
40d0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
40e0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
40f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
4100: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
4110: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
4120: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
4130: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
4140: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
4150: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
4160: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
4170: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
4180: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
41a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
41b0: 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  tyFile==0 || pPa
41c0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
41d0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  =0 );.  }.  rc =
41e0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
41f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
4200: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
4220: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
4230: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65  E_READLOCK;.  }e
4240: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
4250: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
4260: 20 69 66 20 61 20 70 72 6f 63 65 73 73 20 64 6f   if a process do
4270: 65 73 20 61 20 42 45 47 49 4e 2c 20 74 68 65 6e  es a BEGIN, then
4280: 20 66 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a 20   forks and the. 
4290: 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63     ** child proc
42a0: 65 73 73 20 64 6f 65 73 20 74 68 65 20 43 4f 4d  ess does the COM
42b0: 4d 49 54 2e 20 20 42 65 63 61 75 73 65 20 6f 66  MIT.  Because of
42c0: 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
42d0: 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69  f unix.    ** fi
42e0: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20  le locking, the 
42f0: 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c  unlock will fail
4300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
4310: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
4320: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  ITE_UNLOCK;.  }.
4330: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4340: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
4350: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
4360: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
4370: 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61   of data..*/.sta
4380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
4390: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
43a0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
43b0: 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29  nst char *aData)
43c0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
43d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
43e0: 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75  t + pgno;.  retu
43f0: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
4410: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
4420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
4430: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
4440: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
4450: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
4460: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
4470: 72 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66  re are three dif
4480: 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  ferent journal f
4490: 6f 72 6d 61 74 73 2e 20 20 54 68 65 20 66 6f 72  ormats.  The for
44a0: 6d 61 74 20 70 61 72 61 6d 65 74 65 72 20 64 65  mat parameter de
44b0: 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 69 63  termines.** whic
44c0: 68 20 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64  h format is used
44d0: 20 62 79 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   by the journal 
44e0: 74 68 61 74 20 69 73 20 70 6c 61 79 65 64 20 62  that is played b
44f0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
4500: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
4510: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
4520: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
4530: 20 2a 6a 66 64 2c 20 69 6e 74 20 66 6f 72 6d 61   *jfd, int forma
4540: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
4550: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
4560: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
4570: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
4580: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
4590: 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b  ageRecord pgRec;
45a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 0a 20  .  u32 cksum;.. 
45b0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
45c0: 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 70  (format, jfd, &p
45d0: 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66  gRec.pgno);.  if
45e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
45f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
4600: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
4610: 28 6a 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61  (jfd, &pgRec.aDa
4620: 74 61 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63  ta, sizeof(pgRec
4630: 2e 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20  .aData));.  if( 
4640: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
4650: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
4660: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
4670: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
4680: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
4690: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
46a0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
46b0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
46c0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
46d0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
46e0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
46f0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
4700: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
4710: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
4720: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
4730: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
4740: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
4750: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
4760: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
4770: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
4780: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
4790: 28 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20  ( pgRec.pgno==0 
47a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
47b0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
47c0: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e   if( pgRec.pgno>
47d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
47e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
47f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
4800: 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41  ( format>=JOURNA
4810: 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20  L_FORMAT_3 ){.  
4820: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
4830: 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26  s(format, jfd, &
4840: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
4850: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
4860: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
4870: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 52 65  sum(pPager, pgRe
4880: 63 2e 70 67 6e 6f 2c 20 70 67 52 65 63 2e 61 44  c.pgno, pgRec.aD
4890: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
48a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
48b0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
48c0: 20 7d 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63   }..  /* Playbac
48d0: 6b 20 74 68 65 20 70 61 67 65 2e 20 20 55 70 64  k the page.  Upd
48e0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
48f0: 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61  y copy of the pa
4900: 67 65 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73  ge.  ** at the s
4910: 61 6d 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65  ame time, if the
4920: 72 65 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  re is one..  */.
4930: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
4940: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 52  okup(pPager, pgR
4950: 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 54 52 41 43  ec.pgno);.  TRAC
4960: 45 32 28 22 50 4c 41 59 42 41 43 4b 20 25 64 5c  E2("PLAYBACK %d\
4970: 6e 22 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b  n", pgRec.pgno);
4980: 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28  .  sqliteOsSeek(
4990: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
49a0: 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  Rec.pgno-1)*(off
49b0: 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  _t)SQLITE_PAGE_S
49c0: 49 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IZE);.  rc = sql
49d0: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
49e0: 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44  er->fd, pgRec.aD
49f0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
4a00: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 70 50  _SIZE);.  if( pP
4a10: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  g ){.    if( pPg
4a20: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 0a 20 20 20  ->nRef==0 ||.   
4a30: 20 20 20 20 20 6d 65 6d 63 6d 70 28 50 47 48 44       memcmp(PGHD
4a40: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
4a50: 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c  pgRec.aData, SQL
4a60: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3d 3d  ITE_PAGE_SIZE)==
4a70: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  0.    ){.      /
4a80: 2a 20 44 6f 20 6e 6f 74 20 75 70 64 61 74 65 20  * Do not update 
4a90: 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 69 73  the data on this
4aa0: 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
4ab0: 65 20 69 73 20 69 6e 20 75 73 65 0a 20 20 20 20  e is in use.    
4ac0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 70 61 67    ** and the pag
4ad0: 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
4ae0: 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73   modified.  This
4af0: 20 61 76 6f 69 64 73 20 72 65 73 65 74 74 69 6e   avoids resettin
4b00: 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 22  g.      ** the "
4b10: 65 78 74 72 61 22 20 64 61 74 61 2e 20 20 54 68  extra" data.  Th
4b20: 61 74 20 69 6e 20 74 75 72 6e 20 61 76 6f 69 64  at in turn avoid
4b30: 73 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 42  s invalidating B
4b40: 54 72 65 65 20 63 75 72 73 6f 72 73 0a 20 20 20  Tree cursors.   
4b50: 20 20 20 2a 2a 20 69 6e 20 74 72 65 65 73 20 74     ** in trees t
4b60: 68 61 74 20 68 61 76 65 20 6e 65 76 65 72 20 62  hat have never b
4b70: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
4b80: 68 65 20 65 6e 64 20 72 65 73 75 6c 74 20 69 73  he end result is
4b90: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 79   that.      ** y
4ba0: 6f 75 20 63 61 6e 20 68 61 76 65 20 61 20 53 45  ou can have a SE
4bb0: 4c 45 43 54 20 67 6f 69 6e 67 20 6f 6e 20 69 6e  LECT going on in
4bc0: 20 6f 6e 65 20 74 61 62 6c 65 20 61 6e 64 20 52   one table and R
4bd0: 4f 4c 4c 42 41 43 4b 20 63 68 61 6e 67 65 73 0a  OLLBACK changes.
4be0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 64 69        ** to a di
4bf0: 66 66 65 72 65 6e 74 20 74 61 62 6c 65 20 61 6e  fferent table an
4c00: 64 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  d the SELECT is 
4c10: 75 6e 61 66 66 65 63 74 65 64 20 62 79 20 74 68  unaffected by th
4c20: 65 20 52 4f 4c 4c 42 41 43 4b 2e 0a 20 20 20 20  e ROLLBACK..    
4c30: 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 63 70    */.      memcp
4c40: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
4c50: 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44 61 74  pPg), pgRec.aDat
4c60: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
4c70: 49 5a 45 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  IZE);.      mems
4c80: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
4c90: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
4ca0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
4cb0: 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  }.    pPg->dirty
4cc0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 0;.    pPg->n
4cd0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  eedSync = 0;.  }
4ce0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4cf0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
4d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
4d10: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
4d20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
4d30: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
4d40: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
4d50: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
4d60: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
4d70: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
4d80: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
4d90: 20 66 6f 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65   follows:  There
4da0: 20 69 73 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a   is an initial.*
4db0: 2a 20 66 69 6c 65 2d 74 79 70 65 20 73 74 72 69  * file-type stri
4dc0: 6e 67 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ng for sanity ch
4dd0: 65 63 6b 69 6e 67 2e 20 20 54 68 65 6e 20 74 68  ecking.  Then th
4de0: 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 0a  ere is a single.
4df0: 2a 2a 20 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77  ** Pgno number w
4e00: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
4e10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4e20: 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
4e30: 72 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 65  re.** changes we
4e40: 72 65 20 6d 61 64 65 2e 20 20 54 68 65 20 64 61  re made.  The da
4e50: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
4e60: 74 65 64 20 74 6f 20 74 68 69 73 20 73 69 7a 65  ted to this size
4e70: 2e 0a 2a 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a  ..** Next come z
4e80: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
4e90: 20 72 65 63 6f 72 64 73 20 77 68 65 72 65 20 65   records where e
4ea0: 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 0a  ach page record.
4eb0: 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
4ec0: 20 50 67 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45   Pgno and SQLITE
4ed0: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
4ee0: 20 6f 66 20 64 61 74 61 2e 20 20 53 65 65 0a 2a   of data.  See.*
4ef0: 2a 20 74 68 65 20 50 61 67 65 52 65 63 6f 72 64  * the PageRecord
4f00: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 64   structure for d
4f10: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  etails..**.** If
4f20: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
4f30: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
4f40: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
4f50: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
4f60: 72 6e 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65  rnal file (as de
4f70: 74 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b  termined by look
4f80: 69 6e 67 20 61 74 20 74 68 65 20 6d 61 67 69 63  ing at the magic
4f90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68   number.** at th
4fa0: 65 20 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65  e beginning) the
4fb0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
4fc0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52  eturns SQLITE_PR
4fd0: 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e  OTOCOL..** If an
4fe0: 79 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f  y other errors o
4ff0: 63 63 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79  ccur during play
5000: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
5010: 73 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c  se will.** likel
5020: 79 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  y be corrupted, 
5030: 73 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52  so the PAGER_ERR
5040: 5f 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20  _CORRUPT bit is 
5050: 73 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72  set in.** pPager
5060: 2d 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51  ->errMask and SQ
5070: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
5080: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74  returned.  If it
5090: 20 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74   all.** works, t
50a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
50b0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
50c0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
50d0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
50e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
50f0: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69  int useJournalSi
5100: 7a 65 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a  ze){.  off_t szJ
5110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5120: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
5130: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
5140: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ytes */.  int nR
5150: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
5160: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5170: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
5180: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
5190: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
51a0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
51b0: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
51c0: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
51d0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
51e0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
51f0: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
5200: 74 20 66 6f 72 6d 61 74 3b 20 20 20 20 20 20 20  t format;       
5210: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74         /* Format
5220: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
5230: 66 69 6c 65 2e 20 2a 2f 0a 20 20 75 6e 73 69 67  file. */.  unsig
5240: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5250: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
5260: 61 67 69 63 31 29 5d 3b 0a 20 20 69 6e 74 20 72  agic1)];.  int r
5270: 63 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  c;..  /* Figure 
5280: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
5290: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
52a0: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
52b0: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
52c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
52d0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
52e0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
52f0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
5300: 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  teOsSeek(&pPager
5310: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63 20  ->jfd, 0);.  rc 
5320: 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  = sqliteOsFileSi
5330: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
5340: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
5350: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5360: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
5370: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  back;.  }.  if( 
5380: 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61  szJ < sizeof(aMa
5390: 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f  gic)+sizeof(Pgno
53a0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ) ){.    goto en
53b0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
53c0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62  .  /* Read the b
53d0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
53e0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e  journal and trun
53f0: 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61  cate the.  ** da
5400: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
5410: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
5420: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
5430: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
5440: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  &pPager->jfd, aM
5450: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
5460: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21  gic));.  if( rc!
5470: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5480: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
5490: 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f  OTOCOL;.    goto
54a0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
54b0: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
54c0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
54d0: 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66 28 61  Magic3, sizeof(a
54e0: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
54f0: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
5500: 41 4c 5f 46 4f 52 4d 41 54 5f 33 3b 0a 20 20 7d  AL_FORMAT_3;.  }
5510: 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28  else if( memcmp(
5520: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5530: 4d 61 67 69 63 32 2c 20 73 69 7a 65 6f 66 28 61  Magic2, sizeof(a
5540: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
5550: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
5560: 41 4c 5f 46 4f 52 4d 41 54 5f 32 3b 0a 20 20 7d  AL_FORMAT_2;.  }
5570: 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28  else if( memcmp(
5580: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5590: 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61  Magic1, sizeof(a
55a0: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
55b0: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
55c0: 41 4c 5f 46 4f 52 4d 41 54 5f 31 3b 0a 20 20 7d  AL_FORMAT_1;.  }
55d0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
55e0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
55f0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
5600: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  yback;.  }.  if(
5610: 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c   format>=JOURNAL
5620: 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
5630: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5640: 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72  (format, &pPager
5650: 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20  ->jfd, &nRec);. 
5660: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
5670: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
5680: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
5690: 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67  ts(format, &pPag
56a0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
56b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
56c0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
56d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
56e0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
56f0: 66 66 66 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75  ffffff || useJou
5700: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
5710: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
5720: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 33  JOURNAL_HDR_SZ(3
5730: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
5740: 28 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  (3);.    }.  }el
5750: 73 65 7b 0a 20 20 20 20 6e 52 65 63 20 3d 20 28  se{.    nRec = (
5760: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
5770: 52 5f 53 5a 28 32 29 29 2f 4a 4f 55 52 4e 41 4c  R_SZ(2))/JOURNAL
5780: 5f 50 47 5f 53 5a 28 32 29 3b 0a 20 20 20 20 61  _PG_SZ(2);.    a
5790: 73 73 65 72 74 28 20 6e 52 65 63 2a 4a 4f 55 52  ssert( nRec*JOUR
57a0: 4e 41 4c 5f 50 47 5f 53 5a 28 32 29 2b 4a 4f 55  NAL_PG_SZ(2)+JOU
57b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32 29 3d 3d  RNAL_HDR_SZ(2)==
57c0: 73 7a 4a 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  szJ );.  }.  rc 
57d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
57e0: 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  mat, &pPager->jf
57f0: 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28  d, &mxPg);.  if(
5800: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5810: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
5820: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 61  layback;.  }.  a
5830: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
5840: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
5850: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
5860: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72 63  ze==mxPg );.  rc
5870: 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63   = sqliteOsTrunc
5880: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
5890: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
58a0: 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a  E*(off_t)mxPg);.
58b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
58c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
58d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
58e0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
58f0: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20  ze = mxPg;.  .  
5900: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
5910: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
5920: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
5930: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
5940: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
5950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
5960: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  c; i++){.    rc 
5970: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
5980: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
5990: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
59a0: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28  format);.    if(
59b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
59c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
59d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
59e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
59f0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
5a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65  }.  }..  /* Page
5a20: 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
5a30: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
5a40: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65  journal but neve
5a50: 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68  r synced.  ** wh
5a60: 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64  ere not restored
5a70: 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f   by the loop abo
5a80: 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ve.  We have to 
5a90: 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20  restore those.  
5aa0: 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64  ** pages by read
5ab0: 69 6e 67 20 74 68 65 20 62 61 63 6b 20 66 72 6f  ing the back fro
5ac0: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  m the original d
5ad0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
5ae0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5af0: 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
5b00: 70 50 67 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  pPg;.    for(pPg
5b10: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
5b20: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
5b30: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 63 68  xtAll){.      ch
5b40: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50  ar zBuf[SQLITE_P
5b50: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20  AGE_SIZE];.     
5b60: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
5b70: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5b80: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
5b90: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
5ba0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
5bb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53         sqliteOsS
5bc0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
5bd0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
5be0: 45 2a 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70  E*(off_t)(pPg->p
5bf0: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  gno-1));.       
5c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
5c10: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
5c20: 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41 47  zBuf, SQLITE_PAG
5c30: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
5c40: 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
5c50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5c60: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
5c70: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  f, 0, SQLITE_PAG
5c80: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 7d  E_SIZE);.      }
5c90: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
5ca0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
5cb0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
5cc0: 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
5cd0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b  TE_PAGE_SIZE) ){
5ce0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
5cf0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
5d00: 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45  g), zBuf, SQLITE
5d10: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
5d20: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
5d30: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c  R_TO_EXTRA(pPg),
5d40: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
5d50: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
5d60: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
5d70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
5d80: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
5d90: 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79 62  }.  }..end_playb
5da0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
5db0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5dc0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
5dd0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
5de0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
5df0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
5e00: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
5e10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
5e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
5e30: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
5e40: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
5e50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5e60: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
5e70: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
5e80: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
5e90: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
5ea0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
5eb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
5ec0: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
5ed0: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
5ee0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
5ef0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
5f00: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
5f10: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
5f20: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
5f30: 20 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70        the checkp
5f40: 6f 69 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  oint is stored i
5f50: 6e 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  n pPager->ckptSi
5f60: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
5f70: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
5f80: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
5f90: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
5fa0: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
5fb0: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 63 68 65  ing back the che
5fc0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2c  ckpoint journal,
5fd0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
5fe0: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
5ff0: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
6000: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
6010: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
6020: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
6030: 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 2e  ager->ckptJSize.
6040: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6050: 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61  ager_ckpt_playba
6060: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
6070: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6090: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
60a0: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
60b0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
60c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
60d0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
60e0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6100: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
6110: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 72  int rc;..  /* Tr
6120: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
6130: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
6140: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
6150: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
6160: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
6170: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
6180: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
6190: 29 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  )pPager->ckptSiz
61a0: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  e);.  pPager->db
61b0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 63  Size = pPager->c
61c0: 6b 70 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  kptSize;..  /* F
61d0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
61e0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
61f0: 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  n the checkpoint
6200: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
6210: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
6220: 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 70 50  >ckptInUse && pP
6230: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6240: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53  n );.  sqliteOsS
6250: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63 70 66  eek(&pPager->cpf
6260: 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20  d, 0);.  nRec = 
6270: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63  pPager->ckptNRec
6280: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
6290: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
62a0: 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  t of the checkpo
62b0: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  int journal and 
62c0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
62d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
62e0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
62f0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
6300: 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65 73 20  nal always uses 
6310: 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 32 20 69 6e  format.  ** 2 in
6320: 73 74 65 61 64 20 6f 66 20 66 6f 72 6d 61 74 20  stead of format 
6330: 33 20 73 69 6e 63 65 20 69 74 20 64 6f 65 73 20  3 since it does 
6340: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  not need to be c
6350: 6f 6e 63 65 72 6e 65 64 20 77 69 74 68 0a 20 20  oncerned with.  
6360: 2a 2a 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ** power failure
6370: 73 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  s corrupting the
6380: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 63 61 6e   journal and can
6390: 20 74 68 75 73 20 6f 6d 69 74 20 74 68 65 20 63   thus omit the c
63a0: 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2f 0a 20  hecksums..  */. 
63b0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
63c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
63d0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
63e0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
63f0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66  er, &pPager->cpf
6400: 64 2c 20 32 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 2);.    asser
6410: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
6420: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
6430: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
6440: 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79  to end_ckpt_play
6450: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
6460: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
6470: 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64 20 74  any pages need t
6480: 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  o be copied out 
6490: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
64a0: 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  on.  ** journal.
64b0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
64c0: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
64d0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
64e0: 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  ckptJSize);.  if
64f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6500: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
6510: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  ckpt_playback;. 
6520: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6530: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
6540: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
6550: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
6570: 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63  end_ckpt_playbac
6580: 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20  k;.  }.  nRec = 
6590: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 63  (szJ - pPager->c
65a0: 6b 70 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41  kptJSize)/JOURNA
65b0: 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
65c0: 66 6f 72 6d 61 74 29 3b 0a 20 20 66 6f 72 28 69  format);.  for(i
65d0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
65e0: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
65f0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
6600: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
6610: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 6f 75 72  Pager->jfd, jour
6620: 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20  nal_format);.   
6630: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6640: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
6650: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
6660: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
6670: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
6680: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ack;.    }.  }. 
6690: 20 0a 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62   .end_ckpt_playb
66a0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
66b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
66c0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
66d0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
66e0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
66f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
6700: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6710: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
6720: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
6730: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
6740: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
6750: 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  llowed..**.** Th
6760: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
6770: 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65   is the absolute
6780: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78   value of the mx
6790: 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  Page parameter..
67a0: 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73 20  ** If mxPage is 
67b0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f  negative, the no
67c0: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73  Sync flag is als
67d0: 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62  o set.  noSync b
67e0: 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73  ypasses.** calls
67f0: 20 74 6f 20 73 71 6c 69 74 65 4f 73 53 79 6e 63   to sqliteOsSync
6800: 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72  ().  The pager r
6810: 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20  uns much faster 
6820: 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a  with noSync on,.
6830: 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70  ** but if the op
6840: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
6850: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
6860: 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  is an abrupt pow
6870: 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20  er .** failure, 
6880: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6890: 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  e might be left 
68a0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
68b0: 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61  nt and.** unrepa
68c0: 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a  irable state.  .
68d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
68e0: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
68f0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
6900: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
6910: 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b  if( mxPage>=0 ){
6920: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
6930: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
6940: 6d 70 46 69 6c 65 3b 0a 20 20 7d 65 6c 73 65 7b  mpFile;.  }else{
6950: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
6960: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50  ync = 1;.    mxP
6970: 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20  age = -mxPage;. 
6980: 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e   }.  if( mxPage>
6990: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
69a0: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
69b0: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
69c0: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
69d0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
69e0: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
69f0: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
6a00: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
6a10: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
6a20: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
6a30: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
6a40: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
6a50: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
6a60: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
6a70: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
6a80: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
6a90: 74 65 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  teOsSync() is ne
6aa0: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
6ab0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
6ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6ad0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
6ae0: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
6af0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
6b00: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
6b10: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
6b20: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
6b30: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
6b50: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
6b60: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
6b70: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
6b80: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
6b90: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
6ba0: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
6bb0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
6bc0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
6bd0: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
6be0: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
6bf0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
6c00: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
6c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
6c20: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
6c30: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
6c40: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
6c50: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
6c60: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
6c70: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
6c80: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
6c90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
6ca0: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
6cb0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
6cc0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
6cd0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
6ce0: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
6cf0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
6d00: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a  being written.**
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
6d20: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
6d30: 20 73 79 6e 63 73 2e 20 20 49 66 20 77 65 20 61   syncs.  If we a
6d40: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
6d50: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
6d60: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
6d70: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
6d80: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
6d90: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
6da0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
6db0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
6dc0: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
6dd0: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
6de0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
6df0: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
6e00: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
6e10: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
6e20: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
6e30: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
6e40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6e50: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
6e60: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
6e70: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
6e80: 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  3..*/.void sqlit
6e90: 65 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  epager_set_safet
6ea0: 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  y_level(Pager *p
6eb0: 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
6ec0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
6ed0: 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
6ee0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
6ef0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
6f00: 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
6f10: 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
6f20: 65 6d 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  empFile;.}../*.*
6f30: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
6f40: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
6f50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6f60: 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a  file into zName.
6f70: 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62  ** (zName must b
6f80: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
6f90: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
6fa0: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
6fb0: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
6fc0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
6fd0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
6fe0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
6ff0: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
7000: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
7010: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
7020: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
7030: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
7040: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
7050: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
7060: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
7070: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 70 61  tic int sqlitepa
7080: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
7090: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
70a0: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
70b0: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
70c0: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
70d0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d  .    sqliteOsTem
70e0: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
70f0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
7100: 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  eOsOpenExclusive
7110: 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a  (zFile, fd, 1);.
7120: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
7130: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
7140: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
7150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
7160: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
7170: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
7180: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
7190: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
71a0: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
71b0: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
71c0: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
71d0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
71e0: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
71f0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
7200: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29  qlitepager_get()
7210: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
7220: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
7230: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
7240: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
7250: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
7260: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
7270: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
7280: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
7290: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
72a0: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
72b0: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
72c0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
72d0: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
72e0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
72f0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
7300: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
7310: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
7320: 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  epager_open(.  P
7330: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
7340: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7350: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
7360: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
7370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
7380: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
7390: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
73a0: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
73b0: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20  .  int mxPage,  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
73d0: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  ax number of in-
73e0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
73f0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  es */.  int nExt
7400: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
7410: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
7420: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
7430: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
7440: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
7450: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  l           /* T
7460: 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c  RUE to use a rol
7470: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
7480: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
7490: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
74a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
74b0: 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  athname;.  int n
74c0: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
74d0: 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   fd;.  int rc;. 
74e0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20   int tempFile;. 
74f0: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
7500: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
7510: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
7520: 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67  SIZE];..  *ppPag
7530: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  er = 0;.  if( sq
7540: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
7550: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
7560: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7570: 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61   }.  if( zFilena
7580: 6d 65 20 29 7b 0a 20 20 20 20 7a 46 75 6c 6c 50  me ){.    zFullP
7590: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
75a0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
75b0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Filename);.    r
75c0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e  c = sqliteOsOpen
75d0: 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50  ReadWrite(zFullP
75e0: 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72  athname, &fd, &r
75f0: 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 74 65  eadOnly);.    te
7600: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 65  mpFile = 0;.  }e
7610: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
7620: 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65  litepager_opente
7630: 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  mp(zTemp, &fd);.
7640: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
7650: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
7660: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
7670: 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  eOsFullPathname(
7680: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
7690: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
76a0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  }.  if( sqlite_m
76b0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
76c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
76d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
76e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
76f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
7700: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
7710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
7720: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
7730: 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73   }.  nameLen = s
7740: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
7750: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
7760: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
7770: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
7780: 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20 33 30 20   nameLen*2 + 30 
7790: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
77a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
77b0: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
77c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
77d0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
77e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
77f0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f  OMEM;.  }.  SET_
7800: 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20  PAGER(pPager);. 
7810: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
7820: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
7830: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
7840: 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
7850: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
7860: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
7870: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
7880: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
7890: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
78a0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
78b0: 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  l, zFullPathname
78c0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
78d0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
78e0: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
78f0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
7900: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
7910: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
7920: 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   fd;.  pPager->j
7930: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
7940: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
7950: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
7960: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  l;.  pPager->ckp
7970: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  tOpen = 0;.  pPa
7980: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d  ger->ckptInUse =
7990: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
79a0: 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ef = 0;.  pPager
79b0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
79c0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
79d0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
79e0: 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a  >ckptJSize = 0;.
79f0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
7a00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  = 0;.  pPager->m
7a10: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35  xPage = mxPage>5
7a20: 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a   ? mxPage : 10;.
7a30: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7a40: 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b  = SQLITE_UNLOCK;
7a50: 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  .  pPager->errMa
7a60: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sk = 0;.  pPager
7a70: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
7a80: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
7a90: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
7aa0: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
7ab0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
7ac0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
7ad0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
7ae0: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
7af0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
7b00: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7b10: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
7b20: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
7b30: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
7b40: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74  r->nExtra = nExt
7b50: 72 61 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  ra;.  memset(pPa
7b60: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
7b70: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
7b80: 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65  ash));.  *ppPage
7b90: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
7ba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
7bc0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
7bd0: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
7be0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
7bf0: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
7c00: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
7c10: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7c20: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
7c30: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
7c40: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
7c50: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
7c60: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
7c70: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
7c80: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
7c90: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
7ca0: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
7cb0: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
7cc0: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
7cd0: 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  tepager_close().
7ce0: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
7cf0: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
7d00: 64 20 62 79 20 73 71 6c 69 74 65 70 61 67 65 72  d by sqlitepager
7d10: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  _unref()..*/.voi
7d20: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65  d sqlitepager_se
7d30: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
7d40: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
7d50: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 29   (*xDesc)(void*)
7d60: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
7d70: 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
7d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7d90: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
7da0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
7db0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
7dc0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
7dd0: 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  pPager..*/.int s
7de0: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63  qlitepager_pagec
7df0: 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
7e00: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a  er){.  off_t n;.
7e10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7e20: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
7e30: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
7e40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
7e50: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
7e60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46  .  if( sqliteOsF
7e70: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
7e80: 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45  >fd, &n)!=SQLITE
7e90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
7ea0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
7eb0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20  GER_ERR_DISK;.  
7ec0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7ed0: 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41    n /= SQLITE_PA
7ee0: 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70  GE_SIZE;.  if( p
7ef0: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
7f00: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  LITE_UNLOCK ){. 
7f10: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
7f20: 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  e = n;.  }.  ret
7f30: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
7f40: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
7f50: 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
7f60: 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
7f70: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
7f80: 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
7f90: 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
7fa0: 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
7fb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7fc0: 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
7fd0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
7fe0: 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
7ff0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
8000: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
8010: 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
8020: 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
8030: 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
8040: 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
8050: 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
8060: 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
8070: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
8080: 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
8090: 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
80a0: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e   coredump..*/.in
80b0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c  t sqlitepager_cl
80c0: 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
80d0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
80e0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74  , *pNext;.  swit
80f0: 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ch( pPager->stat
8100: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
8110: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20  LITE_WRITELOCK: 
8120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61  {.      sqlitepa
8130: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
8140: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
8150: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
8160: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
8170: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
8180: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
8190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
81a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
81b0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a  ITE_READLOCK: {.
81c0: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e        sqliteOsUn
81d0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
81e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
81f0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
8200: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
8210: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
8220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8230: 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
8240: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8250: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
8260: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
8270: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
8280: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
8290: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
82a0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
82b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
82c0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
82d0: 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
82e0: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
82f0: 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
8300: 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
8310: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
8320: 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
8330: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
8340: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
8350: 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f 50  * }.  */.  CLR_P
8360: 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20  AGER(pPager);.  
8370: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
8380: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
8390: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
83a0: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
83b0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
83c0: 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
83d0: 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70  .*/.Pgno sqlitep
83e0: 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
83f0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
8400: 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
8410: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
8420: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
8430: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  o;.}../*.** Incr
8440: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
8450: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
8460: 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
8470: 67 65 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ge is.** current
8480: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
8490: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
84a0: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
84b0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
84c0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
84d0: 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  list..*/.#define
84e0: 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
84f0: 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
8500: 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
8510: 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 73 74 61  (P)->nRef++).sta
8520: 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
8530: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
8540: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
8550: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
8560: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
8570: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
8580: 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
8590: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
85a0: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
85b0: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
85c0: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
85d0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
85e0: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
85f0: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
8600: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
8610: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
8620: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
8630: 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
8640: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
8650: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
8660: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
8670: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
8680: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
8690: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
86a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
86b0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
86c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
86d0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
86e0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
86f0: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
8700: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
8710: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
8720: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
8730: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
8740: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
8750: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
8760: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
8770: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
8780: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  INFO(pPg);.}../*
8790: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
87a0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
87b0: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
87c0: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
87d0: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
87e0: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
87f0: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
8800: 74 65 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  tepager_ref(void
8810: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
8820: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
8830: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
8840: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
8850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8860: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
8870: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  c the journal an
8880: 64 20 74 68 65 6e 20 77 72 69 74 65 20 61 6c 6c  d then write all
8890: 20 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65   free dirty page
88a0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
88b0: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  e.** file..**.**
88c0: 20 57 72 69 74 69 6e 67 20 61 6c 6c 20 66 72 65   Writing all fre
88d0: 65 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  e dirty pages to
88e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 66   the database af
88f0: 74 65 72 20 74 68 65 20 73 79 6e 63 20 69 73 20  ter the sync is 
8900: 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73  a.** non-obvious
8910: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
8920: 66 73 79 6e 63 28 29 20 69 73 20 61 6e 20 65 78  fsync() is an ex
8930: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
8940: 6e 20 73 6f 20 77 65 0a 2a 2a 20 77 61 6e 74 20  n so we.** want 
8950: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8960: 6e 75 6d 62 65 72 20 6f 74 20 74 69 6d 65 73 20  number ot times 
8970: 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 66  it is called. Af
8980: 74 65 72 20 61 6e 20 66 73 79 6e 63 28 29 20 63  ter an fsync() c
8990: 61 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72 65 20 66  all,.** we are f
89a0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 64 69 72  ree to write dir
89b0: 74 79 20 70 61 67 65 73 20 62 61 63 6b 20 74 6f  ty pages back to
89c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
89d0: 49 74 20 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f  It is best.** to
89e0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 77 72   go ahead and wr
89f0: 69 74 65 20 61 73 20 6d 61 6e 79 20 64 69 72 74  ite as many dirt
8a00: 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
8a10: 62 6c 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ble to minimize 
8a20: 0a 2a 2a 20 74 68 65 20 72 69 73 6b 20 6f 66 20  .** the risk of 
8a30: 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 6e 6f  having to do ano
8a40: 74 68 65 72 20 66 73 79 6e 63 28 29 20 6c 61 74  ther fsync() lat
8a50: 65 72 20 6f 6e 2e 20 20 57 72 69 74 69 6e 67 20  er on.  Writing 
8a60: 64 69 72 74 79 0a 2a 2a 20 66 72 65 65 20 70 61  dirty.** free pa
8a70: 67 65 73 20 69 6e 20 74 68 69 73 20 77 61 79 20  ges in this way 
8a80: 77 61 73 20 6f 62 73 65 72 76 65 64 20 74 6f 20  was observed to 
8a90: 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 6f 70  make database op
8aa0: 65 72 61 74 69 6f 6e 73 20 67 6f 0a 2a 2a 20 75  erations go.** u
8ab0: 70 20 74 6f 20 31 30 20 74 69 6d 65 73 20 66 61  p to 10 times fa
8ac0: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  ster..**.** If w
8ad0: 65 20 61 72 65 20 77 72 69 74 69 6e 67 20 74 6f  e are writing to
8ae0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
8af0: 61 73 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ase, there is no
8b00: 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72 76   need to preserv
8b10: 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 72 69  e.** the integri
8b20: 74 79 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ty of the journa
8b30: 6c 20 66 69 6c 65 2c 20 73 6f 20 77 65 20 63 61  l file, so we ca
8b40: 6e 20 73 61 76 65 20 74 69 6d 65 20 61 6e 64 20  n save time and 
8b50: 73 6b 69 70 20 74 68 65 0a 2a 2a 20 66 73 79 6e  skip the.** fsyn
8b60: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  c()..*/.static i
8b70: 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28  nt syncAllPages(
8b80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8b90: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
8ba0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8bb0: 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
8bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
8bd0: 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
8be0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
8bf0: 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
8c00: 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
8c10: 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
8c20: 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
8c30: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
8c40: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
8c50: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
8c60: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
8c70: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
8c80: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
8c90: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
8ca0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 23 69  er->noSync );.#i
8cb0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
8cc0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6f 66 66     {.        off
8cd0: 5f 74 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20  _t hdrSz, pgSz, 
8ce0: 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64 72  jSz;.        hdr
8cf0: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  Sz = JOURNAL_HDR
8d00: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
8d10: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53  at);.        pgS
8d20: 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  z = JOURNAL_PG_S
8d30: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
8d40: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
8d50: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
8d60: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
8d70: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
8d80: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
8d90: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
8da0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
8db0: 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53  c*pgSz+hdrSz==jS
8dc0: 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
8dd0: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6a 6f  dif.      if( jo
8de0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 33 20  urnal_format>=3 
8df0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  ){.        off_t
8e00: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66   szJ;.        if
8e10: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
8e20: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
8e30: 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29  TRACE1("SYNC\n")
8e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
8e50: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70   sqliteOsSync(&p
8e60: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
8e70: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
8e80: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ea0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
8eb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f  ager->jfd, sizeo
8ec0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
8ed0: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
8ee0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
8ef0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
8f00: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
8f10: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8f20: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73 7a  n rc;.        sz
8f30: 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J = JOURNAL_HDR_
8f40: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
8f50: 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  t) +.           
8f60: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
8f70: 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ec*JOURNAL_PG_SZ
8f80: 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
8f90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8fa0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
8fb0: 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20  jfd, szJ);.     
8fc0: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 31 28   }.      TRACE1(
8fd0: 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20  "SYNC\n");.     
8fe0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79   rc = sqliteOsSy
8ff0: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
9000: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
9010: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
9020: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
9030: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
9040: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
9050: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
9060: 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
9070: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
9080: 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
9090: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
90a0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
90b0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
90c0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
90d0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
90e0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
90f0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
9100: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
9110: 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
9120: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
9130: 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
9140: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
9150: 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
9160: 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
9170: 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
9180: 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
9190: 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
91a0: 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
91b0: 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
91c0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
91d0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
91e0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
91f0: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
9200: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9210: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
9220: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
9230: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
9240: 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
9250: 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
9260: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
9270: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
9280: 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
9290: 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
92a0: 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
92b0: 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
92c0: 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
92d0: 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
92e0: 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
92f0: 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
9300: 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
9310: 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
9320: 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
9330: 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
9340: 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
9350: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
9360: 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
9370: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
9380: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
9390: 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
93a0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
93b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
93c0: 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
93d0: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
93e0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
93f0: 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  List->pgno-1)*(o
9400: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
9410: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72 63 20 3d  _SIZE);.    rc =
9420: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
9430: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
9440: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
9450: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
9460: 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ZE);.    if( rc 
9470: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
9480: 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20   pList->dirty = 
9490: 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  0;.    pList = p
94a0: 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
94b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
94c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
94d0: 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
94e0: 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
94f0: 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
9500: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
9510: 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
9520: 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
9530: 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
9540: 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
9550: 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
9560: 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
9570: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
9580: 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
9590: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
95a0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70  {.  PgHdr *p, *p
95b0: 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20  List;.  pList = 
95c0: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  0;.  for(p=pPage
95d0: 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
95e0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
95f0: 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a  if( p->dirty ){.
9600: 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20        p->pDirty 
9610: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = pList;.      p
9620: 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  List = p;.    }.
9630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
9640: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  st;.}../*.** Acq
9650: 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
9660: 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
9670: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
9680: 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
9690: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
96a0: 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
96b0: 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
96c0: 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
96d0: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
96e0: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
96f0: 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f   A _get works fo
9700: 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
9710: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
9720: 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
9730: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
9740: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
9750: 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
9760: 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
9770: 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
9780: 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
9790: 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
97a0: 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
97b0: 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
97c0: 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
97d0: 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
97e0: 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
97f0: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
9800: 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
9810: 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
9820: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
9830: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
9840: 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
9850: 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
9860: 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
9870: 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
9880: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
9890: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
98a0: 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
98b0: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
98c0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
98d0: 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  litepager_lookup
98e0: 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
98f0: 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
9900: 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
9910: 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
9920: 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
9930: 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
9940: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
9950: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
9960: 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
9970: 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
9980: 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
9990: 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
99a0: 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
99b0: 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
99c0: 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
99d0: 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
99e0: 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
99f0: 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
9a00: 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
9a10: 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
9a20: 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
9a30: 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
9a40: 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
9a50: 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
9a60: 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
9a70: 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
9a80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
9a90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
9aa0: 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
9ab0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
9ac0: 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
9ad0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
9ae0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d   int rc;..  /* M
9af0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
9b00: 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
9b10: 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
9b20: 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
9b30: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
9b40: 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
9b50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
9b60: 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
9b70: 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
9b80: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
9b90: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
9ba0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
9bb0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
9bc0: 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
9bd0: 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63  n get a read loc
9be0: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
9bf0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
9c00: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
9c10: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72  nRef==0 ){.    r
9c20: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
9c30: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
9c40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
9c50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9c60: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
9c70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9c80: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
9c90: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
9ca0: 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20  _READLOCK;..    
9cb0: 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
9cc0: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79  file exists, try
9cd0: 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
9ce0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9cf0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
9d00: 6e 61 6c 20 26 26 20 73 71 6c 69 74 65 4f 73 46  nal && sqliteOsF
9d10: 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
9d20: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  ->zJournal) ){. 
9d30: 20 20 20 20 20 20 69 6e 74 20 72 63 2c 20 64 75        int rc, du
9d40: 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  mmy;..       /* 
9d50: 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  Get a write lock
9d60: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
9d70: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
9d80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
9d90: 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72  riteLock(&pPager
9da0: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  ->fd);.       if
9db0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9dc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20  ){.         if( 
9dd0: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
9de0: 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c  pPager->fd)!=SQL
9df0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9e00: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
9e10: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
9e20: 21 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ! */.           
9e30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
9e40: 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 7d  RNAL;.         }
9e50: 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  .         *ppPag
9e60: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
9e70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
9e80: 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
9e90: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
9ea0: 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20 20  E_WRITELOCK;..  
9eb0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
9ec0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78 63   journal for exc
9ed0: 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e 20 20  lusive access.  
9ee0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
9ef0: 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20  SY if.       ** 
9f00: 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 65 78  we cannot get ex
9f10: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 74  clusive access t
9f20: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
9f30: 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
9f40: 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 74 68        ** Even th
9f50: 6f 75 67 68 20 77 65 20 77 69 6c 6c 20 6f 6e 6c  ough we will onl
9f60: 79 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  y be reading fro
9f70: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 6e  m the journal, n
9f80: 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20 20 20 20  ot writing,.    
9f90: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f     ** we have to
9fa0: 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
9fb0: 6c 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 6e  l for writing in
9fc0: 20 6f 72 64 65 72 20 74 6f 20 6f 62 74 61 69 6e   order to obtain
9fd0: 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a 20 65 78   an.       ** ex
9fe0: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6c  clusive access l
9ff0: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
a000: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a010: 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  eOsOpenReadWrite
a020: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
a030: 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
a040: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20   &dummy);.      
a050: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a060: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  OK ){.         r
a070: 63 20 3d 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f  c = sqliteOsUnlo
a080: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
a090: 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
a0a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a0b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50  );.         *ppP
a0c0: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
a0d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a0e0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
a0f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
a100: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
a110: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
a120: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
a130: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;..       /* Pla
a140: 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
a150: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
a160: 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
a170: 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a   write.       **
a180: 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
a190: 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
a1a0: 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  k..       */.   
a1b0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
a1c0: 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
a1d0: 30 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  0);.       if( r
a1e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a1f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a200: 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
a210: 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a   }.    pPg = 0;.
a220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
a230: 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20  Search for page 
a240: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
a250: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
a260: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
a270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
a280: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
a290: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
a2a0: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
a2b0: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
a2c0: 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67   int h;.    pPag
a2d0: 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20  er->nMiss++;.   
a2e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
a2f0: 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
a300: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
a310: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
a320: 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
a330: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50  page */.      pP
a340: 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
a350: 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
a360: 29 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ) + SQLITE_PAGE_
a370: 53 49 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20  SIZE .          
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
a3a0: 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
a3b0: 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ra );.      if( 
a3c0: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
a3d0: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
a3e0: 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77         pager_unw
a3f0: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
a400: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
a410: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
a420: 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20  ER_ERR_MEM;.    
a430: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a440: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
a450: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
a460: 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
a470: 67 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g));.      pPg->
a480: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
a490: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
a4a0: 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
a4b0: 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70  All;.      if( p
a4c0: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
a4d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
a4e0: 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20  All->pPrevAll = 
a4f0: 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pPg;.      }.   
a500: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c     pPg->pPrevAll
a510: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
a520: 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
a530: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
a540: 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  age++;.    }else
a550: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20  {.      /* Find 
a560: 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
a570: 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
a580: 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
a590: 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
a5a0: 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
a5b0: 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
a5c0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  he journal..    
a5d0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d    */.      pPg =
a5e0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
a5f0: 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ynced;..      /*
a600: 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
a610: 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
a620: 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
a630: 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
a640: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f      ** on the jo
a650: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
a660: 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
a670: 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
a680: 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79   a.      ** very
a690: 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
a6a0: 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
a6b0: 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
a6c0: 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20  ut sometimes.   
a6d0: 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62     ** it can't b
a6e0: 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20  e helped..      
a6f0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
a700: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
a710: 6e 74 20 72 63 20 3d 20 73 79 6e 63 41 6c 6c 50  nt rc = syncAllP
a720: 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
a730: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
a740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a750: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
a760: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
a770: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
a780: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
a790: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
a7a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a7b0: 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
a7c0: 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
a7d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7e0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
a7f0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
a800: 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
a810: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
a820: 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
a830: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
a840: 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
a850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a860: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
a870: 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
a880: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
a890: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
a8a0: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
a8b0: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
a8c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a8d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a8e0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
a8f0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
a900: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
a910: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a920: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
a930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a940: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a950: 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
a960: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
a970: 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
a980: 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
a990: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
a9a0: 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ack, then.      
a9b0: 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
a9c0: 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
a9d0: 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
a9e0: 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  bling the.      
a9f0: 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72  ** sqlite_dont_r
aa00: 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
aa10: 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
aa20: 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
aa30: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
aa40: 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
aa50: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
aa60: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
aa70: 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
aa80: 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67  ack.      ** mig
aa90: 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
aaa0: 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
aab0: 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
aac0: 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
aad0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  er.      ** that
aae0: 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
aaf0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
ab00: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
ab10: 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
ab20: 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65       ** be marke
ab30: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
ab40: 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
ab50: 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   out..      */. 
ab60: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c       if( pPg->al
ab70: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
ab80: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
ab90: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
aba0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
abb0: 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65     /* Unlink the
abc0: 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
abd0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
abe0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
abf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ac00: 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
ac10: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
ac20: 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
ac30: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
ac40: 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e;.        while
ac50: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
ac60: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
ac70: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
ac80: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
ac90: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
aca0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
acb0: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
acc0: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72          pPg->pPr
acd0: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
ace0: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
acf0: 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ee;.      }else{
ad00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ad10: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
ad20: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
ad30: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
ad40: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
ad50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ad60: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
ad70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
ad80: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
ad90: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
ada0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  revFree;.      }
adb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
adc0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
add0: 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
ade0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
adf0: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
ae00: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ee;.      }.    
ae10: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
ae20: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
ae30: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
ae40: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
ae50: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
ae60: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
ae70: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
ae80: 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  vHash;.      }. 
ae90: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50       if( pPg->pP
aea0: 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 20  revHash ){.     
aeb0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
aec0: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
aed0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
aee0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aef0: 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
af00: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
af10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
af20: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
af30: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
af40: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
af50: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
af60: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
af70: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
af80: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
af90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
afa0: 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20  er->nOvfl++;.   
afb0: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
afc0: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
afd0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
afe0: 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
aff0: 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
b000: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
b010: 6c 69 74 65 43 68 65 63 6b 4d 65 6d 6f 72 79 28  liteCheckMemory(
b020: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
b030: 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
b040: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b050: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
b060: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
b070: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
b080: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
b090: 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
b0a0: 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
b0b0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
b0c0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
b0d0: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
b0e0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
b0f0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
b100: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b110: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 26  Pager->aInCkpt &
b120: 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
b130: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 0a 20 20  ger->ckptSize.  
b140: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
b150: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
b160: 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
b170: 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
b180: 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
b190: 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  ckpt_list(pPg);.
b1a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b1b0: 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
b1c0: 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29  m_ckpt_list(pPg)
b1d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
b1e0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
b1f0: 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
b200: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
b210: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
b220: 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67  f++;.    h = pag
b230: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
b240: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
b250: 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
b260: 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
b270: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
b280: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
b290: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
b2a0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
b2b0: 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
b2c0: 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
b2d0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
b2e0: 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
b2f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b300: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
b310: 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61  ) sqlitepager_pa
b320: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
b330: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
b340: 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e  >dbSize<(int)pgn
b350: 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
b360: 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
b370: 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f  pPg), 0, SQLITE_
b380: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
b390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
b3a0: 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
b3b0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
b3c0: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f  >fd, (pgno-1)*(o
b3d0: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
b3e0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63  _SIZE);.      rc
b3f0: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
b400: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
b410: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
b420: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
b430: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
b440: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b450: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c         off_t fil
b460: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
b470: 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53  f( sqliteOsFileS
b480: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
b490: 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49  &fileSize)!=SQLI
b4a0: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
b4b0: 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65       || fileSize
b4c0: 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41  >=pgno*SQLITE_PA
b4d0: 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
b4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
b4f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b500: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
b510: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
b520: 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
b530: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
b540: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b550: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
b560: 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
b570: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
b580: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
b590: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
b5a0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
b5b0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
b5c0: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
b5d0: 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
b5e0: 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  e. */.    pPager
b5f0: 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61  ->nHit++;.    pa
b600: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
b610: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48  .  *ppPage = PGH
b620: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
b630: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b640: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
b650: 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
b660: 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
b670: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
b680: 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
b690: 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
b6a0: 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
b6b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b6c0: 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
b6d0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
b6e0: 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
b6f0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
b700: 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 2e 20  itepager_get(). 
b710: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
b720: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
b730: 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
b740: 74 65 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  tepager_get() is
b750: 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
b760: 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
b770: 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
b780: 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
b790: 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
b7a0: 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
b7b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
b7c0: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
b7d0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
b7e0: 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
b7f0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
b800: 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
b810: 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
b820: 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75  qlitepager_looku
b830: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
b840: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
b850: 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
b860: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
b870: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
b880: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
b890: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
b8a0: 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
b8b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b8c0: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 28 20  0;.  }.  /* if( 
b8d0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
b8e0: 29 7b 0a 20 20 2a 2a 20 20 72 65 74 75 72 6e 20  ){.  **  return 
b8f0: 30 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20  0;.  ** }.  */. 
b900: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
b910: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
b920: 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
b930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61  ) return 0;.  pa
b940: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
b950: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
b960: 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
b970: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
b980: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
b990: 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
b9a0: 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
b9b0: 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
b9c0: 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
b9d0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
b9e0: 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
b9f0: 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
ba00: 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
ba10: 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
ba20: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
ba30: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
ba40: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
ba50: 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
ba60: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  t sqlitepager_un
ba70: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
ba80: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
ba90: 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
baa0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
bab0: 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
bac0: 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44  e.  */.  pPg = D
bad0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
bae0: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
baf0: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
bb00: 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
bb10: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
bb20: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
bb30: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
bb40: 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
bb50: 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
bb60: 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
bb70: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
bb80: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
bb90: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
bba0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
bbb0: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
bbc0: 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
bbd0: 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
bbe0: 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
bbf0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
bc00: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
bc10: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
bc20: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
bc30: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
bc40: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
bc50: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
bc60: 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
bc70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
bc80: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
bc90: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
bca0: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
bcb0: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
bcc0: 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
bcd0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
bce0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
bcf0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
bd00: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
bd10: 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
bd20: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
bd30: 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  r(pData);.    }.
bd40: 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
bd50: 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
bd60: 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
bd70: 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
bd80: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
bd90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bda0: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
bdb0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
bdc0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
bdd0: 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
bde0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
bdf0: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
be00: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
be10: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
be20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
be30: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
be40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
be50: 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
be60: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
be70: 20 61 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b   a write.** lock
be80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
be90: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
bea0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
beb0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
bec0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
bed0: 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
bee0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
bef0: 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
bf00: 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
bf10: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
bf20: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
bf30: 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
bf40: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
bf50: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
bf60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bf70: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
bf80: 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61  WRITELOCK );.  a
bf90: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
bfa0: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
bfb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bfc0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
bfd0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
bfe0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
bff0: 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
c000: 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
c010: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
c020: 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
c030: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
c040: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
c050: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
c060: 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c  e = SQLITE_READL
c070: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
c080: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c090: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  }.  rc = sqliteO
c0a0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
c0b0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
c0c0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50   &pPager->jfd,pP
c0d0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
c0e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c0f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
c100: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
c110: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
c120: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
c130: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  al = 0;.    sqli
c140: 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50  teOsReadLock(&pP
c150: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70  ager->fd);.    p
c160: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
c170: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a  QLITE_READLOCK;.
c180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c190: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
c1a0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c1b0: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
c1c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
c1d0: 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
c1e0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
c1f0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
c200: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
c210: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
c220: 30 3b 0a 20 20 73 71 6c 69 74 65 70 61 67 65 72  0;.  sqlitepager
c230: 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
c240: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72  r);.  pPager->or
c250: 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
c260: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28  r->dbSize;.  if(
c270: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d   journal_format=
c280: 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
c290: 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  3 ){.    rc = sq
c2a0: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
c2b0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
c2c0: 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66  alMagic3, sizeof
c2d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 29  (aJournalMagic3)
c2e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
c2f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c300: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
c310: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
c320: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c330: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
c340: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
c350: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c360: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
c370: 63 6b 73 75 6d 49 6e 69 74 20 3d 20 28 75 33 32  cksumInit = (u32
c380: 29 73 71 6c 69 74 65 52 61 6e 64 6f 6d 49 6e 74  )sqliteRandomInt
c390: 65 67 65 72 28 29 3b 0a 20 20 20 20 20 20 72 63  eger();.      rc
c3a0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
c3b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
c3c0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
c3d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
c3e0: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
c3f0: 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t==JOURNAL_FORMA
c400: 54 5f 32 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  T_2 ){.    rc = 
c410: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
c420: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
c430: 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73 69 7a 65  rnalMagic2, size
c440: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
c450: 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2));.  }else{.  
c460: 20 20 61 73 73 65 72 74 28 20 6a 6f 75 72 6e 61    assert( journa
c470: 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41  l_format==JOURNA
c480: 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 3b 0a 20 20  L_FORMAT_1 );.  
c490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
c4a0: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
c4b0: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
c4c0: 31 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  1, sizeof(aJourn
c4d0: 61 6c 4d 61 67 69 63 31 29 29 3b 0a 20 20 7d 0a  alMagic1));.  }.
c4e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c4f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
c500: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
c510: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
c520: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ->dbSize);.  }. 
c530: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
c540: 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
c550: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c560: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
c570: 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e 28 70 50  er_ckpt_begin(pP
c580: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
c590: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c5a0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c5b0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
c5c0: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
c5d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c5e0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c5f0: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
c600: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
c610: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
c620: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
c630: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
c640: 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
c650: 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
c660: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
c670: 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
c680: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61  **   *  sqlitepa
c690: 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
c6a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
c6b0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
c6c0: 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
c6d0: 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
c6e0: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73  pager_close() is
c6f0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
c700: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
c710: 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
c720: 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
c730: 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
c740: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
c750: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
c760: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c770: 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
c780: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
c790: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
c7a0: 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
c7b0: 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
c7c0: 75 73 65 64 20 6d 65 72 65 6c 79 0a 2a 2a 20 74  used merely.** t
c7d0: 6f 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  o acquire a poin
c7e0: 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
c7f0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
c800: 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
c810: 72 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  re.** is already
c820: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
c830: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
c840: 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
c850: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
c860: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
c870: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
c880: 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  or.** temporary 
c890: 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
c8a0: 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
c8b0: 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
c8c0: 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 72  ed until.** ther
c8d0: 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
c8e0: 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
c8f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
c900: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
c910: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 77 72  se is already wr
c920: 69 74 65 2d 6c 6f 63 6b 65 64 2c 20 74 68 69 73  ite-locked, this
c930: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
c940: 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
c950: 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f  tepager_begin(vo
c960: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
c970: 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
c980: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
c990: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c9a0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c9b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c9c0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
c9d0: 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
c9e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c9f0: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
ca00: 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
ca10: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51  Pager->state==SQ
ca20: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29 7b  LITE_READLOCK ){
ca30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ca40: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
ca50: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
ca60: 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b  qliteOsWriteLock
ca70: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
ca80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ca90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
caa0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
cab0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cac0: 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c   = SQLITE_WRITEL
cad0: 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  OCK;.    pPager-
cae0: 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 30 3b 0a  >dirtyFile = 0;.
caf0: 20 20 20 20 54 52 41 43 45 31 28 22 54 52 41 4e      TRACE1("TRAN
cb00: 53 41 43 54 49 4f 4e 5c 6e 22 29 3b 0a 20 20 20  SACTION\n");.   
cb10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
cb20: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
cb30: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
cb40: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
cb50: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
cb60: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
cb70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cb80: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
cb90: 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
cba0: 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
cbb0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
cbc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
cbd0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
cbe0: 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
cbf0: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
cc00: 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
cc10: 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
cc20: 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
cc30: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
cc40: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
cc50: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
cc60: 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
cc70: 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
cc80: 20 61 63 71 75 69 72 65 73 20 61 20 77 72 69 74   acquires a writ
cc90: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
cca0: 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
ccb0: 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  write.** lock co
ccc0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
ccd0: 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
cce0: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
ccf0: 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
cd00: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
cd10: 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
cd20: 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
cd30: 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
cd40: 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
cd50: 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
cd60: 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
cd70: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
cd80: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
cd90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
cda0: 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
cdb0: 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
cdc0: 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
cdd0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
cde0: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
cdf0: 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
ce00: 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
ce10: 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
ce20: 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
ce30: 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
ce40: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
ce50: 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
ce60: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
ce70: 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  epager_commit() 
ce80: 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  or sqlitepager_r
ce90: 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
cea0: 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  reset..*/.int sq
ceb0: 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28  litepager_write(
cec0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
ced0: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
cee0: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
cef0: 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
cf00: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
cf10: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
cf20: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
cf30: 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
cf40: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
cf50: 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20  ->errMask ){ .  
cf60: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
cf70: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
cf80: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
cf90: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
cfa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cfb0: 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  PERM;.  }..  /* 
cfc0: 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
cfd0: 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
cfe0: 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
cff0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
d000: 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
d010: 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
d020: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
d030: 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72  .  */.  pPg->dir
d040: 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ty = 1;.  if( pP
d050: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
d060: 28 70 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20  (pPg->inCkpt || 
d070: 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
d080: 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
d090: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
d0a0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
d0b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
d0c0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
d0d0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
d0e0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
d0f0: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  eeds to be.  ** 
d100: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
d110: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
d120: 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
d130: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  oint journal.  *
d140: 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  * or both..  **.
d150: 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
d160: 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
d170: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
d180: 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
d190: 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
d1a0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
d1b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d1c0: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
d1d0: 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  ITE_UNLOCK );.  
d1e0: 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
d1f0: 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20  _begin(pData);. 
d200: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d210: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
d220: 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
d230: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
d240: 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  ==SQLITE_WRITELO
d250: 43 4b 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  CK );.  if( !pPa
d260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
d270: 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
d280: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
d290: 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
d2a0: 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
d2b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d2c0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
d2d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d2e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d2f0: 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
d300: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
d310: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
d320: 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 1;..  /* The
d330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
d340: 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
d350: 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 77 72  and we have a wr
d360: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite lock on the.
d370: 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61    ** main databa
d380: 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
d390: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
d3a0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
d3b0: 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ion .  ** journa
d3c0: 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
d3d0: 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
d3e0: 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  */.  if( !pPg->i
d3f0: 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 70 50 61 67  nJournal && pPag
d400: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
d410: 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70  {.    if( (int)p
d420: 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
d430: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
d440: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67  {.      int szPg
d450: 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61 76 65  ;.      u32 save
d460: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 6f 75  d;.      if( jou
d470: 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55  rnal_format>=JOU
d480: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b  RNAL_FORMAT_3 ){
d490: 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
d4a0: 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
d4b0: 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
d4c0: 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  no, pData);.    
d4d0: 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33      saved = *(u3
d4e0: 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  2*)PGHDR_TO_EXTR
d4f0: 41 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  A(pPg);.        
d500: 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75  store32bits(cksu
d510: 6d 2c 20 70 50 67 2c 20 53 51 4c 49 54 45 5f 50  m, pPg, SQLITE_P
d520: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
d530: 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54 45     szPg = SQLITE
d540: 5f 50 41 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20  _PAGE_SIZE+8;.  
d550: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d560: 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54 45     szPg = SQLITE
d570: 5f 50 41 47 45 5f 53 49 5a 45 2b 34 3b 0a 20 20  _PAGE_SIZE+4;.  
d580: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 6f 72      }.      stor
d590: 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
d5a0: 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
d5b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
d5c0: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
d5d0: 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
d5e0: 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
d5f0: 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72 6e 61        if( journa
d600: 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41  l_format>=JOURNA
d610: 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20  L_FORMAT_3 ){.  
d620: 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48        *(u32*)PGH
d630: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
d640: 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20   = saved;.      
d650: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
d660: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d670: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
d680: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
d690: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
d6a0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
d6b0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
d6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d6e0: 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
d6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
d700: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
d710: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  =0 );.      pPag
d720: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
d730: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
d740: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
d750: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
d760: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
d770: 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 70 50  noSync;.      pP
d780: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
d790: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
d7a0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
d7b0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
d7c0: 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
d7d0: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
d7e0: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
d7f0: 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63     page_add_to_c
d800: 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  kpt_list(pPg);. 
d810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
d820: 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
d830: 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
d840: 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
d850: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d860: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
d870: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72   = !pPager->jour
d880: 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
d890: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
d8a0: 20 20 20 20 20 54 52 41 43 45 33 28 22 41 50 50       TRACE3("APP
d8b0: 45 4e 44 20 25 64 20 25 64 5c 6e 22 2c 20 70 50  END %d %d\n", pP
d8c0: 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
d8d0: 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20  edSync);.    }. 
d8e0: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
d8f0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 50  Sync ){.      pP
d900: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
d910: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
d920: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
d930: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  point journal is
d940: 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
d950: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
d960: 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  .  ** then write
d970: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
d980: 65 20 74 6f 20 74 68 65 20 63 68 65 63 6b 70 6f  e to the checkpo
d990: 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  int journal.  No
d9a0: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  te that.  ** the
d9b0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
d9c0: 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65 73 20  nal always uses 
d9d0: 74 68 65 20 73 69 6d 70 6c 69 65 72 20 66 6f 72  the simplier for
d9e0: 6d 61 74 20 32 20 74 68 61 74 20 6c 61 63 6b 73  mat 2 that lacks
d9f0: 0a 20 20 2a 2a 20 63 68 65 63 6b 73 75 6d 73 2e  .  ** checksums.
da00: 20 20 54 68 65 20 68 65 61 64 65 72 20 69 73 20    The header is 
da10: 61 6c 73 6f 20 6f 6d 69 74 74 65 64 20 66 72 6f  also omitted fro
da20: 6d 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  m the checkpoint
da30: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
da40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
da50: 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
da60: 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70  inCkpt && (int)p
da70: 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
da80: 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20  ->ckptSize ){.  
da90: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
daa0: 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
dab0: 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
dac0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
dad0: 0a 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73  .    store32bits
dae0: 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
daf0: 20 2d 34 29 3b 0a 20 20 20 20 72 63 20 3d 20 73   -4);.    rc = s
db00: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
db10: 61 67 65 72 2d 3e 63 70 66 64 2c 20 26 28 28 63  ager->cpfd, &((c
db20: 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c  har*)pData)[-4],
db30: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
db40: 45 2b 34 29 3b 0a 20 20 20 20 69 66 28 20 72 63  E+4);.    if( rc
db50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
db60: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
db70: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
db80: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
db90: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
dba0: 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
dbb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
dbc0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63   }.    pPager->c
dbd0: 6b 70 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 61  kptNRec++;.    a
dbe0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
dbf0: 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20  InCkpt!=0 );.   
dc00: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
dc10: 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
dc20: 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
dc30: 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
dc40: 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67  to_ckpt_list(pPg
dc50: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
dc60: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
dc70: 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
dc80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
dc90: 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
dca0: 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
dcb0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
dcc0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
dcd0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
dce0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
dcf0: 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
dd00: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
dd10: 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
dd20: 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
dd30: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72  o sqlitepager_wr
dd40: 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
dd50: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
dd60: 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
dd70: 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
dd80: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
dd90: 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
dda0: 69 74 65 70 61 67 65 72 5f 69 73 77 72 69 74 65  itepager_iswrite
ddb0: 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
ddc0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
ddd0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
dde0: 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
ddf0: 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
de00: 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
de10: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
de20: 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
de30: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
de40: 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
de50: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
de60: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 76 65   sqlitepager_ove
de70: 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
de80: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
de90: 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
dea0: 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
deb0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
dec0: 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28  sqlitepager_get(
ded0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
dee0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
def0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
df00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
df10: 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
df20: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
df30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
df40: 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44  memcpy(pPage, pD
df50: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
df60: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
df70: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e    sqlitepager_un
df80: 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ref(pPage);.  }.
df90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dfa0: 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
dfb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
dfc0: 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
dfd0: 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
dfe0: 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
dff0: 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
e000: 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22  n on page "pgno"
e010: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
e020: 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
e030: 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
e040: 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
e050: 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
e060: 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
e070: 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
e080: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
e090: 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
e0a0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
e0b0: 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
e0c0: 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
e0d0: 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
e0e0: 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
e0f0: 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
e100: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
e110: 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
e120: 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
e130: 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
e140: 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
e150: 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72  litepager_dont_r
e160: 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
e170: 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
e180: 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
e190: 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
e1a0: 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
e1b0: 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
e1c0: 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
e1d0: 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
e1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e1f0: 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
e200: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
e210: 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
e220: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
e230: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64  to sqlitepager_d
e240: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
e250: 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
e260: 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
e270: 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
e280: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
e290: 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
e2a0: 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
e2b0: 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
e2c0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
e2d0: 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
e2e0: 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
e2f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
e300: 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
e310: 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
e320: 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
e330: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
e340: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
e350: 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
e360: 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
e370: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
e380: 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
e390: 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
e3a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e3b0: 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
e3c0: 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
e3d0: 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
e3e0: 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
e3f0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
e400: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
e410: 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
e420: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
e430: 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
e440: 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
e450: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
e460: 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
e470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
e480: 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
e490: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
e4a0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
e4b0: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
e4c0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
e4d0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
e4e0: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
e4f0: 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
e500: 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
e510: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
e520: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
e530: 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
e540: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
e550: 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
e560: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
e570: 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
e580: 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
e590: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
e5a0: 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
e5b0: 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
e5c0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
e5d0: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
e5e0: 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
e5f0: 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
e600: 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
e610: 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
e620: 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
e630: 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
e640: 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
e650: 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
e660: 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
e670: 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
e680: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
e690: 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
e6a0: 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
e6b0: 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
e6c0: 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
e6d0: 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
e6e0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
e6f0: 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
e700: 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
e710: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
e720: 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
e730: 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
e740: 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
e750: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
e760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
e770: 41 43 45 32 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE2("DONT_WRITE
e780: 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20   %d\n", pgno);. 
e790: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
e7a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
e7b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
e7c0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
e7d0: 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
e7e0: 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
e7f0: 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
e800: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
e810: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
e820: 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
e830: 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
e840: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
e850: 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
e860: 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
e870: 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
e880: 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
e890: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  journal..*/.void
e8a0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e   sqlitepager_don
e8b0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
e8c0: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
e8d0: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
e8e0: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
e8f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
e900: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
e910: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
e920: 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
e930: 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  OCK || pPager->j
e940: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
e950: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
e960: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
e970: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
e980: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 20 72 65  aysRollback ) re
e990: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
e9a0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
e9b0: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
e9c0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
e9d0: 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
e9e0: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
e9f0: 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
ea00: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
ea10: 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
ea20: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
ea30: 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
ea40: 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
ea50: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
ea60: 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
ea70: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
ea80: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
ea90: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
eaa0: 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
eab0: 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50  _to_ckpt_list(pP
eac0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
ead0: 41 43 45 32 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE2("DONT_ROLLB
eae0: 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  ACK %d\n", pPg->
eaf0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pgno);.  }.  if(
eb00: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
eb10: 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b  se && !pPg->inCk
eb20: 70 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  pt && (int)pPg->
eb30: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b  pgno<=pPager->ck
eb40: 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  ptSize ){.    as
eb50: 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
eb60: 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
eb70: 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
eb80: 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
eb90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
eba0: 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20  >aInCkpt!=0 );. 
ebb0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
ebc0: 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  pt[pPg->pgno/8] 
ebd0: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
ebe0: 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
ebf0: 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70  d_to_ckpt_list(p
ec00: 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Pg);.  }.}../*.*
ec10: 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
ec20: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
ec30: 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
ec40: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
ec50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
ec60: 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
ec70: 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
ec80: 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
ec90: 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
eca0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
ecb0: 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
ecc0: 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
ecd0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
ece0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
ecf0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d  sqlitepager_comm
ed00: 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
ed10: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
ed20: 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
ed30: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
ed40: 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k==PAGER_ERR_FUL
ed50: 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  L ){.    rc = sq
ed60: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
ed70: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
ed80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ed90: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
eda0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
edb0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
edc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
edd0: 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
ede0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
edf0: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
ee00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
ee10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
ee20: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
ee30: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20  _WRITELOCK ){.  
ee40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ee50: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
ee60: 43 45 31 28 22 43 4f 4d 4d 49 54 5c 6e 22 29 3b  CE1("COMMIT\n");
ee70: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
ee80: 69 72 74 79 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  irtyFile==0 ){. 
ee90: 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79     /* Exit early
eea0: 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20   (without doing 
eeb0: 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69  the time-consumi
eec0: 6e 67 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28  ng sqliteOsSync(
eed0: 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
eee0: 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
eef0: 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
ef00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ef10: 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
ef20: 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
ef30: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
ef40: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
ef50: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
ef60: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
ef70: 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
ef80: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
ef90: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
efa0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28  nalOpen );.  if(
efb0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
efc0: 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79 6e  c && sqliteOsSyn
efd0: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 21  c(&pPager->jfd)!
efe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
eff0: 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
f000: 6f 72 74 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  ort;.  }.  pPg =
f010: 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
f020: 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
f030: 72 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  r);.  if( pPg ){
f040: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
f050: 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
f060: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
f070: 7c 7c 20 28 21 70 50 61 67 65 72 2d 3e 6e 6f 53  || (!pPager->noS
f080: 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53  ync && sqliteOsS
f090: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ync(&pPager->fd)
f0a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  !=SQLITE_OK) ){.
f0b0: 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69        goto commi
f0c0: 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  t_abort;.    }. 
f0d0: 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
f0e0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
f0f0: 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
f100: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
f110: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
f120: 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74  ump here if anyt
f130: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
f140: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
f150: 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  t process..  */.
f160: 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20  commit_abort:.  
f170: 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
f180: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
f190: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f1a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
f1b0: 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
f1c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
f1e0: 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
f1f0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
f200: 6c 6c 73 20 62 61 63 6b 20 74 6f 20 72 65 61 64  lls back to read
f210: 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41  -only mode..** A
f220: 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
f230: 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
f240: 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
f250: 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
f260: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
f270: 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
f280: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
f290: 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
f2a0: 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
f2b0: 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
f2c0: 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
f2d0: 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
f2e0: 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52  tocol (SQLITE_PR
f2f0: 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73  OTOCOL) or unles
f300: 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
f310: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
f320: 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
f330: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
f340: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
f350: 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
f360: 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
f370: 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
f380: 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
f390: 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
f3a0: 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
f3b0: 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
f3c0: 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
f3d0: 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
f3e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
f3f0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
f400: 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
f410: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
f420: 63 3b 0a 20 20 54 52 41 43 45 31 28 22 52 4f 4c  c;.  TRACE1("ROL
f430: 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20 20 69 66 28  LBACK\n");.  if(
f440: 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46   !pPager->dirtyF
f450: 69 6c 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ile || !pPager->
f460: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
f470: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
f480: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
f490: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
f4a0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
f4b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
f4c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
f4d0: 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67  rMask!=0 && pPag
f4e0: 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47  er->errMask!=PAG
f4f0: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
f500: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
f510: 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49  tate>=SQLITE_WRI
f520: 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  TELOCK ){.      
f530: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
f540: 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
f550: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
f560: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
f570: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
f580: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
f590: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
f5a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f5b0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
f5c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
f5d0: 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 69 66  pPager, 1);.  if
f5e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f5f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
f600: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
f610: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f620: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
f630: 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RUPT;.  }.  pPag
f640: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
f650: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f660: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
f670: 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
f680: 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
f690: 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
f6a0: 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
f6b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
f6c0: 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
f6d0: 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
f6e0: 6c 69 74 65 70 61 67 65 72 5f 69 73 72 65 61 64  litepager_isread
f6f0: 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
f700: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
f710: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
f720: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
f730: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
f740: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
f750: 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
f760: 69 6e 74 20 2a 73 71 6c 69 74 65 70 61 67 65 72  int *sqlitepager
f770: 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  _stats(Pager *pP
f780: 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
f790: 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d  int a[9];.  a[0]
f7a0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
f7b0: 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
f7c0: 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
f7d0: 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
f7e0: 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
f7f0: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
f800: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
f810: 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
f820: 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61  er->errMask;.  a
f830: 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
f840: 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
f850: 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
f860: 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
f870: 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  fl;.  return a;.
f880: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f890: 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2a 0a   checkpoint..**.
f8a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f8b0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
f8c0: 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
f8d0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
f8e0: 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
f8f0: 41 20 6e 65 77 20 63 68 65 63 6b 70 6f 69 6e 74  A new checkpoint
f900: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
f910: 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
f920: 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
f930: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
f940: 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
f950: 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
f960: 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
f970: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
f980: 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e 28 50  ger_ckpt_begin(P
f990: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
f9a0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
f9b0: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
f9c0: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69  PNAME_SIZE];.  i
f9d0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
f9e0: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
f9f0: 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f  Pager->ckptAutoo
fa00: 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
fa10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fa20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
fa30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
fa40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
fa50: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
fa60: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
fa70: 6e 43 6b 70 74 20 3d 20 73 71 6c 69 74 65 4d 61  nCkpt = sqliteMa
fa80: 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
fa90: 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
faa0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43  if( pPager->aInC
fab0: 6b 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  kpt==0 ){.    sq
fac0: 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26  liteOsReadLock(&
fad0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
fae0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
faf0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
fb00: 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
fb10: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
fb20: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
fb30: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a  pPager->ckptJSiz
fb40: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
fb50: 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66  oto ckpt_begin_f
fb60: 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
fb70: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
fb80: 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50 61 67 65  ze == .    pPage
fb90: 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  r->nRec*JOURNAL_
fba0: 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f  PG_SZ(journal_fo
fbb0: 72 6d 61 74 29 2b 4a 4f 55 52 4e 41 4c 5f 48 44  rmat)+JOURNAL_HD
fbc0: 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  R_SZ(journal_for
fbd0: 6d 61 74 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  mat) );.#endif. 
fbe0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
fbf0: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ze = pPager->nRe
fc00: 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  c*JOURNAL_PG_SZ(
fc10: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 0a  journal_format).
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 20 2b 20 4a 4f 55 52 4e           + JOURN
fc40: 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61  AL_HDR_SZ(journa
fc50: 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 70 50 61  l_format);.  pPa
fc60: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20  ger->ckptSize = 
fc70: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
fc80: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
fc90: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  kptOpen ){.    r
fca0: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
fcb0: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
fcc0: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a  &pPager->cpfd);.
fcd0: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
fce0: 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69  o ckpt_begin_fai
fcf0: 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
fd00: 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >ckptOpen = 1;. 
fd10: 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e     pPager->ckptN
fd20: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
fd30: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
fd40: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
fd50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 63 6b 70 74  QLITE_OK;. .ckpt
fd60: 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
fd70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
fd80: 43 6b 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Ckpt ){.    sqli
fd90: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
fda0: 49 6e 43 6b 70 74 29 3b 0a 20 20 20 20 70 50 61  InCkpt);.    pPa
fdb0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30  ger->aInCkpt = 0
fdc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
fdd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
fde0: 69 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e  it a checkpoint.
fdf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
fe00: 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28  ger_ckpt_commit(
fe10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
fe20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b    if( pPager->ck
fe30: 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  ptInUse ){.    P
fe40: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
fe50: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53  t;.    sqliteOsS
fe60: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63 70 66  eek(&pPager->cpf
fe70: 64 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 73 71  d, 0);.    /* sq
fe80: 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26  liteOsTruncate(&
fe90: 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29  pPager->cpfd, 0)
fea0: 3b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  ; */.    pPager-
feb0: 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >ckptNRec = 0;. 
fec0: 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49     pPager->ckptI
fed0: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  nUse = 0;.    sq
fee0: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
fef0: 2d 3e 61 49 6e 43 6b 70 74 20 29 3b 0a 20 20 20  ->aInCkpt );.   
ff00: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
ff10: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
ff20: 67 3d 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 3b  g=pPager->pCkpt;
ff30: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
ff40: 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
ff50: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a  pPg->pNextCkpt;.
ff60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ff70: 67 2d 3e 69 6e 43 6b 70 74 20 29 3b 0a 20 20 20  g->inCkpt );.   
ff80: 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d     pPg->inCkpt =
ff90: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
ffa0: 50 72 65 76 43 6b 70 74 20 3d 20 70 50 67 2d 3e  PrevCkpt = pPg->
ffb0: 70 4e 65 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20  pNextCkpt = 0;. 
ffc0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
ffd0: 3e 70 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pCkpt = 0;.  }.
ffe0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75    pPager->ckptAu
fff0: 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
10000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10010 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
10020 6b 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a  k a checkpoint..
10030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
10040 65 72 5f 63 6b 70 74 5f 72 6f 6c 6c 62 61 63 6b  er_ckpt_rollback
10050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10060 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
10070 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
10080 73 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  se ){.    rc = p
10090 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61  ager_ckpt_playba
100a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
100b0 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
100c0 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
100d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
100e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
100f0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  }.  pPager->ckpt
10100 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
10110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
10120 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
10130 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
10140 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
10150 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
10160 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
10170 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
10180 74 65 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  tepager_refdump(
10190 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
101a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
101b0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
101c0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
101d0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
101e0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
101f0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
10200 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45      printf("PAGE
10210 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78   %3d addr=0x%08x
10220 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
10230 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
10240 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
10250 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
10260 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
10270 66 0a                                            f.