/ Hex Artifact Content
Login

Artifact 82148bde7a080caab5f1c9ccec921275a14306dc:


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 30  : pager.c,v 1.70
0350: 20 32 30 30 33 2f 30 31 2f 32 32 20 30 31 3a 32   2003/01/22 01:2
0360: 36 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a  6:44 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
10b0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
10e0: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
10f0: 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   */.  /* SQLITE_
1100: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
1110: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1120: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1130: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1140: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1150: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1160: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1170: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
1180: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1190: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
11a0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
11b0: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
11c0: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
11d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
11e0: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
11f0: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
1200: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
1210: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
1220: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
1230: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
1240: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
1250: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1260: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f  E_PAGE_SIZE])../
1270: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1280: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1290: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
12a0: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
12b0: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
12c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
12d0: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
12e0: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
12f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1300: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1310: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1320: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1330: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1340: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1350: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1360: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1370: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1380: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1390: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
13a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
13c0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
13d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
13f0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1400: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1420: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1430: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
1440: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
1450: 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20 20 20  File cpfd;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1480: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1490: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
14a0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
14b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14c0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14d0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
14e0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1500: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1510: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1520: 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20    int ckptSize; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1550: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1560: 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  ckpt_begin() */.
1570: 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a    off_t ckptJSiz
1580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1590: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
15a0: 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29   at ckpt_begin()
15b0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
15c0: 55 47 0a 20 20 6f 66 66 5f 74 20 73 79 6e 63 4a  UG.  off_t syncJ
15d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
15e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
15f0: 6e 61 6c 20 61 74 20 6c 61 73 74 20 66 73 79 6e  nal at last fsyn
1600: 63 28 29 20 63 61 6c 6c 20 2a 2f 0a 23 65 6e 64  c() call */.#end
1610: 69 66 0a 20 20 69 6e 74 20 63 6b 70 74 4e 52 65  if.  int ckptNRe
1620: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1630: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
1640: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 63 68 65  cords in the che
1650: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
1660: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
1690: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
16a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
16b0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  /.  void (*xDest
16c0: 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 29 3b 20  ructor)(void*); 
16d0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
16e0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
16f0: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  g pages */.  int
1700: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1710: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1720: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
1730: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
1740: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1760: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
1770: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
1780: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
1790: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
17c0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
17d0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e  in cache */.  in
17e0: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
17f0: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
1800: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
1810: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
1820: 6f 77 73 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  ows */.  u8 jour
1830: 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  nalOpen;        
1840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
1860: 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69  criptors is vali
1870: 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  d */.  u8 journa
1880: 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20  lStarted;       
1890: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
18a0: 69 74 69 61 6c 20 6d 61 67 69 63 20 6f 66 20 6a  itial magic of j
18b0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
18c0: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
18d0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
18e0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20    /* Do not use 
18f0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1900: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
1910: 2a 2f 0a 20 20 75 38 20 63 6b 70 74 4f 70 65 6e  */.  u8 ckptOpen
1920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1930: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1940: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
1950: 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20  al is open */.  
1960: 75 38 20 63 6b 70 74 49 6e 55 73 65 3b 20 20 20  u8 ckptInUse;   
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1980: 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20  rue we are in a 
1990: 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20  checkpoint */.  
19a0: 75 38 20 63 6b 70 74 41 75 74 6f 6f 70 65 6e 3b  u8 ckptAutoopen;
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19c0: 70 65 6e 20 63 6b 70 74 20 6a 6f 75 72 6e 61 6c  pen ckpt journal
19d0: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
19e0: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
19f0: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a10: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
1a20: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
1a30: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43   /* SQLITE_UNLOC
1a60: 4b 2c 20 5f 52 45 41 44 4c 4f 43 4b 20 6f 72 20  K, _READLOCK or 
1a70: 5f 57 52 49 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20  _WRITELOCK */.  
1a80: 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20  u8 errMask;     
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
1ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
1ac0: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
1af0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1b00: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
1b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b20: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
1b30: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
1b40: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
1b50: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1b60: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
1b70: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
1b80: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1b90: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 46  l */.  u8 dirtyF
1ba0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
1bb0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 61     /* True if da
1bc0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
1bd0: 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 77  changed in any w
1be0: 61 79 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ay */.  u8 alway
1bf0: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
1c00: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
1c10: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1c20: 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  or all pages */.
1c30: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 46 6f 72 6d    u8 journalForm
1c40: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  at;           /*
1c50: 20 56 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   Version number 
1c60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c70: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
1c80: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
1c90: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
1ca0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
1cb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cc0: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 43  le */.  u8 *aInC
1cd0: 6b 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  kpt;            
1ce0: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
1cf0: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
1d00: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1d10: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c    PgHdr *pFirst,
1d20: 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a   *pLast;      /*
1d30: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   List of free pa
1d40: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
1d50: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20  pFirstSynced;   
1d60: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72       /* First fr
1d70: 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48  ee page with PgH
1d80: 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a  dr.needSync==0 *
1d90: 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b  /.  PgHdr *pAll;
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70  /* List of all p
1dc0: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
1dd0: 2a 70 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20  *pCkpt;         
1de0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1df0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 68   pages in the ch
1e00: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1e10: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
1e20: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
1e30: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
1e40: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
1e50: 65 72 20 6f 66 20 50 67 48 64 72 20 2a 2f 0a 7d  er of PgHdr */.}
1e60: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
1e70: 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e  re bits that can
1e80: 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72   be set in Pager
1e90: 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65  .errMask..*/.#de
1ea0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46  fine PAGER_ERR_F
1eb0: 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a  ULL     0x01  /*
1ec0: 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65   a write() faile
1ed0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
1ee0: 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20  ER_ERR_MEM      
1ef0: 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28  0x02  /* malloc(
1f00: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
1f10: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  ine PAGER_ERR_LO
1f20: 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20  CK     0x04  /* 
1f30: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63  error in the loc
1f40: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  king protocol */
1f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1f60: 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38  RR_CORRUPT  0x08
1f70: 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72    /* database or
1f80: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
1f90: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ion */.#define P
1fa0: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20  AGER_ERR_DISK   
1fb0: 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72    0x10  /* gener
1fc0: 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  al disk I/O erro
1fd0: 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69  r - bad hard dri
1fe0: 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ve? */../*.** Th
1ff0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
2000: 6f 6e 74 61 69 6e 73 20 70 61 67 65 20 72 65 63  ontains page rec
2010: 6f 72 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ords in the foll
2020: 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74 2e  owing.** format.
2030: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2040: 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 50 61  ct PageRecord Pa
2050: 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75 63 74  geRecord;.struct
2060: 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a 20 20   PageRecord {.  
2070: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2090: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
20a0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44 61 74  r */.  char aDat
20b0: 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  a[SQLITE_PAGE_SI
20c0: 5a 45 5d 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ZE];  /* Origina
20d0: 6c 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  l data for page 
20e0: 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  pgno */.};../*.*
20f0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
2100: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
2110: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
2120: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
2130: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
2140: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
2150: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
2160: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
2170: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  check..**.** The
2180: 72 65 20 61 72 65 20 74 77 6f 20 6a 6f 75 72 6e  re are two journ
2190: 61 6c 20 66 6f 72 6d 61 74 73 2e 20 20 54 68 65  al formats.  The
21a0: 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c 20 66   older journal f
21b0: 6f 72 6d 61 74 20 77 72 69 74 65 73 0a 2a 2a 20  ormat writes.** 
21c0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20  32-bit integers 
21d0: 69 6e 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65  in the byte-orde
21e0: 72 20 6f 66 20 74 68 65 20 68 6f 73 74 20 6d 61  r of the host ma
21f0: 63 68 69 6e 65 2e 20 20 54 68 65 20 6e 65 77 0a  chine.  The new.
2200: 2a 2a 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73  ** format writes
2210: 20 69 6e 74 65 67 65 72 73 20 61 73 20 62 69 67   integers as big
2220: 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65  -endian.  All ne
2230: 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74  w journals use t
2240: 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74  he.** new format
2250: 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 74 6f  , but we have to
2260: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64   be able to read
2270: 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61   an older journa
2280: 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  l in order.** to
2290: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
22a0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
22b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4f 6c  nsigned char aOl
22c0: 64 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  dJournalMagic[] 
22d0: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
22e0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
22f0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
2300: 30 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20  0xd4,.};.static 
2310: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
2320: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
2330: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
2340: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
2350: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
2360: 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 23 64 65  63, 0xd5,.};.#de
2370: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e 45 57 5f  fine SQLITE_NEW_
2380: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 20 31  JOURNAL_FORMAT 1
2390: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
23a0: 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  OLD_JOURNAL_FORM
23b0: 41 54 20 30 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  AT 0../*.** The 
23c0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65  following intege
23d0: 72 2c 20 69 66 20 73 65 74 2c 20 63 61 75 73 65  r, if set, cause
23e0: 73 20 6a 6f 75 72 6e 61 6c 73 20 74 6f 20 62 65  s journals to be
23f0: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
2400: 2a 2a 20 6f 6c 64 20 66 6f 72 6d 61 74 2e 20 20  ** old format.  
2410: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
2420: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
2430: 73 20 6f 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65  s only - to make
2440: 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 63 6f 64   sure.** the cod
2450: 65 20 69 73 20 61 62 6c 65 20 74 6f 20 72 6f 6c  e is able to rol
2460: 6c 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  lback an old jou
2470: 72 6e 61 6c 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rnal..*/.#ifdef 
2480: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2490: 70 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74  pager_old_format
24a0: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65   = 0;.#else.# de
24b0: 66 69 6e 65 20 70 61 67 65 72 5f 6f 6c 64 5f 66  fine pager_old_f
24c0: 6f 72 6d 61 74 20 30 0a 23 65 6e 64 69 66 0a 0a  ormat 0.#endif..
24d0: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
24e0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
24f0: 63 6b 69 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23  cking here:.*/.#
2500: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2510: 54 0a 20 20 69 6e 74 20 70 61 67 65 72 5f 72 65  T.  int pager_re
2520: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
2530: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
2540: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
2550: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
2560: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
2570: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 5f  .    if( !pager_
2580: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29  refinfo_enable )
2590: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69   return;.    pri
25a0: 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46  ntf(.       "REF
25b0: 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78  CNT: %4d addr=0x
25c0: 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  %08x nRef=%d\n",
25d0: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
25e0: 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44   (int)PGHDR_TO_D
25f0: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a  ATA(p), p->nRef.
2600: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
2610: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
2620: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
2630: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
2640: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
2650: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
2660: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
2670: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
2680: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
2690: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
26a0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
26b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
26c0: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
26d0: 72 65 61 64 33 32 62 69 74 73 28 50 61 67 65 72  read32bits(Pager
26e0: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
26f0: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
2700: 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69  {.  u32 res;.  i
2710: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
2720: 6c 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20 26  liteOsRead(fd, &
2730: 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29  res, sizeof(res)
2740: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2750: 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
2760: 2d 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 3d  ->journalFormat=
2770: 3d 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52  =SQLITE_NEW_JOUR
2780: 4e 41 4c 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20  NAL_FORMAT ){.  
2790: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27a0: 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ac[4];.    memcp
27b0: 79 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a  y(ac, &res, 4);.
27c0: 20 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d      res = (ac[0]
27d0: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
27e0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
27f0: 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20   | ac[3];.  }.  
2800: 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72  *pRes = res;.  r
2810: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2820: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
2830: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
2840: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
2850: 73 63 72 69 70 74 6f 72 2e 20 20 57 72 69 74 69  scriptor.  Writi
2860: 6e 67 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ng.** is always 
2870: 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 6e  done using the n
2880: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
2890: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
28a0: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
28b0: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
28c0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
28d0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 66 28 20  ar ac[4];.  if( 
28e0: 70 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74  pager_old_format
28f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
2900: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 66 64 2c  qliteOsWrite(fd,
2910: 20 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d 0a 20   &val, 4);.  }. 
2920: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
2930: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
2940: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
2950: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
2960: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
2970: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
2980: 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e  & 0xff;.  return
2990: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 66   sqliteOsWrite(f
29a0: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
29b0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
29c0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
29d0: 61 20 70 61 67 65 20 68 65 61 64 65 72 20 72 69  a page header ri
29e0: 67 68 74 20 62 65 66 6f 72 65 20 74 68 65 0a 2a  ght before the.*
29f0: 2a 20 70 61 67 65 20 64 61 74 61 2e 20 20 54 68  * page data.  Th
2a00: 69 73 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  is will overwrit
2a10: 65 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  e the PgHdr.pDir
2a20: 74 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ty pointer..*/.s
2a30: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
2a40: 50 61 67 65 4e 75 6d 62 65 72 28 50 67 48 64 72  PageNumber(PgHdr
2a50: 20 2a 70 29 7b 0a 20 20 75 33 32 20 76 61 6c 20   *p){.  u32 val 
2a60: 3d 20 70 2d 3e 70 67 6e 6f 3b 0a 20 20 75 6e 73  = p->pgno;.  uns
2a70: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
2a80: 20 20 61 63 20 3d 20 26 28 28 63 68 61 72 2a 29    ac = &((char*)
2a90: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
2aa0: 29 5b 2d 34 5d 3b 0a 20 20 69 66 28 20 70 61 67  )[-4];.  if( pag
2ab0: 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 29 7b  er_old_format ){
2ac0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20  .    memcpy(ac, 
2ad0: 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d 65 6c 73  &val, 4);.  }els
2ae0: 65 7b 0a 20 20 20 20 61 63 5b 30 5d 20 3d 20 28  e{.    ac[0] = (
2af0: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
2b00: 0a 20 20 20 20 61 63 5b 31 5d 20 3d 20 28 76 61  .    ac[1] = (va
2b10: 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20  l>>16) & 0xff;. 
2b20: 20 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e     ac[2] = (val>
2b30: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >8) & 0xff;.    
2b40: 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78  ac[3] = val & 0x
2b50: 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  ff;.  }.}.../*.*
2b60: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69  * Convert the bi
2b70: 74 73 20 69 6e 20 74 68 65 20 70 50 61 67 65 72  ts in the pPager
2b80: 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61  ->errMask into a
2b90: 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20  n approprate.** 
2ba0: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a  return code..*/.
2bb0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2bc0: 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a  _errcode(Pager *
2bd0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2be0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bf0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2c00: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
2c10: 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20  _LOCK )    rc = 
2c20: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
2c30: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
2c40: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
2c50: 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20  RR_DISK )    rc 
2c60: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
2c70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
2c80: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
2c90: 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d  R_FULL )    rc =
2ca0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
2cb0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
2cc0: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
2cd0: 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53  MEM )     rc = S
2ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69  QLITE_NOMEM;.  i
2cf0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
2d00: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43  sk & PAGER_ERR_C
2d10: 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20 53 51  ORRUPT ) rc = SQ
2d20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
2d30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2d40: 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76  .** Add or remov
2d50: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
2d60: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
2d70: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
2d80: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  the.** checkpoin
2d90: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
2da0: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
2db0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
2dc0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
2dd0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
2de0: 2a 2a 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ** the checkpoin
2df0: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
2e00: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
2e10: 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d  epager_ckpt_comm
2e20: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
2e30: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
2e40: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2e50: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
2e60: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
2e70: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
2e80: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
2e90: 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  n the checkpoint
2ea0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
2ec0: 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 50  d_to_ckpt_list(P
2ed0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2ee0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2ef0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2f00: 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 20 72   pPg->inCkpt ) r
2f10: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2f20: 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 3d   pPg->pPrevCkpt=
2f30: 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74  =0 && pPg->pNext
2f40: 43 6b 70 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67  Ckpt==0 );.  pPg
2f50: 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30 3b  ->pPrevCkpt = 0;
2f60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
2f70: 43 6b 70 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Ckpt ){.    pPag
2f80: 65 72 2d 3e 70 43 6b 70 74 2d 3e 70 50 72 65 76  er->pCkpt->pPrev
2f90: 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Ckpt = pPg;.  }.
2fa0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74    pPg->pNextCkpt
2fb0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74   = pPager->pCkpt
2fc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70  ;.  pPager->pCkp
2fd0: 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  t = pPg;.  pPg->
2fe0: 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 7d 0a 73 74  inCkpt = 1;.}.st
2ff0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
3000: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70 74 5f  emove_from_ckpt_
3010: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
3020: 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  {.  if( !pPg->in
3030: 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Ckpt ) return;. 
3040: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 43   if( pPg->pPrevC
3050: 6b 70 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  kpt ){.    asser
3060: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70  t( pPg->pPrevCkp
3070: 74 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d 70 50  t->pNextCkpt==pP
3080: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
3090: 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78 74 43 6b  revCkpt->pNextCk
30a0: 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43  pt = pPg->pNextC
30b0: 6b 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  kpt;.  }else{.  
30c0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
30d0: 50 61 67 65 72 2d 3e 70 43 6b 70 74 3d 3d 70 50  Pager->pCkpt==pP
30e0: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
30f0: 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50  ager->pCkpt = pP
3100: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20  g->pNextCkpt;.  
3110: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
3120: 78 74 43 6b 70 74 20 29 7b 0a 20 20 20 20 61 73  xtCkpt ){.    as
3130: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
3140: 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 3d  Ckpt->pPrevCkpt=
3150: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
3160: 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70 50 72 65  >pNextCkpt->pPre
3170: 76 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 50 72  vCkpt = pPg->pPr
3180: 65 76 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 70 50  evCkpt;.  }.  pP
3190: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 30  g->pNextCkpt = 0
31a0: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b  ;.  pPg->pPrevCk
31b0: 70 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69  pt = 0;.  pPg->i
31c0: 6e 43 6b 70 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nCkpt = 0;.}../*
31d0: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
31e0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
31f0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
3200: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
3210: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
3220: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
3230: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
3240: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
3250: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
3260: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
3270: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
3280: 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48   *p = pPager->aH
3290: 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70  ash[pager_hash(p
32a0: 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  gno)];.  while( 
32b0: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
32c0: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
32d0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
32e0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
32f0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
3300: 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65  database and cle
3310: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
3320: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
3330: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
3340: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
3350: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
3360: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
3370: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
3380: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
3390: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
33a0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
33b0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
33c0: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
33d0: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
33e0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
33f0: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
3400: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
3410: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
3420: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
3430: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
3440: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
3450: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
3460: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
3470: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
3480: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
3490: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
34a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
34b0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
34c0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
34d0: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
34e0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
34f0: 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  All = 0;.  memse
3500: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
3510: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
3520: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50  r->aHash));.  pP
3530: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
3540: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
3550: 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49  tate>=SQLITE_WRI
3560: 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71  TELOCK ){.    sq
3570: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
3580: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
3590: 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b    sqliteOsUnlock
35a0: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
35b0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
35c0: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a   SQLITE_UNLOCK;.
35d0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
35e0: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
35f0: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73  >nRef = 0;.  ass
3600: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
3610: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d  rnalOpen==0 );.}
3620: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
3630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3640: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
3650: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
3660: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
3670: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
3680: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
3690: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
36a0: 61 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ases the databas
36b0: 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
36c0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 72  and acquires a r
36d0: 65 61 64 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  ead lock in its 
36e0: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
36f0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 64  nal file.** is d
3700: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
3710: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3720: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
3730: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
3740: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
3750: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 66 28  gHdr *pPg;.  if(
3760: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 53   pPager->state<S
3770: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
3780: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
3790: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 70 61 67 65  OK;.  sqlitepage
37a0: 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70 50  r_ckpt_commit(pP
37b0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
37c0: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b  ger->ckptOpen ){
37d0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f  .    sqliteOsClo
37e0: 73 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64  se(&pPager->cpfd
37f0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
3800: 6b 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  kptOpen = 0;.  }
3810: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
3820: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
3830: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
3840: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
3850: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
3860: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
3870: 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65 28 70  sqliteOsDelete(p
3880: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
3890: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
38a0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
38b0: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
38c0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
38d0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
38e0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
38f0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
3900: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
3910: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
3920: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
3930: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
3940: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
3950: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
3960: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
3970: 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20  r->dirtyFile==0 
3980: 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  || pPager->useJo
3990: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a  urnal==0 );.  }.
39a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
39b0: 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
39c0: 3e 66 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  >fd);.  if( rc==
39d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
39e0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
39f0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
3a00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
3a10: 2a 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  * This can only 
3a20: 68 61 70 70 65 6e 20 69 66 20 61 20 70 72 6f 63  happen if a proc
3a30: 65 73 73 20 64 6f 65 73 20 61 20 42 45 47 49 4e  ess does a BEGIN
3a40: 2c 20 74 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64  , then forks and
3a50: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
3a60: 64 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 74  d process does t
3a70: 68 65 20 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61  he COMMIT.  Beca
3a80: 75 73 65 20 6f 66 20 74 68 65 20 73 65 6d 61 6e  use of the seman
3a90: 74 69 63 73 20 6f 66 20 75 6e 69 78 0a 20 20 20  tics of unix.   
3aa0: 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   ** file locking
3ab0: 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c  , the unlock wil
3ac0: 6c 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20  l fail..    */. 
3ad0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
3ae0: 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b   = SQLITE_UNLOCK
3af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3b00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
3b10: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
3b20: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
3b30: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
3b40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
3b50: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
3b60: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
3b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
3b80: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
3b90: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
3ba0: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
3bb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
3bc0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
3be0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
3bf0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 61  he cache */.  Pa
3c00: 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b 0a  geRecord pgRec;.
3c10: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
3c20: 74 73 28 70 50 61 67 65 72 2c 20 6a 66 64 2c 20  ts(pPager, jfd, 
3c30: 26 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20  &pgRec.pgno);.  
3c40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3c50: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
3c60: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
3c70: 61 64 28 6a 66 64 2c 20 26 70 67 52 65 63 2e 61  ad(jfd, &pgRec.a
3c80: 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 70 67 52  Data, sizeof(pgR
3c90: 65 63 2e 61 44 61 74 61 29 29 3b 0a 20 20 69 66  ec.aData));.  if
3ca0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3cb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
3cc0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
3cd0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ng on the page *
3ce0: 2f 0a 20 20 69 66 28 20 70 67 52 65 63 2e 70 67  /.  if( pgRec.pg
3cf0: 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
3d00: 65 20 7c 7c 20 70 67 52 65 63 2e 70 67 6e 6f 3d  e || pgRec.pgno=
3d10: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
3d20: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 2f  TE_CORRUPT;..  /
3d30: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70  * Playback the p
3d40: 61 67 65 2e 20 20 55 70 64 61 74 65 20 74 68 65  age.  Update the
3d50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20   in-memory copy 
3d60: 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  of the page.  **
3d70: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3d80: 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  e, if there is o
3d90: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ne..  */.  pPg =
3da0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
3db0: 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f  ager, pgRec.pgno
3dc0: 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
3dd0: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
3de0: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ==0 ){.    TRACE
3df0: 32 28 22 50 4c 41 59 42 41 43 4b 20 25 64 5c 6e  2("PLAYBACK %d\n
3e00: 22 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a  ", pgRec.pgno);.
3e10: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
3e20: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
3e30: 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66  gRec.pgno-1)*(of
3e40: 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f  f_t)SQLITE_PAGE_
3e50: 53 49 5a 45 29 3b 0a 20 20 20 20 72 63 20 3d 20  SIZE);.    rc = 
3e60: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
3e70: 50 61 67 65 72 2d 3e 66 64 2c 20 70 67 52 65 63  Pager->fd, pgRec
3e80: 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50  .aData, SQLITE_P
3e90: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20  AGE_SIZE);.  }. 
3ea0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
3eb0: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
3ec0: 44 41 54 41 28 70 50 67 29 2c 20 70 67 52 65 63  DATA(pPg), pgRec
3ed0: 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50  .aData, SQLITE_P
3ee0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  AGE_SIZE);.    m
3ef0: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
3f00: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
3f10: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
3f20: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
3f30: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  0;.    pPg->need
3f40: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Sync = 0;.  }.  
3f50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3f60: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
3f70: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
3f80: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
3f90: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
3fa0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
3fb0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
3fc0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
3fd0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
3fe0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
3ff0: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
4000: 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69 73  llows:  There is
4010: 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66   an initial.** f
4020: 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67 20  ile-type string 
4030: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
4040: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72 65  ing.  Then there
4050: 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   is a single.** 
4060: 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69 63  Pgno number whic
4070: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
4080: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4090: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
40a0: 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65 20  ** changes were 
40b0: 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74 61 62  made.  The datab
40c0: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
40d0: 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a   to this size..*
40e0: 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f  * Next come zero
40f0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72 65   or more page re
4100: 63 6f 72 64 73 20 77 68 65 72 65 20 65 61 63 68  cords where each
4110: 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20   page record.** 
4120: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50 67  consists of a Pg
4130: 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50 41  no and SQLITE_PA
4140: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE bytes of
4150: 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74   data.  See.** t
4160: 68 65 20 50 61 67 65 52 65 63 6f 72 64 20 73 74  he PageRecord st
4170: 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 74 61  ructure for deta
4180: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ils..**.** If th
4190: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
41a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
41b0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
41c0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
41d0: 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74 65 72  l file (as deter
41e0: 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  mined by looking
41f0: 20 61 74 20 74 68 65 20 6d 61 67 69 63 20 6e 75   at the magic nu
4200: 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  mber.** at the b
4210: 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e 20 74  eginning) then t
4220: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4230: 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  rns SQLITE_PROTO
4240: 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  COL..** If any o
4250: 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63 63 75  ther errors occu
4260: 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62 61 63  r during playbac
4270: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
4280: 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20 62  will.** likely b
4290: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20  e corrupted, so 
42a0: 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  the PAGER_ERR_CO
42b0: 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65 74  RRUPT bit is set
42c0: 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 65   in.** pPager->e
42d0: 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c 49 54  rrMask and SQLIT
42e0: 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
42f0: 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c  urned.  If it al
4300: 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68 65 6e  l.** works, then
4310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
4320: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
4330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4340: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
4350: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
4360: 6f 66 66 5f 74 20 6e 52 65 63 3b 20 20 20 20 20  off_t nRec;     
4370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4380: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
4390: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
43b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
43c0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
43d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
43e0: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
43f0: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
4400: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
4410: 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66  ar aMagic[sizeof
4420: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
4430: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
4440: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
4450: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
4460: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
4470: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
4480: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
4490: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
44a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
44b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
44c0: 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65  );.  sqliteOsSee
44d0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
44e0: 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
44f0: 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  eOsFileSize(&pPa
4500: 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29  ger->jfd, &nRec)
4510: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4520: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
4530: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
4540: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 63 20 3c    }.  if( nRec <
4550: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b   sizeof(aMagic)+
4560: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a  sizeof(Pgno) ){.
4570: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
4580: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65  yback;.  }.  nRe
4590: 63 20 3d 20 28 6e 52 65 63 20 2d 20 28 73 69 7a  c = (nRec - (siz
45a0: 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65  eof(aMagic)+size
45b0: 6f 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a  of(Pgno))) / siz
45c0: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
45d0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
45e0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
45f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75   journal and tru
4600: 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64  ncate the.  ** d
4610: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
4620: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
4630: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
4640: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
4650: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
4660: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
4670: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
4680: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4690: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
46a0: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74  ROTOCOL;.    got
46b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
46c0: 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70    }.  if( memcmp
46d0: 28 61 4d 61 67 69 63 2c 20 61 4f 6c 64 4a 6f 75  (aMagic, aOldJou
46e0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
46f0: 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b  f(aMagic))==0 ){
4700: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
4710: 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51 4c  rnalFormat = SQL
4720: 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f  ITE_OLD_JOURNAL_
4730: 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73 65 20  FORMAT;.  }else 
4740: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
4750: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
4760: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
4770: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  )==0 ){.    pPag
4780: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61  er->journalForma
4790: 74 20 3d 20 53 51 4c 49 54 45 5f 4e 45 57 5f 4a  t = SQLITE_NEW_J
47a0: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20  OURNAL_FORMAT;. 
47b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
47c0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
47d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
47e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
47f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
4800: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
4810: 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69  jfd, &mxPg);.  i
4820: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4830: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
4840: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
4850: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72   rc = sqliteOsTr
4860: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
4870: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
4880: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67  SIZE*(off_t)mxPg
4890: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
48a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
48b0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
48c0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
48d0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
48e0: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
48f0: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
4900: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
4910: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
4920: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
4930: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
4940: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4950: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
4960: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
4970: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
4980: 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  >jfd);.    if( r
4990: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
49a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 65 6e 64 5f  reak;.  }...end_
49b0: 70 6c 61 79 62 61 63 6b 3a 0a 23 69 66 20 21 64  playback:.#if !d
49c0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
49d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
49e0: 5f 54 45 53 54 29 0a 20 20 2f 2a 20 46 6f 72 20  _TEST).  /* For 
49f0: 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
4a00: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 69 6e  never written in
4a10: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
4a20: 72 65 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a  restore the.  **
4a30: 20 6d 65 6d 6f 72 79 20 63 6f 70 79 20 66 72 6f   memory copy fro
4a40: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  m the original d
4a50: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
4a60: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
4a70: 63 6f 64 65 20 69 73 20 75 73 65 64 20 64 75 72  code is used dur
4a80: 69 6e 67 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  ing testing only
4a90: 2e 20 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  .  It is necessa
4aa0: 72 79 20 74 6f 0a 20 20 2a 2a 20 63 6f 6d 70 65  ry to.  ** compe
4ab0: 6e 73 61 74 65 20 66 6f 72 20 74 68 65 20 73 71  nsate for the sq
4ac0: 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 29  liteOsTruncate()
4ad0: 20 63 61 6c 6c 20 69 6e 73 69 64 65 20 0a 20 20   call inside .  
4ae0: 2a 2a 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  ** sqlitepager_r
4af0: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a  ollback()..  */.
4b00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4b10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
4b20: 20 2a 70 50 67 3b 0a 20 20 20 20 66 6f 72 28 70   *pPg;.    for(p
4b30: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
4b40: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
4b50: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
4b60: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
4b70: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
4b80: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
4b90: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
4ba0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  (&pPager->fd, SQ
4bb0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28  LITE_PAGE_SIZE*(
4bc0: 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f  off_t)(pPg->pgno
4bd0: 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  -1));.        rc
4be0: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
4bf0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
4c00: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
4c10: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
4c20: 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
4c30: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
4c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4c50: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
4c60: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53  _DATA(pPg), 0, S
4c70: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
4c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4c90: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
4ca0: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
4cb0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
4cc0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
4cd0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
4ce0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
4cf0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
4d00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4d10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72  _OK ){.    pager
4d20: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
4d30: 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
4d40: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
4d50: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
4d60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4d70: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
4d80: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
4d90: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
4da0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
4db0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4dc0: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 63 68 65  Playback the che
4dd0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  ckpoint journal.
4de0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
4df0: 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e  imilar to playin
4e00: 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  g back the trans
4e10: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
4e20: 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77  ut with.** a few
4e30: 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a   extra twists..*
4e40: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
4e50: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
4e60: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
4e70: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61   file at the sta
4e80: 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  rt of.**        
4e90: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
4ea0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
4eb0: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 2c 20 6e  ger->ckptSize, n
4ec0: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
4ed0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
4ee0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
4ef0: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
4f00: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
4f10: 61 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ack the checkpoi
4f20: 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
4f30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
4f40: 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
4f50: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
4f60: 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
4f70: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
4f80: 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
4f90: 3e 63 6b 70 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >ckptJSize..*/.s
4fa0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
4fb0: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  ckpt_playback(Pa
4fc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
4fd0: 6f 66 66 5f 74 20 6e 52 65 63 3b 20 20 20 20 20  off_t nRec;     
4fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4ff0: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
5000: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5020: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
5030: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
5040: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
5050: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
5060: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
5070: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
5080: 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  teOsTruncate(&pP
5090: 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
50a0: 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f  _PAGE_SIZE*(off_
50b0: 74 29 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  t)pPager->ckptSi
50c0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  ze);.  pPager->d
50d0: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
50e0: 63 6b 70 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  ckptSize;..  /* 
50f0: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
5100: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
5110: 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  in the checkpoin
5120: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
5130: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
5140: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 70  ->ckptInUse && p
5150: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
5160: 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73  en );.  sqliteOs
5170: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63 70  Seek(&pPager->cp
5180: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
5190: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65   pPager->ckptNRe
51a0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
51b0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
51c0: 75 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  ut of the checkp
51d0: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  oint journal and
51e0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
51f0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
5200: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  e..  */.  if( pa
5210: 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 29  ger_old_format )
5220: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
5230: 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51  urnalFormat = SQ
5240: 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c  LITE_OLD_JOURNAL
5250: 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73 65  _FORMAT;.  }else
5260: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
5270: 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51  urnalFormat = SQ
5280: 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41 4c  LITE_NEW_JOURNAL
5290: 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 0a 20 20 66  _FORMAT;.  }.  f
52a0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
52b0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
52c0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
52d0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
52e0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29  , &pPager->cpfd)
52f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
5300: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
5310: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
5320: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
5330: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
5340: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
5350: 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
5360: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
5370: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a   ** journal..  *
5380: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  /.  rc = sqliteO
5390: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
53a0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  fd, pPager->ckpt
53b0: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
53c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
53d0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
53e0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
53f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
5400: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
5410: 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20 69  jfd, &nRec);.  i
5420: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5430: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
5440: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _ckpt_playback;.
5450: 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 6e 52    }.  nRec = (nR
5460: 65 63 20 2d 20 70 50 61 67 65 72 2d 3e 63 6b 70  ec - pPager->ckp
5470: 74 4a 53 69 7a 65 29 2f 73 69 7a 65 6f 66 28 50  tJSize)/sizeof(P
5480: 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20 66 6f  ageRecord);.  fo
5490: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
54a0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
54b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
54c0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
54d0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
54e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
54f0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
5500: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _ckpt_playback;.
5510: 20 20 7d 0a 20 20 0a 0a 65 6e 64 5f 63 6b 70 74    }.  ..end_ckpt
5520: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
5530: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5540: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
5550: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
5560: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
5570: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
5580: 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  UPT;.  }.  retur
5590: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
55a0: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
55b0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
55c0: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
55d0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
55e0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
55f0: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
5600: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
5610: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
5620: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
5630: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
5640: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
5650: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
5660: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
5670: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
5680: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
5690: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
56a0: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
56b0: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
56c0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
56d0: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
56e0: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
56f0: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
5700: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
5710: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
5720: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
5730: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
5740: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
5750: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
5760: 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61  litepager_set_ca
5770: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
5780: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
5790: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
57a0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >=0 ){.    pPage
57b0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
57c0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
57d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
57e0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20  r->noSync = 1;. 
57f0: 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50     mxPage = -mxP
5800: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  age;.  }.  if( m
5810: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
5820: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
5830: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a   mxPage;.  }.}..
5840: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
5850: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72  porary file.  Wr
5860: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
5870: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e  the file into zN
5880: 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75  ame.** (zName mu
5890: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53  st be at least S
58a0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
58b0: 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29  IZE bytes long.)
58c0: 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66    Write.** the f
58d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
58e0: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
58f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
5900: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
5910: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
5920: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
5930: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
5940: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
5950: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
5960: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
5970: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
5980: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
5990: 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  tepager_opentemp
59a0: 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73  (char *zFile, Os
59b0: 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74  File *fd){.  int
59c0: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
59d0: 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  rc;.  do{.    cn
59e0: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  t--;.    sqliteO
59f0: 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46  sTempFileName(zF
5a00: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ile);.    rc = s
5a10: 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75  qliteOsOpenExclu
5a20: 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20  sive(zFile, fd, 
5a30: 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e  1);.  }while( cn
5a40: 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  t>0 && rc!=SQLIT
5a50: 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
5a60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
5a70: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
5a80: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
5a90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
5aa0: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
5ab0: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
5ac0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
5ad0: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
5ae0: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
5af0: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
5b00: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
5b10: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67  to sqlitepager_g
5b20: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
5b30: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
5b40: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
5b50: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
5b60: 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65 72 5f  ing sqlitepager_
5b70: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
5b80: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
5b90: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
5ba0: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
5bb0: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
5bc0: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
5bd0: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
5be0: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
5bf0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
5c00: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
5c10: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
5c20: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
5c30: 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 28  qlitepager_open(
5c40: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
5c50: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
5c60: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
5c70: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
5c80: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5c90: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
5ca0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
5cb0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
5cc0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67  n */.  int mxPag
5cd0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5ce0: 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66  /* Max number of
5cf0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
5d00: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
5d10: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
5d20: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
5d30: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
5d40: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
5d50: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
5d60: 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20  urnal           
5d70: 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65 20 61  /* TRUE to use a
5d80: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
5d90: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
5da0: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
5db0: 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46  ager;.  char *zF
5dc0: 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69  ullPathname;.  i
5dd0: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73  nt nameLen;.  Os
5de0: 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72  File fd;.  int r
5df0: 63 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  c;.  int tempFil
5e00: 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  e;.  int readOnl
5e10: 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54  y = 0;.  char zT
5e20: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
5e30: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70  AME_SIZE];..  *p
5e40: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66  pPager = 0;.  if
5e50: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
5e60: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
5e70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5e80: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  M;.  }.  if( zFi
5e90: 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 46  lename ){.    zF
5ea0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
5eb0: 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61  liteOsFullPathna
5ec0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
5ed0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
5ee0: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
5ef0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
5f00: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
5f10: 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a    tempFile = 0;.
5f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
5f30: 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70  = sqlitepager_op
5f40: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
5f50: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
5f60: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
5f70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
5f80: 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e  qliteOsFullPathn
5f90: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
5fa0: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
5fb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
5fc0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
5fd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5fe0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
5ff0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6000: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6010: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
6020: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
6030: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
6040: 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e  N;.  }.  nameLen
6050: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
6060: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
6070: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
6080: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
6090: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b  r) + nameLen*2 +
60a0: 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61   30 );.  if( pPa
60b0: 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ger==0 ){.    sq
60c0: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64 29  liteOsClose(&fd)
60d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
60e0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
60f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6100: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
6110: 53 45 54 5f 50 41 47 45 52 28 70 50 61 67 65 72  SET_PAGER(pPager
6120: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
6130: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
6140: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
6150: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
6160: 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
6170: 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ame[nameLen+1];.
6180: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
6190: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c  >zFilename, zFul
61a0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
61b0: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rcpy(pPager->zJo
61c0: 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68  urnal, zFullPath
61d0: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  name);.  sqliteF
61e0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
61f0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50  e);.  strcpy(&pP
6200: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
6210: 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
6220: 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al");.  pPager->
6230: 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65  fd = fd;.  pPage
6240: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
6250: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   0;.  pPager->us
6260: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
6270: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
6280: 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >ckptOpen = 0;. 
6290: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
62a0: 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  se = 0;.  pPager
62b0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50  ->nRef = 0;.  pP
62c0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
62d0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  1;.  pPager->ckp
62e0: 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  tSize = 0;.  pPa
62f0: 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 20 3d  ger->ckptJSize =
6300: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50   0;.  pPager->nP
6310: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
6320: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
6330: 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20  ge>5 ? mxPage : 
6340: 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  10;.  pPager->st
6350: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c  ate = SQLITE_UNL
6360: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
6370: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
6380: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
6390: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
63a0: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
63b0: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67  readOnly;.  pPag
63c0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
63d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
63e0: 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
63f0: 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
6400: 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
6410: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
6420: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
6430: 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
6440: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
6450: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
6460: 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74  nExtra;.  memset
6470: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
6480: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
6490: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70  ->aHash));.  *pp
64a0: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
64b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
64c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
64d0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
64e0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
64f0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
6500: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
6510: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
6520: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
6530: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
6540: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
6550: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
6560: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
6570: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
6580: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
6590: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
65a0: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
65b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
65c0: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
65d0: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
65e0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
65f0: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
6600: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
6610: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70  alled by sqlitep
6620: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
6630: 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
6640: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
6650: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6660: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
6670: 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  id*)){.  pPager-
6680: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
6690: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Desc;.}../*.** R
66a0: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
66b0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
66c0: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
66d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
66e0: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
66f0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  nt sqlitepager_p
6700: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
6710: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
6720: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   n;.  assert( pP
6730: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
6740: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
6750: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6760: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
6770: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
6780: 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  eOsFileSize(&pPa
6790: 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51  ger->fd, &n)!=SQ
67a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
67b0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
67c0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  = PAGER_ERR_DISK
67d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
67e0: 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54    }.  n /= SQLIT
67f0: 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69  E_PAGE_SIZE;.  i
6800: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
6810: 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
6820: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
6830: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20  bSize = n;.  }. 
6840: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
6850: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
6860: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
6870: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
6880: 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
6890: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
68a0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
68b0: 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
68c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
68d0: 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
68e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
68f0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
6900: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
6910: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
6920: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
6930: 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
6940: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
6950: 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
6960: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
6970: 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
6980: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
6990: 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
69a0: 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
69b0: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
69c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
69d0: 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
69e0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
69f0: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
6a00: 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e  switch( pPager->
6a10: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
6a20: 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  e SQLITE_WRITELO
6a30: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK: {.      sqli
6a40: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
6a50: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
6a60: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
6a70: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
6a80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
6a90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
6aa0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
6ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6ac0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
6ad0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6ae0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
6af0: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 62 72 65  ->fd);.      bre
6b00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6b10: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
6b20: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
6b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6b40: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67   }.  }.  for(pPg
6b50: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
6b60: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
6b70: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
6b80: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
6b90: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
6ba0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c    }.  sqliteOsCl
6bb0: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ose(&pPager->fd)
6bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6bd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
6be0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  =0 );.  /* Temp 
6bf0: 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
6c00: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
6c10: 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
6c20: 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
6c30: 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
6c40: 6c 69 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61  liteOsDelete(pPa
6c50: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
6c60: 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43  .  ** }.  */.  C
6c70: 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65 72 29  LR_PAGER(pPager)
6c80: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
6c90: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
6ca0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6cb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6cc0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
6cd0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
6ce0: 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
6cf0: 69 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  itepager_pagenum
6d00: 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
6d10: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
6d20: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
6d30: 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
6d40: 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
6d50: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
6d60: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
6d70: 72 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68  r a page.  If th
6d80: 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 63 75 72  e page is.** cur
6d90: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
6da0: 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
6db0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
6dc0: 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
6dd0: 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
6de0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65  freelist..*/.#de
6df0: 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29  fine page_ref(P)
6e00: 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30     ((P)->nRef==0
6e10: 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76  ?_page_ref(P):(v
6e20: 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29  oid)(P)->nRef++)
6e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
6e40: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
6e50: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
6e60: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
6e70: 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
6e80: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
6e90: 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
6ea0: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
6eb0: 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
6ec0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
6ed0: 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
6ee0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
6ef0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
6f00: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
6f10: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
6f20: 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
6f30: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
6f40: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
6f50: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
6f60: 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
6f70: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
6f80: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
6f90: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
6fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
6fb0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
6fc0: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
6fd0: 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
6fe0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
6ff0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
7000: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
7010: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
7020: 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
7030: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
7040: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
7050: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
7060: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
7070: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
7080: 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
7090: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
70a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
70b0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
70c0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
70d0: 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
70e0: 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
70f0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
7100: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
7110: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66 28  sqlitepager_ref(
7120: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
7130: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
7140: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
7150: 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  );.  page_ref(pP
7160: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
7170: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7180: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
7190: 6c 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  l and then write
71a0: 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20   all free dirty 
71b0: 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
71c0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  abase.** file..*
71d0: 2a 0a 2a 2a 20 57 72 69 74 69 6e 67 20 61 6c 6c  *.** Writing all
71e0: 20 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65   free dirty page
71f0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
7200: 65 20 61 66 74 65 72 20 74 68 65 20 73 79 6e 63  e after the sync
7210: 20 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76   is a.** non-obv
7220: 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
7230: 6e 2e 20 20 66 73 79 6e 63 28 29 20 69 73 20 61  n.  fsync() is a
7240: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
7250: 61 74 69 6f 6e 20 73 6f 20 77 65 0a 2a 2a 20 77  ation so we.** w
7260: 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ant to minimize 
7270: 74 68 65 20 6e 75 6d 62 65 72 20 6f 74 20 74 69  the number ot ti
7280: 6d 65 73 20 69 74 20 69 73 20 63 61 6c 6c 65 64  mes it is called
7290: 2e 20 41 66 74 65 72 20 61 6e 20 66 73 79 6e 63  . After an fsync
72a0: 28 29 20 63 61 6c 6c 2c 0a 2a 2a 20 77 65 20 61  () call,.** we a
72b0: 72 65 20 66 72 65 65 20 74 6f 20 77 72 69 74 65  re free to write
72c0: 20 64 69 72 74 79 20 70 61 67 65 73 20 62 61 63   dirty pages bac
72d0: 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
72e0: 65 2e 20 20 49 74 20 69 73 20 62 65 73 74 0a 2a  e.  It is best.*
72f0: 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
7300: 64 20 77 72 69 74 65 20 61 73 20 6d 61 6e 79 20  d write as many 
7310: 64 69 72 74 79 20 70 61 67 65 73 20 61 73 20 70  dirty pages as p
7320: 6f 73 73 69 62 6c 65 20 74 6f 20 6d 69 6e 69 6d  ossible to minim
7330: 69 7a 65 20 0a 2a 2a 20 74 68 65 20 72 69 73 6b  ize .** the risk
7340: 20 6f 66 20 68 61 76 69 6e 67 20 74 6f 20 64 6f   of having to do
7350: 20 61 6e 6f 74 68 65 72 20 66 73 79 6e 63 28 29   another fsync()
7360: 20 6c 61 74 65 72 20 6f 6e 2e 20 20 57 72 69 74   later on.  Writ
7370: 69 6e 67 20 64 69 72 74 79 0a 2a 2a 20 66 72 65  ing dirty.** fre
7380: 65 20 70 61 67 65 73 20 69 6e 20 74 68 69 73 20  e pages in this 
7390: 77 61 79 20 77 61 73 20 6f 62 73 65 72 76 65 64  way was observed
73a0: 20 74 6f 20 6d 61 6b 65 20 64 61 74 61 62 61 73   to make databas
73b0: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 67 6f 0a  e operations go.
73c0: 2a 2a 20 75 70 20 74 6f 20 31 30 20 74 69 6d 65  ** up to 10 time
73d0: 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
73e0: 49 66 20 77 65 20 61 72 65 20 77 72 69 74 69 6e  If we are writin
73f0: 67 20 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 64  g to temporary d
7400: 61 74 61 62 61 73 65 2c 20 74 68 65 72 65 20 69  atabase, there i
7410: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 70 72 65  s no need to pre
7420: 73 65 72 76 65 0a 2a 2a 20 74 68 65 20 69 6e 74  serve.** the int
7430: 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 6a 6f  egrity of the jo
7440: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 77  urnal file, so w
7450: 65 20 63 61 6e 20 73 61 76 65 20 74 69 6d 65 20  e can save time 
7460: 61 6e 64 20 73 6b 69 70 20 74 68 65 0a 2a 2a 20  and skip the.** 
7470: 66 73 79 6e 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  fsync()..*/.stat
7480: 69 63 20 69 6e 74 20 73 79 6e 63 41 6c 6c 50 61  ic int syncAllPa
7490: 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
74a0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
74b0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
74c0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
74d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
74e0: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
74f0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7500: 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
7510: 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
7520: 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
7530: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
7540: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
7550: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
7560: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
7570: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
7580: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7590: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
75a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
75b0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
75c0: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 31 28 22  ;.      TRACE1("
75d0: 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20 20  SYNC\n");.      
75e0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79 6e  rc = sqliteOsSyn
75f0: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
7600: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
7610: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69   ) return rc;.#i
7620: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
7630: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
7640: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
7650: 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
7660: 73 79 6e 63 4a 53 69 7a 65 29 3b 0a 20 20 20 20  syncJSize);.    
7670: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
7680: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
7690: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
76a0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
76b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
76c0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
76d0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
76e0: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
76f0: 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
7700: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
7710: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7720: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7730: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7740: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
7750: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7760: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
7770: 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
7780: 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  First;.  }..#ifn
7790: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
77a0: 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
77b0: 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c  dSync flag is cl
77c0: 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48  ear then the PgH
77d0: 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a  dr.needSync.  **
77e0: 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20   flag must also 
77f0: 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c  be clear for all
7800: 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20   pages.  Verify 
7810: 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
7820: 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65  nvariant is true
7830: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
7840: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
7850: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7860: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
7870: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7880: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
7890: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
78a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
78b0: 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
78c0: 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20  er->pFirst );.  
78d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
78e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
78f0: 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
7900: 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
7910: 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
7920: 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
7930: 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
7940: 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
7950: 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
7960: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
7970: 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
7980: 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
7990: 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
79a0: 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
79b0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
79c0: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
79d0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
79e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
79f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
7a00: 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
7a10: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  r;.  while( pLis
7a20: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7a30: 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
7a40: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65  .    sqliteOsSee
7a50: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
7a60: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
7a70: 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
7a80: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72 63 20  E_SIZE);.    rc 
7a90: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
7aa0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
7ab0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
7ac0: 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
7ad0: 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63  IZE);.    if( rc
7ae0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7af0: 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
7b00: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   0;.    pList = 
7b10: 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
7b20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7b30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7b40: 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
7b50: 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
7b60: 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
7b70: 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
7b80: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
7b90: 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
7ba0: 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
7bb0: 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
7bc0: 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
7bd0: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
7be0: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
7bf0: 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
7c00: 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
7c10: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
7c20: 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
7c30: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
7c40: 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
7c50: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7c60: 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
7c70: 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
7c80: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
7c90: 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
7ca0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
7cb0: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  ist;.}../*.** Ac
7cc0: 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
7cd0: 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
7ce0: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
7cf0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
7d00: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
7d10: 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
7d20: 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
7d30: 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
7d40: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
7d50: 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
7d60: 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
7d70: 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
7d80: 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
7d90: 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
7da0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
7db0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
7dc0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
7dd0: 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
7de0: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
7df0: 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
7e00: 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
7e10: 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
7e20: 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
7e30: 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
7e40: 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
7e50: 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
7e60: 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
7e70: 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
7e80: 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
7e90: 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
7ea0: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
7eb0: 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
7ec0: 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
7ed0: 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
7ee0: 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
7ef0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
7f00: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7f10: 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
7f20: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
7f30: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
7f40: 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75  qlitepager_looku
7f50: 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
7f60: 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f  routine and _loo
7f70: 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
7f80: 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
7f90: 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
7fa0: 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
7fb0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
7fc0: 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
7fd0: 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
7fe0: 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
7ff0: 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
8000: 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28  whereas _lookup(
8010: 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
8020: 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
8030: 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
8040: 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
8050: 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
8060: 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
8070: 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
8080: 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
8090: 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
80a0: 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c  ary..** Since _l
80b0: 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
80c0: 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
80d0: 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
80e0: 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
80f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
8100: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
8110: 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70  ger_get(Pager *p
8120: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
8130: 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29  , void **ppPage)
8140: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
8150: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
8160: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
8170: 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
8180: 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
8190: 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
81a0: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
81b0: 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
81c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
81d0: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
81e0: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
81f0: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
8200: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
8210: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
8220: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
8230: 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
8240: 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f  en get a read lo
8250: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
8260: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
8270: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
8280: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8290: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61  rc = sqliteOsRea
82a0: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
82b0: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
82c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
82d0: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
82e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
82f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
8300: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
8310: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20  E_READLOCK;..   
8320: 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
8330: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72   file exists, tr
8340: 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  y to play it bac
8350: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  k..    */.    if
8360: 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
8370: 72 6e 61 6c 20 26 26 20 73 71 6c 69 74 65 4f 73  rnal && sqliteOs
8380: 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
8390: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  r->zJournal) ){.
83a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 2c 20 64         int rc, d
83b0: 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  ummy;..       /*
83c0: 20 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   Get a write loc
83d0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
83e0: 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e.       */.    
83f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
8400: 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65  WriteLock(&pPage
8410: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 69  r->fd);.       i
8420: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28   ){.         if(
8440: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
8450: 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51  &pPager->fd)!=SQ
8460: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8470: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
8480: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
8490: 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n! */.          
84a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
84b0: 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  ERNAL;.         
84c0: 7d 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  }.         *ppPa
84d0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
84e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
84f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
8500: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
8510: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20  TE_WRITELOCK;.. 
8520: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
8530: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78  e journal for ex
8540: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e 20  clusive access. 
8550: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
8560: 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a  USY if.       **
8570: 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 65   we cannot get e
8580: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
8590: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
85a0: 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
85b0: 20 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 74         ** Even t
85c0: 68 6f 75 67 68 20 77 65 20 77 69 6c 6c 20 6f 6e  hough we will on
85d0: 6c 79 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ly be reading fr
85e0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
85f0: 6e 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20 20 20  not writing,.   
8600: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
8610: 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
8620: 61 6c 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  al for writing i
8630: 6e 20 6f 72 64 65 72 20 74 6f 20 6f 62 74 61 69  n order to obtai
8640: 6e 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a 20 65  n an.       ** e
8650: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
8660: 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
8670: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8680: 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  teOsOpenReadWrit
8690: 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
86a0: 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
86b0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
86c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
86d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
86e0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55 6e 6c  rc = sqliteOsUnl
86f0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
8700: 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  ;.         asser
8710: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8720: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70 70   );.         *pp
8730: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
8740: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8750: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a  _BUSY;.       }.
8760: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
8770: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
8780: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
8790: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
87a0: 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
87b0: 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
87c0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
87d0: 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
87e0: 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
87f0: 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
8800: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
8810: 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
8820: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
8830: 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
8840: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
8850: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
8870: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ;.       }.    }
8880: 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
8890: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
88a0: 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e  arch for page in
88b0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50   cache */.    pP
88c0: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
88d0: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
88e0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
88f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
8900: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
8910: 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
8920: 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
8930: 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72  nt h;.    pPager
8940: 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69  ->nMiss++;.    i
8950: 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
8960: 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20  <pPager->mxPage 
8970: 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  || pPager->pFirs
8980: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
8990: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
89a0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20  ge */.      pPg 
89b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
89c0: 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
89d0: 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  + SQLITE_PAGE_SI
89e0: 5a 45 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ZE + pPager->nEx
89f0: 74 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  tra );.      if(
8a00: 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
8a10: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
8a20: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
8a30: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
8a40: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
8a50: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
8a60: 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
8a70: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8a80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8a90: 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
8aa0: 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
8ab0: 50 67 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  Pg));.      pPg-
8ac0: 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
8ad0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
8ae0: 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
8af0: 70 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  pAll;.      if( 
8b00: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
8b10: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
8b20: 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d  pAll->pPrevAll =
8b30: 20 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20   pPg;.      }.  
8b40: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 41 6c      pPg->pPrevAl
8b50: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  l = 0;.      pPa
8b60: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
8b70: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
8b80: 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  Page++;.    }els
8b90: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  e{.      /* Find
8ba0: 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
8bb0: 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
8bc0: 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
8bd0: 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
8be0: 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
8bf0: 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
8c00: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  the journal..   
8c10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20     */.      pPg 
8c20: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
8c30: 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f  Synced;..      /
8c40: 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
8c50: 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
8c60: 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
8c70: 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
8c80: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a       ** on the j
8c90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
8ca0: 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
8cb0: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
8cc0: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72  s a.      ** ver
8cd0: 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
8ce0: 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
8cf0: 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
8d00: 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
8d10: 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20      ** it can't 
8d20: 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20  be helped..     
8d30: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
8d40: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
8d50: 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 41 6c 6c  int rc = syncAll
8d60: 50 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  Pages(pPager);. 
8d70: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
8d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
8d90: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
8da0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
8db0: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
8dc0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  0;.          ret
8dd0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8de0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8df0: 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
8e00: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ->pFirst;.      
8e10: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
8e20: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
8e30: 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
8e40: 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
8e50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
8e60: 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
8e70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
8e80: 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
8e90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8ea0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
8eb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  );.        pPg->
8ec0: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
8ed0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
8ee0: 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
8ef0: 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Pg );.        if
8f00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8f20: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
8f30: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
8f40: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
8f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
8f60: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
8f70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8f80: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
8f90: 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
8fa0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
8fb0: 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
8fc0: 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
8fd0: 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
8fe0: 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20  back, then.     
8ff0: 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
9000: 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
9010: 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
9020: 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  abling the.     
9030: 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
9040: 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
9050: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
9060: 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
9070: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
9080: 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
9090: 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
90a0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
90b0: 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
90c0: 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69  back.      ** mi
90d0: 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
90e0: 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
90f0: 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
9100: 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
9110: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ber.      ** tha
9120: 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
9130: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
9140: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
9150: 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
9160: 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b        ** be mark
9170: 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
9180: 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
9190: 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  n out..      */.
91a0: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61        if( pPg->a
91b0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
91c0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
91d0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
91e0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
91f0: 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68      /* Unlink th
9200: 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
9210: 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
9220: 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
9230: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9240: 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
9250: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
9260: 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
9270: 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
9280: 65 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ee;.        whil
9290: 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
92a0: 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
92b0: 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
92c0: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
92d0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
92e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
92f0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
9300: 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50  .        pPg->pP
9310: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
9320: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
9330: 72 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ree;.      }else
9340: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9350: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
9360: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ==pPg );.       
9370: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
9380: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
9390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
93a0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
93b0: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ee ){.        pP
93c0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
93d0: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
93e0: 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20  PrevFree;.      
93f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
9400: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
9410: 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
9420: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61       pPager->pLa
9430: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
9440: 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ree;.      }.   
9450: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
9460: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
9470: 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ee = 0;.      if
9480: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
9490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
94a0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
94b0: 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
94c0: 65 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a  evHash;.      }.
94d0: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
94e0: 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
94f0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
9500: 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
9510: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
9520: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9530: 20 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68       h = pager_h
9540: 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ash(pPg->pgno);.
9550: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9560: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
9570: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ==pPg );.       
9580: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
9590: 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
95a0: 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sh;.      }.    
95b0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
95c0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
95d0: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  h = 0;.      pPa
95e0: 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20  ger->nOvfl++;.  
95f0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
9600: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
9610: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
9620: 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
9630: 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
9640: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
9650: 71 6c 69 74 65 43 68 65 63 6b 4d 65 6d 6f 72 79  qliteCheckMemory
9660: 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
9670: 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
9680: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9690: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
96a0: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
96b0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
96c0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
96d0: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
96e0: 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
96f0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
9700: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
9710: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
9720: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
9730: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
9740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9750: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20  pPager->aInCkpt 
9760: 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
9770: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 0a 20  ager->ckptSize. 
9780: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
9790: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
97a0: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
97b0: 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20  gno&7)))!=0 ){. 
97c0: 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
97d0: 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b  _ckpt_list(pPg);
97e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
97f0: 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
9800: 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67  om_ckpt_list(pPg
9810: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
9820: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
9830: 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
9840: 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
9850: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
9860: 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61  ef++;.    h = pa
9870: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
9880: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
9890: 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
98a0: 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
98b0: 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
98c0: 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
98d0: 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
98e0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
98f0: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
9900: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
9910: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
9920: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
9930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9940: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
9950: 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70   ) sqlitepager_p
9960: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
9970: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
9980: 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
9990: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
99a0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
99b0: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
99c0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
99d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
99e0: 74 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  t rc;.      sqli
99f0: 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  teOsSeek(&pPager
9a00: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
9a10: 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
9a20: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72  E_SIZE);.      r
9a30: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
9a40: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  (&pPager->fd, PG
9a50: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
9a60: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
9a70: 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ZE);.      if( r
9a80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9a90: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69          off_t fi
9aa0: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  leSize;.        
9ab0: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  if( sqliteOsFile
9ac0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
9ad0: 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c  ,&fileSize)!=SQL
9ae0: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
9af0: 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a        || fileSiz
9b00: 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50  e>=pgno*SQLITE_P
9b10: 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
9b20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
9b30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9b40: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
9b50: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
9b60: 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
9b70: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
9b80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9b90: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
9ba0: 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
9bb0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
9bc0: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c  R_TO_EXTRA(pPg),
9bd0: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
9be0: 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ra);.    }.  }el
9bf0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
9c00: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
9c10: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
9c20: 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  he. */.    pPage
9c30: 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70  r->nHit++;.    p
9c40: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
9c50: 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
9c60: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
9c70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9c80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
9c90: 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
9ca0: 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
9cb0: 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
9cc0: 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
9cd0: 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
9ce0: 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
9cf0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
9d00: 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
9d10: 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
9d20: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
9d30: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
9d40: 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 2e  litepager_get().
9d50: 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
9d60: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
9d70: 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
9d80: 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 20 69  itepager_get() i
9d90: 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
9da0: 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
9db0: 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
9dc0: 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
9dd0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
9de0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
9df0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
9e00: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
9e10: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
9e20: 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
9e30: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
9e40: 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
9e50: 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
9e60: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
9e70: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
9e80: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
9e90: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
9ea0: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
9eb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
9ec0: 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
9ed0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
9ee0: 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
9ef0: 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
9f00: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 28   0;.  }.  /* if(
9f10: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
9f20: 20 29 7b 0a 20 20 2a 2a 20 20 72 65 74 75 72 6e   ){.  **  return
9f30: 20 30 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a   0;.  ** }.  */.
9f40: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
9f50: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
9f60: 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
9f70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
9f80: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
9f90: 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
9fa0: 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
9fb0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
9fc0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
9fd0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
9fe0: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
9ff0: 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
a000: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
a010: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
a020: 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
a030: 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
a040: 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
a050: 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
a060: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
a070: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
a080: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
a090: 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
a0a0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75  nt sqlitepager_u
a0b0: 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  nref(void *pData
a0c0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
a0d0: 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  ..  /* Decrement
a0e0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
a0f0: 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61  ount for this pa
a100: 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  ge.  */.  pPg = 
a110: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
a120: 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
a130: 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
a140: 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
a150: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
a160: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
a170: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
a180: 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
a190: 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
a1a0: 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
a1b0: 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
a1c0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
a1d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
a1e0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50  nRef==0 ){.    P
a1f0: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
a200: 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
a210: 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
a220: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a  >pNextFree = 0;.
a230: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
a240: 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61  ee = pPager->pLa
a250: 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
a260: 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  pLast = pPg;.   
a270: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
a280: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
a290: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
a2a0: 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20  xtFree = pPg;.  
a2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
a2c0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
a2d0: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
a2e0: 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
a2f0: 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
a300: 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29  FirstSynced==0 )
a310: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
a320: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
a330: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
a340: 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
a350: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70  uctor ){.      p
a360: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
a370: 6f 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  or(pData);.    }
a380: 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
a390: 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
a3a0: 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
a3b0: 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
a3c0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
a3d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
a3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
a3f0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
a400: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
a410: 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
a420: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
a430: 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  0 ){.      pager
a440: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
a450: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a460: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a470: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
a480: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a490: 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
a4a0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
a4b0: 65 20 61 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63  e a write.** loc
a4c0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
a4d0: 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
a4e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a4f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
a500: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
a510: 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
a520: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
a530: 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
a540: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
a550: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
a560: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
a570: 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
a580: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
a590: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
a5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a5b0: 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45  r->state==SQLITE
a5c0: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20  _WRITELOCK );.  
a5d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a5e0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
a5f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a600: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
a610: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
a620: 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
a630: 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
a640: 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
a650: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
a660: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
a670: 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f    sqliteOsReadLo
a680: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
a690: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
a6a0: 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  te = SQLITE_READ
a6b0: 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
a6c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a6d0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
a6e0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
a6f0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
a700: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70  , &pPager->jfd,p
a710: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
a720: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a730: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
a740: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
a750: 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
a760: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
a770: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nal = 0;.    sql
a780: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
a790: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
a7a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
a7b0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b  SQLITE_READLOCK;
a7c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a7d0: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
a7e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
a7f0: 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
a800: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
a810: 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
a820: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
a830: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
a840: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
a850: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61    sqlitepager_pa
a860: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
a870: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
a880: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
a890: 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 61  dbSize;.  if( pa
a8a0: 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 29  ger_old_format )
a8b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
a8c0: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
a8d0: 2d 3e 6a 66 64 2c 20 61 4f 6c 64 4a 6f 75 72 6e  ->jfd, aOldJourn
a8e0: 61 6c 4d 61 67 69 63 2c 0a 20 20 20 20 20 20 20  alMagic,.       
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 73 69 7a 65 6f 66 28 61 4f 6c 64 4a 6f 75 72 6e  sizeof(aOldJourn
a910: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 7d 65 6c  alMagic));.  }el
a920: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
a930: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
a940: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
a950: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
a960: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
a970: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
a980: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a990: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
a9a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
a9b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
a9c0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
a9d0: 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26  >ckptAutoopen &&
a9e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a9f0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
aa00: 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69  epager_ckpt_begi
aa10: 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
aa20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
aa30: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
aa40: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
aa50: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
aa60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
aa70: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
aa80: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
aa90: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
aaa0: 42 55 47 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  BUG.  pPager->sy
aab0: 6e 63 4a 53 69 7a 65 20 3d 20 30 3b 0a 23 65 6e  ncJSize = 0;.#en
aac0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
aad0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75    .}../*.** Acqu
aae0: 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
aaf0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
ab00: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
ab10: 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
ab20: 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
ab30: 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
ab40: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
ab50: 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  epager_commit() 
ab60: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
ab70: 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  *  sqlitepager_r
ab80: 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
ab90: 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
aba0: 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  itepager_close()
abb0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
abc0: 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f   *  sqlitepager_
abd0: 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
abe0: 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
abf0: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
ac00: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  **.** The parame
ac10: 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
ac20: 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
ac30: 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
ac40: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
ac50: 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
ac60: 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
ac70: 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
ac80: 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 0a 2a  is used merely.*
ac90: 2a 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 70  * to acquire a p
aca0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
acb0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
acc0: 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
acd0: 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72 65  there.** is alre
ace0: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
acf0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
ad00: 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
ad10: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
ad20: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
ad30: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
ad40: 20 20 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72 61    For.** tempora
ad50: 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ry files, the op
ad60: 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
ad70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
ad80: 65 72 72 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  erred until.** t
ad90: 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61  here is an actua
ada0: 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
adb0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
adc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
add0: 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
ade0: 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20 74   write-locked, t
adf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
ae00: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
ae10: 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e  qlitepager_begin
ae20: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
ae30: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
ae40: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
ae50: 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
ae60: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
ae70: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
ae80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
ae90: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
aea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
aeb0: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
aec0: 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  E_UNLOCK );.  if
aed0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
aee0: 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b  =SQLITE_READLOCK
aef0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
af00: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
af10: 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  al==0 );.    rc 
af20: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c  = sqliteOsWriteL
af30: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
af40: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
af50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
af60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
af70: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
af80: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49  ate = SQLITE_WRI
af90: 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  TELOCK;.    pPag
afa0: 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20  er->dirtyFile = 
afb0: 30 3b 0a 20 20 20 20 54 52 41 43 45 31 28 22 54  0;.    TRACE1("T
afc0: 52 41 4e 53 41 43 54 49 4f 4e 5c 6e 22 29 3b 0a  RANSACTION\n");.
afd0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
afe0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
aff0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
b000: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
b010: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
b020: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
b030: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
b050: 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
b060: 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
b070: 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
b080: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
b090: 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
b0a0: 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
b0b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
b0c0: 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
b0d0: 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
b0e0: 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
b0f0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
b100: 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
b110: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
b120: 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
b130: 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
b140: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 77  and acquires a w
b150: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
b160: 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
b170: 68 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b  he write.** lock
b180: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
b190: 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
b1a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
b1b0: 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
b1c0: 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
b1d0: 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
b1e0: 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
b1f0: 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
b200: 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
b210: 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
b220: 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
b230: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
b240: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
b250: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b260: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
b270: 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
b280: 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
b290: 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
b2a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
b2b0: 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
b2c0: 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
b2d0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
b2e0: 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
b2f0: 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
b300: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
b310: 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
b320: 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
b330: 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74  litepager_commit
b340: 28 29 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65  () or sqlitepage
b350: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  r_rollback() to.
b360: 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74  ** reset..*/.int
b370: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
b380: 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  te(void *pData){
b390: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
b3a0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
b3b0: 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
b3c0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b3d0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
b3e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
b3f0: 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
b400: 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
b410: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20  ger->errMask ){ 
b420: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
b430: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
b440: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
b450: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
b460: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b470: 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
b480: 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
b490: 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
b4a0: 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
b4b0: 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
b4c0: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
b4d0: 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
b4e0: 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
b4f0: 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ay..  */.  pPg->
b500: 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28  dirty = 1;.  if(
b510: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
b520: 26 26 20 28 70 50 67 2d 3e 69 6e 43 6b 70 74 20  && (pPg->inCkpt 
b530: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  || pPager->ckptI
b540: 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
b550: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
b560: 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
b570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
b580: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
b590: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
b5a0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
b5b0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
b5c0: 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
b5d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
b5e0: 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
b5f0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
b600: 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
b610: 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68  **.  ** First ch
b620: 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
b630: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
b640: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
b650: 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69  nd.  ** create i
b660: 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
b670: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b680: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
b690: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b  SQLITE_UNLOCK );
b6a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61  .  rc = sqlitepa
b6b0: 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 29  ger_begin(pData)
b6c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b6d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
b6e0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
b6f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
b700: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate==SQLITE_WRIT
b710: 45 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 21  ELOCK );.  if( !
b720: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b730: 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
b740: 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
b750: 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
b760: 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
b770: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b780: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
b790: 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
b7a0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b7b0: 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
b7c0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
b7d0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
b7e0: 46 69 6c 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  File = 1;..  /* 
b7f0: 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
b800: 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
b810: 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
b820: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
b830: 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74  he.  ** main dat
b840: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
b850: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
b860: 61 67 65 20 74 6f 20 74 68 65 20 74 72 61 6e 73  age to the trans
b870: 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75  action .  ** jou
b880: 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
b890: 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
b8a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67  .  */.  if( !pPg
b8b0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 70  ->inJournal && p
b8c0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
b8d0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e  l ){.    if( (in
b8e0: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
b8f0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
b900: 65 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  e ){.      store
b910: 50 61 67 65 4e 75 6d 62 65 72 28 70 50 67 29 3b  PageNumber(pPg);
b920: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b930: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
b940: 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a  r->jfd, &((char*
b950: 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 53 51 4c  )pData)[-4], SQL
b960: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 29  ITE_PAGE_SIZE+4)
b970: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
b980: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b990: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
b9a0: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
b9b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
b9c0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
b9d0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
b9e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
b9f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
ba00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
ba10: 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
ba20: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
ba30: 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
ba40: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
ba50: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
ba60: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
ba70: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
ba80: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
ba90: 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
baa0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b    if( pPager->ck
bab0: 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  ptInUse ){.     
bac0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
bad0: 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  pt[pPg->pgno/8] 
bae0: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
baf0: 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  &7);.        pag
bb00: 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69  e_add_to_ckpt_li
bb10: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  st(pPg);.      }
bb20: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a  .      TRACE3("J
bb30: 4f 55 52 4e 41 4c 20 25 64 20 25 64 5c 6e 22 2c  OURNAL %d %d\n",
bb40: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
bb50: 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
bb60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
bb70: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
bb80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
bb90: 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
bba0: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54  >noSync;.      T
bbb0: 52 41 43 45 33 28 22 41 50 50 45 4e 44 20 25 64  RACE3("APPEND %d
bbc0: 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
bbd0: 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
bbe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
bbf0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
bc00: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bc10: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
bc20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
bc30: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
bc40: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
bc50: 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
bc60: 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20  not in it,.  ** 
bc70: 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
bc80: 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
bc90: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
bca0: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
bcb0: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  ( pPager->ckptIn
bcc0: 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 43  Use && !pPg->inC
bcd0: 6b 70 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  kpt && (int)pPg-
bce0: 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63  >pgno<=pPager->c
bcf0: 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  kptSize ){.    a
bd00: 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
bd10: 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
bd20: 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
bd30: 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
bd40: 20 20 73 74 6f 72 65 50 61 67 65 4e 75 6d 62 65    storePageNumbe
bd50: 72 28 70 50 67 29 3b 0a 20 20 20 20 72 63 20 3d  r(pPg);.    rc =
bd60: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
bd70: 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 26 28  pPager->cpfd, &(
bd80: 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
bd90: 5d 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ], SQLITE_PAGE_S
bda0: 49 5a 45 2b 34 29 3b 0a 20 20 20 20 69 66 28 20  IZE+4);.    if( 
bdb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bdc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67  .      sqlitepag
bdd0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
bde0: 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
bdf0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
be00: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
be10: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
be20: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
be30: 3e 63 6b 70 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >ckptNRec++;.   
be40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
be50: 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20  >aInCkpt!=0 );. 
be60: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
be70: 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  pt[pPg->pgno/8] 
be80: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
be90: 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
bea0: 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70  d_to_ckpt_list(p
beb0: 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  Pg);.  }..  /* U
bec0: 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
bed0: 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
bee0: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
bef0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
bf00: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
bf10: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
bf20: 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
bf30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bf40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bf50: 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
bf60: 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
bf70: 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
bf80: 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
bf90: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
bfa0: 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  write().  In oth
bfb0: 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
bfc0: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
bfd0: 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
bfe0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
bff0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e page..*/.int s
c000: 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69  qlitepager_iswri
c010: 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
c020: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
c030: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
c040: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
c050: 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
c060: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
c070: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
c080: 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
c090: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
c0a0: 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
c0b0: 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
c0c0: 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
c0d0: 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
c0e0: 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
c0f0: 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
c100: 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
c110: 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
c120: 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
c130: 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
c140: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
c150: 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
c160: 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
c170: 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
c180: 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
c190: 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
c1a0: 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
c1b0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
c1c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
c1d0: 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
c1e0: 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
c1f0: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
c200: 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
c210: 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74  sqlitepager_dont
c220: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
c230: 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
c240: 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
c250: 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
c260: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
c270: 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
c280: 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
c290: 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
c2a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
c2b0: 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
c2c0: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
c2d0: 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
c2e0: 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
c2f0: 73 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  s to sqlitepager
c300: 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
c310: 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
c320: 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
c330: 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
c340: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
c350: 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
c360: 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
c370: 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
c380: 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
c390: 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
c3a0: 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
c3b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
c3c0: 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
c3d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
c3e0: 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
c3f0: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
c400: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
c410: 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
c420: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
c430: 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
c440: 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
c450: 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
c460: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c470: 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
c480: 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f  ,.** the dont_ro
c490: 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
c4a0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
c4b0: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
c4c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72  e contains.** cr
c4d0: 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
c4e0: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
c4f0: 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f   sure it gets ro
c500: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
c510: 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e  te.** of the don
c520: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  t_rollback() cal
c530: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
c540: 65 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74  epager_dont_writ
c550: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
c560: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
c570: 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50  gHdr *pPg;..  pP
c580: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
c590: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
c5a0: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
c5b0: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
c5c0: 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
c5d0: 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ty ){.    if( pP
c5e0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
c5f0: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
c600: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
c610: 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
c620: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
c630: 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
c640: 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
c650: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
c660: 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
c670: 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
c680: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
c690: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
c6a0: 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
c6b0: 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
c6c0: 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
c6d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
c6e0: 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
c6f0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
c700: 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
c710: 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
c720: 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
c730: 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
c740: 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
c750: 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
c760: 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
c770: 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
c780: 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
c790: 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
c7a0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
c7b0: 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
c7c0: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
c7d0: 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
c7e0: 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
c7f0: 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
c800: 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
c810: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
c820: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c830: 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 57 52 49  TRACE2("DONT_WRI
c840: 54 45 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b  TE %d\n", pgno);
c850: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
c860: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 0;.    }.  }
c870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
c880: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
c890: 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
c8a0: 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
c8b0: 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
c8c0: 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
c8d0: 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
c8e0: 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
c8f0: 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
c900: 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
c910: 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
c920: 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
c930: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
c940: 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
c950: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f  k journal..*/.vo
c960: 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64  id sqlitepager_d
c970: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69  ont_rollback(voi
c980: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
c990: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
c9a0: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
c9b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
c9c0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
c9d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c9e0: 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
c9f0: 45 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  ELOCK || pPager-
ca00: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
ca10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
ca20: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
ca30: 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
ca40: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 20  lwaysRollback ) 
ca50: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
ca60: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
ca70: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
ca80: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
ca90: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
caa0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
cab0: 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
cac0: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
cad0: 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
cae0: 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
caf0: 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
cb00: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
cb10: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63     if( pPager->c
cb20: 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  kptInUse ){.    
cb30: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
cb40: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
cb50: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
cb60: 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
cb70: 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28  dd_to_ckpt_list(
cb80: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
cb90: 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE2("DONT_ROL
cba0: 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 67  LBACK %d\n", pPg
cbb0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  ->pgno);.  }.  i
cbc0: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
cbd0: 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
cbe0: 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70 50 67  Ckpt && (int)pPg
cbf0: 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
cc00: 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  ckptSize ){.    
cc10: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
cc20: 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
cc30: 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
cc40: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
cc50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
cc60: 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b  r->aInCkpt!=0 );
cc70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
cc80: 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Ckpt[pPg->pgno/8
cc90: 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
cca0: 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
ccb0: 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74  add_to_ckpt_list
ccc0: 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  (pPg);.  }.}../*
ccd0: 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
cce0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
ccf0: 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
cd00: 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
cd10: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
cd20: 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
cd30: 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
cd40: 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
cd50: 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
cd60: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
cd70: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
cd80: 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
cd90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
cda0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
cdb0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f  t sqlitepager_co
cdc0: 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
cdd0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
cde0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
cdf0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
ce00: 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask==PAGER_ERR_F
ce10: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
ce20: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
ce30: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
ce40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ce50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
ce60: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
ce70: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
ce80: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
ce90: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
cea0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
ceb0: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
cec0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
ced0: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
cee0: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
cef0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
cf00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cf10: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  E_ERROR;.  }.  T
cf20: 52 41 43 45 31 28 22 43 4f 4d 4d 49 54 5c 6e 22  RACE1("COMMIT\n"
cf30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
cf40: 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 29 7b  >dirtyFile==0 ){
cf50: 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72  .    /* Exit ear
cf60: 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e  ly (without doin
cf70: 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75  g the time-consu
cf80: 6d 69 6e 67 20 73 71 6c 69 74 65 4f 73 53 79 6e  ming sqliteOsSyn
cf90: 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a  c() calls).    *
cfa0: 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  * if there have 
cfb0: 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
cfc0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
cfd0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
cfe0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
cff0: 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
d000: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
d010: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
d020: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
d030: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
d040: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
d050: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
d060: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69  urnalOpen );.  i
d070: 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
d080: 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53  ync && sqliteOsS
d090: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
d0a0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
d0b0: 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
d0c0: 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 70 50 67  abort;.  }.  pPg
d0d0: 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
d0e0: 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
d0f0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 67 20  ger);.  if( pPg 
d100: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
d110: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
d120: 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
d130: 63 20 7c 7c 20 28 21 70 50 61 67 65 72 2d 3e 6e  c || (!pPager->n
d140: 6f 53 79 6e 63 20 26 26 20 73 71 6c 69 74 65 4f  oSync && sqliteO
d150: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
d160: 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  d)!=SQLITE_OK) )
d170: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d  {.      goto com
d180: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d  mit_abort;.    }
d190: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
d1a0: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
d1b0: 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
d1c0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
d1d0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
d1e0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e   Jump here if an
d1f0: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
d200: 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  g during the com
d210: 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  mit process..  *
d220: 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a  /.commit_abort:.
d230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
d240: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
d250: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  er);.  if( rc==S
d260: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d270: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
d280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
d2a0: 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
d2b0: 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
d2c0: 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 72 65  falls back to re
d2d0: 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a  ad-only mode..**
d2e0: 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
d2f0: 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
d300: 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
d310: 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
d320: 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
d330: 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
d340: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d350: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
d360: 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
d370: 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
d380: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
d390: 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
d3a0: 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f  rotocol (SQLITE_
d3b0: 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c  PROTOCOL) or unl
d3c0: 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
d3d0: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
d3e0: 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
d3f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d400: 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
d410: 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
d420: 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
d430: 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
d440: 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
d450: 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
d460: 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
d470: 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
d480: 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
d490: 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
d4a0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
d4b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
d4c0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  r_rollback(Pager
d4d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
d4e0: 20 72 63 3b 0a 20 20 54 52 41 43 45 31 28 22 52   rc;.  TRACE1("R
d4f0: 4f 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20 20 69  OLLBACK\n");.  i
d500: 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
d510: 79 46 69 6c 65 20 7c 7c 20 21 70 50 61 67 65 72  yFile || !pPager
d520: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
d530: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
d540: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
d550: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
d560: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
d570: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d580: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
d590: 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64  LITE_TEST) && !d
d5a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a 20  efined(NDEBUG). 
d5b0: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
d5c0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 74 68 65 20   journal to the 
d5d0: 73 69 7a 65 20 69 74 20 77 61 73 20 61 74 20 74  size it was at t
d5e0: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
d5f0: 20 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 73   the.  ** last s
d600: 71 6c 69 74 65 4f 73 53 79 6e 63 28 29 20 63 61  qliteOsSync() ca
d610: 6c 6c 2e 20 20 54 68 69 73 20 69 73 20 72 65 61  ll.  This is rea
d620: 6c 6c 79 20 61 6e 20 65 72 72 6f 72 20 63 68 65  lly an error che
d630: 63 6b 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ck.  If the.  **
d640: 20 72 6f 6c 6c 62 61 63 6b 20 73 74 69 6c 6c 20   rollback still 
d650: 77 6f 72 6b 73 2c 20 69 74 20 6d 65 61 6e 73 20  works, it means 
d660: 74 68 61 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  that the rollbac
d670: 6b 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 73  k would have als
d680: 6f 0a 20 20 2a 2a 20 77 6f 72 6b 65 64 20 69 66  o.  ** worked if
d690: 20 69 74 20 68 61 64 20 6f 63 63 75 72 72 65 64   it had occurred
d6a0: 20 61 66 74 65 72 20 61 6e 20 4f 53 20 63 72 61   after an OS cra
d6b0: 73 68 20 6f 72 20 75 6e 65 78 70 65 63 74 65 64  sh or unexpected
d6c0: 20 70 6f 77 65 72 0a 20 20 2a 2a 20 6c 6f 73 73   power.  ** loss
d6d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
d6e0: 67 65 72 2d 3e 73 79 6e 63 4a 53 69 7a 65 3c 73  ger->syncJSize<s
d6f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
d700: 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f  gic)+sizeof(Pgno
d710: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
d720: 3e 73 79 6e 63 4a 53 69 7a 65 20 3d 20 73 69 7a  >syncJSize = siz
d730: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
d740: 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3b  c)+sizeof(Pgno);
d750: 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 54  .  }.  TRACE2("T
d760: 52 55 4e 43 41 54 45 20 4a 4f 55 52 4e 41 4c 20  RUNCATE JOURNAL 
d770: 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  %lld\n", pPager-
d780: 3e 73 79 6e 63 4a 53 69 7a 65 29 3b 0a 20 20 72  >syncJSize);.  r
d790: 63 20 3d 20 20 73 71 6c 69 74 65 4f 73 54 72 75  c =  sqliteOsTru
d7a0: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  ncate(&pPager->j
d7b0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
d7c0: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
d7d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
d7e0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67  ndif..  if( pPag
d7f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26  er->errMask!=0 &
d800: 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  & pPager->errMas
d810: 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k!=PAGER_ERR_FUL
d820: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
d830: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49  ger->state>=SQLI
d840: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
d850: 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
d860: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
d870: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
d880: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
d890: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
d8a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
d8b0: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
d8c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d8d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
d8e0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
d8f0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
d900: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d910: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d920: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
d930: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
d940: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
d950: 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RUPT;.  }.  pPag
d960: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
d970: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d980: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
d990: 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
d9a0: 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
d9b0: 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
d9c0: 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
d9d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
d9e0: 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
d9f0: 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
da00: 6c 69 74 65 70 61 67 65 72 5f 69 73 72 65 61 64  litepager_isread
da10: 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
da20: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
da30: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
da40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
da50: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
da60: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
da70: 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
da80: 69 6e 74 20 2a 73 71 6c 69 74 65 70 61 67 65 72  int *sqlitepager
da90: 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  _stats(Pager *pP
daa0: 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
dab0: 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d  int a[9];.  a[0]
dac0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
dad0: 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
dae0: 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
daf0: 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
db00: 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
db10: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
db20: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
db30: 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
db40: 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61  er->errMask;.  a
db50: 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
db60: 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
db70: 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
db80: 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
db90: 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  fl;.  return a;.
dba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
dbb0: 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2a 0a   checkpoint..**.
dbc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
dbd0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
dbe0: 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
dbf0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
dc00: 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
dc10: 41 20 6e 65 77 20 63 68 65 63 6b 70 6f 69 6e 74  A new checkpoint
dc20: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
dc30: 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
dc40: 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
dc50: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
dc60: 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
dc70: 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
dc80: 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
dc90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
dca0: 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e 28 50  ger_ckpt_begin(P
dcb0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
dcc0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
dcd0: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
dce0: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69  PNAME_SIZE];.  i
dcf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
dd00: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
dd10: 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f  Pager->ckptAutoo
dd20: 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
dd30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dd40: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
dd50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
dd60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
dd70: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
dd80: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
dd90: 6e 43 6b 70 74 20 3d 20 73 71 6c 69 74 65 4d 61  nCkpt = sqliteMa
dda0: 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
ddb0: 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
ddc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43  if( pPager->aInC
ddd0: 6b 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  kpt==0 ){.    sq
dde0: 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26  liteOsReadLock(&
ddf0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
de00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de10: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
de20: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
de30: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
de40: 26 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69  &pPager->ckptJSi
de50: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
de60: 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f  goto ckpt_begin_
de70: 66 61 69 6c 65 64 3b 0a 20 20 70 50 61 67 65 72  failed;.  pPager
de80: 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 70 50 61  ->ckptSize = pPa
de90: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69  ger->dbSize;.  i
dea0: 66 28 20 21 70 50 61 67 65 72 2d 3e 63 6b 70 74  f( !pPager->ckpt
deb0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
dec0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
ded0: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50  ntemp(zTemp, &pP
dee0: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
def0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
df00: 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  kpt_begin_failed
df10: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
df20: 70 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ptOpen = 1;.    
df30: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63  pPager->ckptNRec
df40: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
df50: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
df60: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
df70: 54 45 5f 4f 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65  TE_OK;. .ckpt_be
df80: 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
df90: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
dfa0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
dfb0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 43  ree(pPager->aInC
dfc0: 6b 70 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  kpt);.    pPager
dfd0: 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20  ->aInCkpt = 0;. 
dfe0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
dff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
e000: 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f  a checkpoint..*/
e010: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
e020: 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 50 61 67  _ckpt_commit(Pag
e030: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
e040: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
e050: 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
e060: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
e070: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
e080: 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
e090: 30 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  0);.    /* sqlit
e0a0: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
e0b0: 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 20 2a  ger->cpfd, 0); *
e0c0: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  /.    pPager->ck
e0d0: 70 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ptNRec = 0;.    
e0e0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
e0f0: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
e100: 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
e110: 49 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 70 50  InCkpt );.    pP
e120: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20  ager->aInCkpt = 
e130: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
e140: 50 61 67 65 72 2d 3e 70 43 6b 70 74 3b 20 70 50  Pager->pCkpt; pP
e150: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
e160: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67       pNext = pPg
e170: 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 20  ->pNextCkpt;.   
e180: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
e190: 69 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 20 20  inCkpt );.      
e1a0: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b  pPg->inCkpt = 0;
e1b0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
e1c0: 76 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vCkpt = pPg->pNe
e1d0: 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  xtCkpt = 0;.    
e1e0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43  }.    pPager->pC
e1f0: 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  kpt = 0;.  }.  p
e200: 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f  Pager->ckptAutoo
e210: 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
e220: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e230: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
e240: 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   checkpoint..*/.
e250: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
e260: 63 6b 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  ckpt_rollback(Pa
e270: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e280: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
e290: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
e2a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
e2b0: 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28  r_ckpt_playback(
e2c0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
e2d0: 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f  itepager_ckpt_co
e2e0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
e2f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
e300: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e310: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74   pPager->ckptAut
e320: 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
e330: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
e340: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
e350: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
e360: 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
e370: 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
e380: 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
e390: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
e3a0: 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67  ager_refdump(Pag
e3b0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
e3c0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
e3d0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
e3e0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
e3f0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
e400: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
e410: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e420: 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33   printf("PAGE %3
e430: 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52  d addr=0x%08x nR
e440: 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
e450: 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e    pPg->pgno, (in
e460: 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t)PGHDR_TO_DATA(
e470: 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
e480: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a     ;.  }.}.#endif.