15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2008 August 05
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This header file defines the interface that the sqlite page cache
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** subsystem.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _PCACHE_H_
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct PgHdr PgHdr;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct PCache PCache;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Every page in the cache is controlled by an instance of the following
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PgHdr {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pData;                   /* Content of this page */
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pExtra;                  /* Extra content */
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PgHdr *pDirty;                 /* Transient list of dirty pages */
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pgno pgno;                     /* Page number for this page */
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pager *pPager;                 /* The pager this page is part of */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_CHECK_PAGES
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 pageHash;                  /* Hash of page content */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 flags;                     /* PGHDR flags defined below */
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**********************************************************************
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Elements above are public.  All that follows is private to pcache.c
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and should not be accessed by other modules.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i16 nRef;                      /* Number of users of this page */
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PCache *pCache;                /* Cache that owns this page */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PgHdr *pDirtyNext;             /* Next element in list of dirty pages */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PgHdr *pDirtyPrev;             /* Previous element in list of dirty pages */
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Bit values for PgHdr.flags */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PGHDR_DIRTY             0x002  /* Page has changed */
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PGHDR_NEED_SYNC         0x004  /* Fsync the rollback journal before
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ** writing this page to the database */
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PGHDR_NEED_READ         0x008  /* Content is unread */
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PGHDR_REUSE_UNLIKELY    0x010  /* A hint that reuse is unlikely */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PGHDR_DONT_WRITE        0x020  /* Do not write content to disk */
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Initialize and shutdown the page cache subsystem */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcacheInitialize(void);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheShutdown(void);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Page cache buffer management:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These routines implement SQLITE_CONFIG_PAGECACHE.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PCacheBufferSetup(void *, int sz, int n);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Create a new pager cache.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Under memory stress, invoke xStress to try to make pages clean.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Only clean and unpinned pages can be reclaimed.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheOpen(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int szPage,                    /* Size of every page */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int szExtra,                   /* Extra space associated with each page */
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bPurgeable,                /* True if pages are on backing store */
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pStress,                 /* Argument to xStress */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PCache *pToInit                /* Preallocated space for the PCache */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Modify the page-size after the cache has been created. */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheSetPageSize(PCache *, int);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Return the size in bytes of a PCache object.  Used to preallocate
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** storage space.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcacheSize(void);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* One release per successful fetch.  Page is pinned until released.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reference counted.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheRelease(PgHdr*);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheDrop(PgHdr*);         /* Remove page from cache */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheMakeDirty(PgHdr*);    /* Make sure page is marked dirty */
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheMakeClean(PgHdr*);    /* Mark a single page as clean */
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheCleanAll(PCache*);    /* Mark all dirty list pages as clean */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Change a page number.  Used by incr-vacuum. */
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheMove(PgHdr*, Pgno);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Remove all pages with pgno>x.  Reset the cache if x==0 */
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheTruncate(PCache*, Pgno x);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Get a list of all dirty pages in the cache, sorted by page number */
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PgHdr *sqlite3PcacheDirtyList(PCache*);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Reset and close the cache object */
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheClose(PCache*);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Clear flags from pages of the page cache */
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheClearSyncFlags(PCache *);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Discard the contents of the cache */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheClear(PCache*);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Return the total number of outstanding page references */
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcacheRefCount(PCache*);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Increment the reference count of an existing page */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheRef(PgHdr*);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcachePageRefcount(PgHdr*);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Return the total number of pages stored in the cache */
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcachePagecount(PCache*);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Iterate through all dirty pages currently stored in the cache. This
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** interface is only available if SQLITE_CHECK_PAGES is defined when the
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** library is built.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Set and get the suggested cache-size for the specified pager-cache.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If no global maximum is configured, then the system attempts to limit
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the total number of pages cached by purgeable pager-caches to the sum
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the suggested cache-sizes.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheSetCachesize(PCache *, int);
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef SQLITE_TEST
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcacheGetCachesize(PCache *);
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Try to return memory used by the pcache module to the main memory heap */
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PcacheReleaseMemory(int);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PcacheStats(int*,int*,int*,int*);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PCacheSetDefault(void);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _PCACHE_H_ */
156