/ Hex Artifact Content
Login

Artifact 6b865be765d1ebd06145219550b10921c7da7cc9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 30 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 05.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  ***.** This head
0180: 65 72 20 66 69 6c 65 20 64 65 66 69 6e 65 73 20  er file defines 
0190: 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 68  the interface th
01a0: 61 74 20 74 68 65 20 73 71 6c 69 74 65 20 70 61  at the sqlite pa
01b0: 67 65 20 63 61 63 68 65 0a 2a 2a 20 73 75 62 73  ge cache.** subs
01c0: 79 73 74 65 6d 2e 20 0a 2a 2f 0a 0a 23 69 66 6e  ystem. .*/..#ifn
01d0: 64 65 66 20 5f 50 43 41 43 48 45 5f 48 5f 0a 0a  def _PCACHE_H_..
01e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
01f0: 67 48 64 72 20 50 67 48 64 72 3b 0a 74 79 70 65  gHdr PgHdr;.type
0200: 64 65 66 20 73 74 72 75 63 74 20 50 43 61 63 68  def struct PCach
0210: 65 20 50 43 61 63 68 65 3b 0a 0a 2f 2a 0a 2a 2a  e PCache;../*.**
0220: 20 45 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   Every page in t
0230: 68 65 20 63 61 63 68 65 20 69 73 20 63 6f 6e 74  he cache is cont
0240: 72 6f 6c 6c 65 64 20 62 79 20 61 6e 20 69 6e 73  rolled by an ins
0250: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0260: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
0270: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  ure..*/.struct P
0280: 67 48 64 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  gHdr {.  sqlite3
0290: 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50  _pcache_page *pP
02a0: 61 67 65 3b 20 20 20 20 2f 2a 20 50 63 61 63 68  age;    /* Pcach
02b0: 65 20 6f 62 6a 65 63 74 20 70 61 67 65 20 68 61  e object page ha
02c0: 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ndle */.  void *
02d0: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
02e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
02f0: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
0300: 2a 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 20  *pExtra;        
0310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
0320: 72 61 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ra content */.  
0330: 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20  PgHdr *pDirty;  
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0350: 2a 20 54 72 61 6e 73 69 65 6e 74 20 6c 69 73 74  * Transient list
0360: 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
0370: 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
0380: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
0390: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
03a0: 20 74 68 69 73 20 70 61 67 65 20 69 73 20 70 61   this page is pa
03b0: 72 74 20 6f 66 20 2a 2f 0a 20 20 50 67 6e 6f 20  rt of */.  Pgno 
03c0: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
03d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
03e0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
03f0: 73 20 70 61 67 65 20 2a 2f 0a 23 69 66 64 65 66  s page */.#ifdef
0400: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
0410: 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48 61  GES.  u32 pageHa
0420: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
0430: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 6f 66 20       /* Hash of 
0440: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  page content */.
0450: 23 65 6e 64 69 66 0a 20 20 75 31 36 20 66 6c 61  #endif.  u16 fla
0460: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
0470: 20 20 20 20 20 20 20 20 2f 2a 20 50 47 48 44 52          /* PGHDR
0480: 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 62   flags defined b
0490: 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a  elow */..  /****
04a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04e0: 2a 2a 0a 20 20 2a 2a 20 45 6c 65 6d 65 6e 74 73  **.  ** Elements
04f0: 20 61 62 6f 76 65 20 61 72 65 20 70 75 62 6c 69   above are publi
0500: 63 2e 20 20 41 6c 6c 20 74 68 61 74 20 66 6f 6c  c.  All that fol
0510: 6c 6f 77 73 20 69 73 20 70 72 69 76 61 74 65 20  lows is private 
0520: 74 6f 20 70 63 61 63 68 65 2e 63 0a 20 20 2a 2a  to pcache.c.  **
0530: 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 20   and should not 
0540: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 6f  be accessed by o
0550: 74 68 65 72 20 6d 6f 64 75 6c 65 73 2e 0a 20 20  ther modules..  
0560: 2a 2f 0a 20 20 69 31 36 20 6e 52 65 66 3b 20 20  */.  i16 nRef;  
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0590: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
05a0: 61 67 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  age */.  PCache 
05b0: 2a 70 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  *pCache;        
05c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
05d0: 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
05e0: 70 61 67 65 20 2a 2f 0a 0a 20 20 50 67 48 64 72  page */..  PgHdr
05f0: 20 2a 70 44 69 72 74 79 4e 65 78 74 3b 20 20 20   *pDirtyNext;   
0600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
0610: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 6c 69 73  t element in lis
0620: 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
0630: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
0640: 72 74 79 50 72 65 76 3b 20 20 20 20 20 20 20 20  rtyPrev;        
0650: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
0660: 20 65 6c 65 6d 65 6e 74 20 69 6e 20 6c 69 73 74   element in list
0670: 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
0680: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61  */.};../* Bit va
0690: 6c 75 65 73 20 66 6f 72 20 50 67 48 64 72 2e 66  lues for PgHdr.f
06a0: 6c 61 67 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lags */.#define 
06b0: 50 47 48 44 52 5f 43 4c 45 41 4e 20 20 20 20 20  PGHDR_CLEAN     
06c0: 20 20 20 20 20 20 30 78 30 30 31 20 20 2f 2a 20        0x001  /* 
06d0: 50 61 67 65 20 6e 6f 74 20 6f 6e 20 74 68 65 20  Page not on the 
06e0: 50 43 61 63 68 65 2e 70 44 69 72 74 79 20 6c 69  PCache.pDirty li
06f0: 73 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47  st */.#define PG
0700: 48 44 52 5f 44 49 52 54 59 20 20 20 20 20 20 20  HDR_DIRTY       
0710: 20 20 20 20 30 78 30 30 32 20 20 2f 2a 20 50 61      0x002  /* Pa
0720: 67 65 20 69 73 20 6f 6e 20 74 68 65 20 50 43 61  ge is on the PCa
0730: 63 68 65 2e 70 44 69 72 74 79 20 6c 69 73 74 20  che.pDirty list 
0740: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
0750: 5f 57 52 49 54 45 41 42 4c 45 20 20 20 20 20 20  _WRITEABLE      
0760: 20 30 78 30 30 34 20 20 2f 2a 20 4a 6f 75 72 6e   0x004  /* Journ
0770: 61 6c 65 64 20 61 6e 64 20 72 65 61 64 79 20 74  aled and ready t
0780: 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 23 64 65 66  o modify */.#def
0790: 69 6e 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  ine PGHDR_NEED_S
07a0: 59 4e 43 20 20 20 20 20 20 20 30 78 30 30 38 20  YNC       0x008 
07b0: 20 2f 2a 20 46 73 79 6e 63 20 74 68 65 20 72 6f   /* Fsync the ro
07c0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 62  llback journal b
07d0: 65 66 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20  efore.          
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 72             ** wr
0800: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
0810: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0820: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
0830: 5f 4e 45 45 44 5f 52 45 41 44 20 20 20 20 20 20  _NEED_READ      
0840: 20 30 78 30 31 30 20 20 2f 2a 20 43 6f 6e 74 65   0x010  /* Conte
0850: 6e 74 20 69 73 20 75 6e 72 65 61 64 20 2a 2f 0a  nt is unread */.
0860: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 44 4f  #define PGHDR_DO
0870: 4e 54 5f 57 52 49 54 45 20 20 20 20 20 20 30 78  NT_WRITE      0x
0880: 30 32 30 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77  020  /* Do not w
0890: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20  rite content to 
08a0: 64 69 73 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  disk */.#define 
08b0: 50 47 48 44 52 5f 4d 4d 41 50 20 20 20 20 20 20  PGHDR_MMAP      
08c0: 20 20 20 20 20 20 30 78 30 34 30 20 20 2f 2a 20        0x040  /* 
08d0: 54 68 69 73 20 69 73 20 61 6e 20 6d 6d 61 70 20  This is an mmap 
08e0: 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  page object */..
08f0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 57 41  #define PGHDR_WA
0900: 4c 5f 41 50 50 45 4e 44 20 20 20 20 20 20 30 78  L_APPEND      0x
0910: 30 38 30 20 20 2f 2a 20 41 70 70 65 6e 64 65 64  080  /* Appended
0920: 20 74 6f 20 77 61 6c 20 66 69 6c 65 20 2a 2f 0a   to wal file */.
0930: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  ./* Initialize a
0940: 6e 64 20 73 68 75 74 64 6f 77 6e 20 74 68 65 20  nd shutdown the 
0950: 70 61 67 65 20 63 61 63 68 65 20 73 75 62 73 79  page cache subsy
0960: 73 74 65 6d 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  stem */.int sqli
0970: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
0980: 69 7a 65 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20  ize(void);.void 
0990: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
09a0: 74 64 6f 77 6e 28 76 6f 69 64 29 3b 0a 0a 2f 2a  tdown(void);../*
09b0: 20 50 61 67 65 20 63 61 63 68 65 20 62 75 66 66   Page cache buff
09c0: 65 72 20 6d 61 6e 61 67 65 6d 65 6e 74 3a 0a 2a  er management:.*
09d0: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
09e0: 20 69 6d 70 6c 65 6d 65 6e 74 20 53 51 4c 49 54   implement SQLIT
09f0: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
0a00: 48 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  HE..*/.void sqli
0a10: 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53  te3PCacheBufferS
0a20: 65 74 75 70 28 76 6f 69 64 20 2a 2c 20 69 6e 74  etup(void *, int
0a30: 20 73 7a 2c 20 69 6e 74 20 6e 29 3b 0a 0a 2f 2a   sz, int n);../*
0a40: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
0a50: 67 65 72 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e  ger cache..** Un
0a60: 64 65 72 20 6d 65 6d 6f 72 79 20 73 74 72 65 73  der memory stres
0a70: 73 2c 20 69 6e 76 6f 6b 65 20 78 53 74 72 65 73  s, invoke xStres
0a80: 73 20 74 6f 20 74 72 79 20 74 6f 20 6d 61 6b 65  s to try to make
0a90: 20 70 61 67 65 73 20 63 6c 65 61 6e 2e 0a 2a 2a   pages clean..**
0aa0: 20 4f 6e 6c 79 20 63 6c 65 61 6e 20 61 6e 64 20   Only clean and 
0ab0: 75 6e 70 69 6e 6e 65 64 20 70 61 67 65 73 20 63  unpinned pages c
0ac0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
0ad0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
0ae0: 63 61 63 68 65 4f 70 65 6e 28 0a 20 20 69 6e 74  cacheOpen(.  int
0af0: 20 73 7a 50 61 67 65 2c 20 20 20 20 20 20 20 20   szPage,        
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0b10: 69 7a 65 20 6f 66 20 65 76 65 72 79 20 70 61 67  ize of every pag
0b20: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 78 74  e */.  int szExt
0b30: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
0b40: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
0b50: 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  pace associated 
0b60: 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 2a  with each page *
0b70: 2f 0a 20 20 69 6e 74 20 62 50 75 72 67 65 61 62  /.  int bPurgeab
0b80: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
0b90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
0ba0: 67 65 73 20 61 72 65 20 6f 6e 20 62 61 63 6b 69  ges are on backi
0bb0: 6e 67 20 73 74 6f 72 65 20 2a 2f 0a 20 20 69 6e  ng store */.  in
0bc0: 74 20 28 2a 78 53 74 72 65 73 73 29 28 76 6f 69  t (*xStress)(voi
0bd0: 64 2a 2c 20 50 67 48 64 72 2a 29 2c 20 2f 2a 20  d*, PgHdr*), /* 
0be0: 43 61 6c 6c 20 74 6f 20 74 72 79 20 74 6f 20 6d  Call to try to m
0bf0: 61 6b 65 20 70 61 67 65 73 20 63 6c 65 61 6e 20  ake pages clean 
0c00: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 53 74 72 65  */.  void *pStre
0c10: 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
0c20: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
0c30: 74 6f 20 78 53 74 72 65 73 73 20 2a 2f 0a 20 20  to xStress */.  
0c40: 50 43 61 63 68 65 20 2a 70 54 6f 49 6e 69 74 20  PCache *pToInit 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c60: 2a 20 50 72 65 61 6c 6c 6f 63 61 74 65 64 20 73  * Preallocated s
0c70: 70 61 63 65 20 66 6f 72 20 74 68 65 20 50 43 61  pace for the PCa
0c80: 63 68 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a 20 4d 6f  che */.);../* Mo
0c90: 64 69 66 79 20 74 68 65 20 70 61 67 65 2d 73 69  dify the page-si
0ca0: 7a 65 20 61 66 74 65 72 20 74 68 65 20 63 61 63  ze after the cac
0cb0: 68 65 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  he has been crea
0cc0: 74 65 64 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted. */.int sqli
0cd0: 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
0ce0: 53 69 7a 65 28 50 43 61 63 68 65 20 2a 2c 20 69  Size(PCache *, i
0cf0: 6e 74 29 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  nt);../* Return 
0d00: 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
0d10: 73 20 6f 66 20 61 20 50 43 61 63 68 65 20 6f 62  s of a PCache ob
0d20: 6a 65 63 74 2e 20 20 55 73 65 64 20 74 6f 20 70  ject.  Used to p
0d30: 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 74  reallocate.** st
0d40: 6f 72 61 67 65 20 73 70 61 63 65 2e 0a 2a 2f 0a  orage space..*/.
0d50: 69 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63 68  int sqlite3Pcach
0d60: 65 53 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a  eSize(void);../*
0d70: 20 4f 6e 65 20 72 65 6c 65 61 73 65 20 70 65 72   One release per
0d80: 20 73 75 63 63 65 73 73 66 75 6c 20 66 65 74 63   successful fetc
0d90: 68 2e 20 20 50 61 67 65 20 69 73 20 70 69 6e 6e  h.  Page is pinn
0da0: 65 64 20 75 6e 74 69 6c 20 72 65 6c 65 61 73 65  ed until release
0db0: 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 20  d..** Reference 
0dc0: 63 6f 75 6e 74 65 64 2e 20 0a 2a 2f 0a 73 71 6c  counted. .*/.sql
0dd0: 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
0de0: 20 2a 73 71 6c 69 74 65 33 50 63 61 63 68 65 46   *sqlite3PcacheF
0df0: 65 74 63 68 28 50 43 61 63 68 65 2a 2c 20 50 67  etch(PCache*, Pg
0e00: 6e 6f 2c 20 69 6e 74 20 63 72 65 61 74 65 46 6c  no, int createFl
0e10: 61 67 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  ag);.int sqlite3
0e20: 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
0e30: 73 28 50 43 61 63 68 65 2a 2c 20 50 67 6e 6f 2c  s(PCache*, Pgno,
0e40: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
0e50: 70 61 67 65 2a 2a 29 3b 0a 50 67 48 64 72 20 2a  page**);.PgHdr *
0e60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
0e70: 63 68 46 69 6e 69 73 68 28 50 43 61 63 68 65 2a  chFinish(PCache*
0e80: 2c 20 50 67 6e 6f 2c 20 73 71 6c 69 74 65 33 5f  , Pgno, sqlite3_
0e90: 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61  pcache_page *pPa
0ea0: 67 65 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  ge);.void sqlite
0eb0: 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 50  3PcacheRelease(P
0ec0: 67 48 64 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71  gHdr*);..void sq
0ed0: 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
0ee0: 50 67 48 64 72 2a 29 3b 20 20 20 20 20 20 20 20  PgHdr*);        
0ef0: 20 2f 2a 20 52 65 6d 6f 76 65 20 70 61 67 65 20   /* Remove page 
0f00: 66 72 6f 6d 20 63 61 63 68 65 20 2a 2f 0a 76 6f  from cache */.vo
0f10: 69 64 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  id sqlite3Pcache
0f20: 4d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 2a  MakeDirty(PgHdr*
0f30: 29 3b 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );    /* Make su
0f40: 72 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  re page is marke
0f50: 64 20 64 69 72 74 79 20 2a 2f 0a 76 6f 69 64 20  d dirty */.void 
0f60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
0f70: 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 20  eClean(PgHdr*); 
0f80: 20 20 20 2f 2a 20 4d 61 72 6b 20 61 20 73 69 6e     /* Mark a sin
0f90: 67 6c 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  gle page as clea
0fa0: 6e 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n */.void sqlite
0fb0: 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
0fc0: 50 43 61 63 68 65 2a 29 3b 20 20 20 20 2f 2a 20  PCache*);    /* 
0fd0: 4d 61 72 6b 20 61 6c 6c 20 64 69 72 74 79 20 6c  Mark all dirty l
0fe0: 69 73 74 20 70 61 67 65 73 20 61 73 20 63 6c 65  ist pages as cle
0ff0: 61 6e 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  an */.void sqlit
1000: 65 33 50 63 61 63 68 65 43 6c 65 61 72 57 72 69  e3PcacheClearWri
1010: 74 61 62 6c 65 28 50 43 61 63 68 65 2a 29 3b 0a  table(PCache*);.
1020: 0a 2f 2a 20 43 68 61 6e 67 65 20 61 20 70 61 67  ./* Change a pag
1030: 65 20 6e 75 6d 62 65 72 2e 20 20 55 73 65 64 20  e number.  Used 
1040: 62 79 20 69 6e 63 72 2d 76 61 63 75 75 6d 2e 20  by incr-vacuum. 
1050: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1060: 63 61 63 68 65 4d 6f 76 65 28 50 67 48 64 72 2a  cacheMove(PgHdr*
1070: 2c 20 50 67 6e 6f 29 3b 0a 0a 2f 2a 20 52 65 6d  , Pgno);../* Rem
1080: 6f 76 65 20 61 6c 6c 20 70 61 67 65 73 20 77 69  ove all pages wi
1090: 74 68 20 70 67 6e 6f 3e 78 2e 20 20 52 65 73 65  th pgno>x.  Rese
10a0: 74 20 74 68 65 20 63 61 63 68 65 20 69 66 20 78  t the cache if x
10b0: 3d 3d 30 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ==0 */.void sqli
10c0: 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
10d0: 65 28 50 43 61 63 68 65 2a 2c 20 50 67 6e 6f 20  e(PCache*, Pgno 
10e0: 78 29 3b 0a 0a 2f 2a 20 47 65 74 20 61 20 6c 69  x);../* Get a li
10f0: 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74 79 20  st of all dirty 
1100: 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1110: 68 65 2c 20 73 6f 72 74 65 64 20 62 79 20 70 61  he, sorted by pa
1120: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 50 67 48  ge number */.PgH
1130: 64 72 20 2a 73 71 6c 69 74 65 33 50 63 61 63 68  dr *sqlite3Pcach
1140: 65 44 69 72 74 79 4c 69 73 74 28 50 43 61 63 68  eDirtyList(PCach
1150: 65 2a 29 3b 0a 0a 2f 2a 20 52 65 73 65 74 20 61  e*);../* Reset a
1160: 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 63 61 63  nd close the cac
1170: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 76 6f 69  he object */.voi
1180: 64 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43  d sqlite3PcacheC
1190: 6c 6f 73 65 28 50 43 61 63 68 65 2a 29 3b 0a 0a  lose(PCache*);..
11a0: 2f 2a 20 43 6c 65 61 72 20 66 6c 61 67 73 20 66  /* Clear flags f
11b0: 72 6f 6d 20 70 61 67 65 73 20 6f 66 20 74 68 65  rom pages of the
11c0: 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f 0a 76   page cache */.v
11d0: 6f 69 64 20 73 71 6c 69 74 65 33 50 63 61 63 68  oid sqlite3Pcach
11e0: 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
11f0: 50 43 61 63 68 65 20 2a 29 3b 0a 0a 2f 2a 20 44  PCache *);../* D
1200: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
1210: 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
1220: 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33   */.void sqlite3
1230: 50 63 61 63 68 65 43 6c 65 61 72 28 50 43 61 63  PcacheClear(PCac
1240: 68 65 2a 29 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e  he*);../* Return
1250: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1260: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
1270: 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
1280: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50   */.int sqlite3P
1290: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 50 43  cacheRefCount(PC
12a0: 61 63 68 65 2a 29 3b 0a 0a 2f 2a 20 49 6e 63 72  ache*);../* Incr
12b0: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
12c0: 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 61 6e 20  nce count of an 
12d0: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 2a 2f  existing page */
12e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 63 61  .void sqlite3Pca
12f0: 63 68 65 52 65 66 28 50 67 48 64 72 2a 29 3b 0a  cheRef(PgHdr*);.
1300: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63  .int sqlite3Pcac
1310: 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 50  hePageRefcount(P
1320: 67 48 64 72 2a 29 3b 0a 0a 2f 2a 20 52 65 74 75  gHdr*);../* Retu
1330: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
1340: 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 6f  ber of pages sto
1350: 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
1360: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50   */.int sqlite3P
1370: 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 50  cachePagecount(P
1380: 43 61 63 68 65 2a 29 3b 0a 0a 23 69 66 20 64 65  Cache*);..#if de
1390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45  fined(SQLITE_CHE
13a0: 43 4b 5f 50 41 47 45 53 29 20 7c 7c 20 64 65 66  CK_PAGES) || def
13b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
13c0: 47 29 0a 2f 2a 20 49 74 65 72 61 74 65 20 74 68  G)./* Iterate th
13d0: 72 6f 75 67 68 20 61 6c 6c 20 64 69 72 74 79 20  rough all dirty 
13e0: 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
13f0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
1400: 63 68 65 2e 20 54 68 69 73 0a 2a 2a 20 69 6e 74  che. This.** int
1410: 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 61  erface is only a
1420: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 49  vailable if SQLI
1430: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69  TE_CHECK_PAGES i
1440: 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74  s defined when t
1450: 68 65 20 0a 2a 2a 20 6c 69 62 72 61 72 79 20 69  he .** library i
1460: 73 20 62 75 69 6c 74 2e 0a 2a 2f 0a 76 6f 69 64  s built..*/.void
1470: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
1480: 65 72 61 74 65 44 69 72 74 79 28 50 43 61 63 68  erateDirty(PCach
1490: 65 20 2a 70 43 61 63 68 65 2c 20 76 6f 69 64 20  e *pCache, void 
14a0: 28 2a 78 49 74 65 72 29 28 50 67 48 64 72 20 2a  (*xIter)(PgHdr *
14b0: 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53  ));.#endif../* S
14c0: 65 74 20 61 6e 64 20 67 65 74 20 74 68 65 20 73  et and get the s
14d0: 75 67 67 65 73 74 65 64 20 63 61 63 68 65 2d 73  uggested cache-s
14e0: 69 7a 65 20 66 6f 72 20 74 68 65 20 73 70 65 63  ize for the spec
14f0: 69 66 69 65 64 20 70 61 67 65 72 2d 63 61 63 68  ified pager-cach
1500: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 67  e..**.** If no g
1510: 6c 6f 62 61 6c 20 6d 61 78 69 6d 75 6d 20 69 73  lobal maximum is
1520: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65   configured, the
1530: 6e 20 74 68 65 20 73 79 73 74 65 6d 20 61 74 74  n the system att
1540: 65 6d 70 74 73 20 74 6f 20 6c 69 6d 69 74 0a 2a  empts to limit.*
1550: 2a 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  * the total numb
1560: 65 72 20 6f 66 20 70 61 67 65 73 20 63 61 63 68  er of pages cach
1570: 65 64 20 62 79 20 70 75 72 67 65 61 62 6c 65 20  ed by purgeable 
1580: 70 61 67 65 72 2d 63 61 63 68 65 73 20 74 6f 20  pager-caches to 
1590: 74 68 65 20 73 75 6d 0a 2a 2a 20 6f 66 20 74 68  the sum.** of th
15a0: 65 20 73 75 67 67 65 73 74 65 64 20 63 61 63 68  e suggested cach
15b0: 65 2d 73 69 7a 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e-sizes..*/.void
15c0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
15d0: 74 43 61 63 68 65 73 69 7a 65 28 50 43 61 63 68  tCachesize(PCach
15e0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 23 69 66 64 65  e *, int);.#ifde
15f0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
1600: 74 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47  t sqlite3PcacheG
1610: 65 74 43 61 63 68 65 73 69 7a 65 28 50 43 61 63  etCachesize(PCac
1620: 68 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  he *);.#endif../
1630: 2a 20 53 65 74 20 6f 72 20 67 65 74 20 74 68 65  * Set or get the
1640: 20 73 75 67 67 65 73 74 65 64 20 73 70 69 6c 6c   suggested spill
1650: 2d 73 69 7a 65 20 66 6f 72 20 74 68 65 20 73 70  -size for the sp
1660: 65 63 69 66 69 65 64 20 70 61 67 65 72 2d 63 61  ecified pager-ca
1670: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  che..**.** The s
1680: 70 69 6c 6c 2d 73 69 7a 65 20 69 73 20 74 68 65  pill-size is the
1690: 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   minimum number 
16a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 63 61 63 68  of pages in cach
16b0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 61 63  e before the cac
16c0: 68 65 0a 2a 2a 20 77 69 6c 6c 20 61 74 74 65 6d  he.** will attem
16d0: 70 74 20 74 6f 20 73 70 69 6c 6c 20 64 69 72 74  pt to spill dirt
16e0: 79 20 70 61 67 65 73 20 62 79 20 63 61 6c 6c 69  y pages by calli
16f0: 6e 67 20 78 53 74 72 65 73 73 2e 0a 2a 2f 0a 69  ng xStress..*/.i
1700: 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  nt sqlite3Pcache
1710: 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 43 61  SetSpillsize(PCa
1720: 63 68 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  che *, int);../*
1730: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
1740: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
1750: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ble from the pag
1760: 65 20 63 61 63 68 65 20 2a 2f 0a 76 6f 69 64 20  e cache */.void 
1770: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 72  sqlite3PcacheShr
1780: 69 6e 6b 28 50 43 61 63 68 65 2a 29 3b 0a 0a 23  ink(PCache*);..#
1790: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17a0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
17b0: 45 4d 45 4e 54 0a 2f 2a 20 54 72 79 20 74 6f 20  EMENT./* Try to 
17c0: 72 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 75 73  return memory us
17d0: 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
17e0: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 6d   module to the m
17f0: 61 69 6e 20 6d 65 6d 6f 72 79 20 68 65 61 70 20  ain memory heap 
1800: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 63  */.int sqlite3Pc
1810: 61 63 68 65 52 65 6c 65 61 73 65 4d 65 6d 6f 72  acheReleaseMemor
1820: 79 28 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  y(int);.#endif..
1830: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1840: 53 54 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  ST.void sqlite3P
1850: 63 61 63 68 65 53 74 61 74 73 28 69 6e 74 2a 2c  cacheStats(int*,
1860: 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29 3b  int*,int*,int*);
1870: 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71  .#endif..void sq
1880: 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65  lite3PCacheSetDe
1890: 66 61 75 6c 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a  fault(void);../*
18a0: 20 52 65 74 75 72 6e 20 74 68 65 20 68 65 61 64   Return the head
18b0: 65 72 20 73 69 7a 65 20 2a 2f 0a 69 6e 74 20 73  er size */.int s
18c0: 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65  qlite3HeaderSize
18d0: 50 63 61 63 68 65 28 76 6f 69 64 29 3b 0a 69 6e  Pcache(void);.in
18e0: 74 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53  t sqlite3HeaderS
18f0: 69 7a 65 50 63 61 63 68 65 31 28 76 6f 69 64 29  izePcache1(void)
1900: 3b 0a 0a 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;../* Number of 
1910: 64 69 72 74 79 20 70 61 67 65 73 20 61 73 20 61  dirty pages as a
1920: 20 70 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74   percentage of t
1930: 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63 61  he configured ca
1940: 63 68 65 20 73 69 7a 65 20 2a 2f 0a 69 6e 74 20  che size */.int 
1950: 73 71 6c 69 74 65 33 50 43 61 63 68 65 50 65 72  sqlite3PCachePer
1960: 63 65 6e 74 44 69 72 74 79 28 50 43 61 63 68 65  centDirty(PCache
1970: 2a 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  *);..#endif /* _
1980: 50 43 41 43 48 45 5f 48 5f 20 2a 2f 0a           PCACHE_H_ */.