blob: eca8a2f077e3504172e3c8f8b0612a3fc6a6451f [file] [log] [blame]
drh960e8c62001-04-03 16:53:21 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh960e8c62001-04-03 16:53:21 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh960e8c62001-04-03 16:53:21 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh960e8c62001-04-03 16:53:21 +000010**
11*************************************************************************
12** This header file defines the interface that the sqlite page cache
13** subsystem. The page cache subsystem reads and writes a file a page
14** at a time and provides a journal for rollback.
drh960e8c62001-04-03 16:53:21 +000015*/
drh960e8c62001-04-03 16:53:21 +000016
danielk197713f72992005-12-18 08:51:22 +000017#ifndef _PAGER_H_
18#define _PAGER_H_
19
drh960e8c62001-04-03 16:53:21 +000020/*
danielk1977bea2a942009-01-20 17:06:27 +000021** Default maximum size for persistent journal files. A negative
22** value means no limit. This value may be overridden using the
23** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit".
danielk1977b53e4962008-06-04 06:45:59 +000024*/
25#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
26 #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1
27#endif
28
29/*
drh960e8c62001-04-03 16:53:21 +000030** The type used to represent a page number. The first page in a file
31** is called page 1. 0 is used to represent "not a page".
32*/
shane3615b532008-05-27 18:11:44 +000033typedef u32 Pgno;
drh960e8c62001-04-03 16:53:21 +000034
35/*
36** Each open file is managed by a separate instance of the "Pager" structure.
37*/
38typedef struct Pager Pager;
39
drh7bec5052005-02-06 02:45:41 +000040/*
danielk19773b8a05f2007-03-19 17:44:26 +000041** Handle type for pages.
42*/
43typedef struct PgHdr DbPage;
44
45/*
danielk1977bea2a942009-01-20 17:06:27 +000046** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is
47** reserved for working around a windows/posix incompatibility). It is
48** used in the journal to signify that the remainder of the journal file
49** is devoted to storing a master journal name - there are no more pages to
50** roll back. See comments for function writeMasterJournal() in pager.c
51** for details.
52*/
53#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1))
54
55/*
danielk19773b8a05f2007-03-19 17:44:26 +000056** Allowed values for the flags parameter to sqlite3PagerOpen().
drh7bec5052005-02-06 02:45:41 +000057**
danielk1977bea2a942009-01-20 17:06:27 +000058** NOTE: These values must match the corresponding BTREE_ values in btree.h.
drh7bec5052005-02-06 02:45:41 +000059*/
60#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */
drh33f111d2012-01-17 15:29:14 +000061#define PAGER_MEMORY 0x0002 /* In-memory database */
drh7bec5052005-02-06 02:45:41 +000062
danielk197741483462007-03-24 16:45:04 +000063/*
64** Valid values for the second argument to sqlite3PagerLockingMode().
65*/
66#define PAGER_LOCKINGMODE_QUERY -1
67#define PAGER_LOCKINGMODE_NORMAL 0
68#define PAGER_LOCKINGMODE_EXCLUSIVE 1
drh90f5ecb2004-07-22 01:19:35 +000069
drh6446c4d2001-12-15 14:22:18 +000070/*
drh0b9b4302010-06-11 17:01:24 +000071** Numeric constants that encode the journalmode.
drh3b020132008-04-17 17:02:01 +000072*/
drh0b9b4302010-06-11 17:01:24 +000073#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */
drh3b020132008-04-17 17:02:01 +000074#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */
75#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */
76#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */
drh04335882008-09-26 21:08:08 +000077#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */
danielk1977b3175382008-10-17 18:51:52 +000078#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */
dan7c246102010-04-12 19:00:29 +000079#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */
drh3b020132008-04-17 17:02:01 +000080
81/*
danielk1977bea2a942009-01-20 17:06:27 +000082** The remainder of this file contains the declarations of the functions
83** that make up the Pager sub-system API. See source code comments for
84** a detailed description of each routine.
drh6446c4d2001-12-15 14:22:18 +000085*/
danielk1977bea2a942009-01-20 17:06:27 +000086
87/* Open and close a Pager connection. */
drh4775ecd2009-07-24 19:01:19 +000088int sqlite3PagerOpen(
89 sqlite3_vfs*,
90 Pager **ppPager,
91 const char*,
92 int,
93 int,
94 int,
95 void(*)(DbPage*)
96);
danielk1977bea2a942009-01-20 17:06:27 +000097int sqlite3PagerClose(Pager *pPager);
danielk1977e1fd5082009-01-23 16:45:00 +000098int sqlite3PagerReadFileheader(Pager*, int, unsigned char*);
danielk1977bea2a942009-01-20 17:06:27 +000099
100/* Functions used to configure a Pager object. */
danielk19771ceedd32008-11-19 10:22:33 +0000101void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *);
drhb2eced52010-08-12 02:41:12 +0000102int sqlite3PagerSetPagesize(Pager*, u32*, int);
drhf8e632b2007-05-08 14:51:36 +0000103int sqlite3PagerMaxPageCount(Pager*, int);
danielk19773b8a05f2007-03-19 17:44:26 +0000104void sqlite3PagerSetCachesize(Pager*, int);
drh09419b42011-11-16 19:29:17 +0000105void sqlite3PagerShrink(Pager*);
drhc97d8462010-11-19 18:23:35 +0000106void sqlite3PagerSetSafetyLevel(Pager*,int,int,int);
danielk1977bea2a942009-01-20 17:06:27 +0000107int sqlite3PagerLockingMode(Pager *, int);
drh0b9b4302010-06-11 17:01:24 +0000108int sqlite3PagerSetJournalMode(Pager *, int);
109int sqlite3PagerGetJournalMode(Pager*);
110int sqlite3PagerOkToChangeJournalMode(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000111i64 sqlite3PagerJournalSizeLimit(Pager *, i64);
danielk197704103022009-02-03 16:51:24 +0000112sqlite3_backup **sqlite3PagerBackupPtr(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000113
114/* Functions used to obtain and release page references. */
danielk19773b8a05f2007-03-19 17:44:26 +0000115int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag);
116#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0)
117DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno);
danielk1977bea2a942009-01-20 17:06:27 +0000118void sqlite3PagerRef(DbPage*);
119void sqlite3PagerUnref(DbPage*);
120
121/* Operations on page references. */
danielk197745d68822009-01-16 16:23:38 +0000122int sqlite3PagerWrite(DbPage*);
danielk1977bea2a942009-01-20 17:06:27 +0000123void sqlite3PagerDontWrite(DbPage*);
124int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int);
125int sqlite3PagerPageRefcount(DbPage*);
126void *sqlite3PagerGetData(DbPage *);
127void *sqlite3PagerGetExtra(DbPage *);
128
129/* Functions used to manage pager transactions and savepoints. */
drh8fb8b532010-08-14 17:12:04 +0000130void sqlite3PagerPagecount(Pager*, int*);
danielk1977d8293352009-04-30 09:10:37 +0000131int sqlite3PagerBegin(Pager*, int exFlag, int);
drh49b9d332009-01-02 18:10:42 +0000132int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int);
drhabfb62f2010-07-30 11:20:35 +0000133int sqlite3PagerExclusiveLock(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000134int sqlite3PagerSync(Pager *pPager);
drh80e35f42007-03-30 14:06:34 +0000135int sqlite3PagerCommitPhaseTwo(Pager*);
danielk19773b8a05f2007-03-19 17:44:26 +0000136int sqlite3PagerRollback(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000137int sqlite3PagerOpenSavepoint(Pager *pPager, int n);
138int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint);
danielk197789bc4bc2009-07-21 19:25:24 +0000139int sqlite3PagerSharedLock(Pager *pPager);
dan8d22a172010-04-19 18:03:51 +0000140
dancdc1f042010-11-18 12:11:05 +0000141int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*);
drhd9e5c4f2010-05-12 18:01:39 +0000142int sqlite3PagerWalSupported(Pager *pPager);
drh7ed91f22010-04-29 22:34:07 +0000143int sqlite3PagerWalCallback(Pager *pPager);
144int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen);
145int sqlite3PagerCloseWal(Pager *pPager);
drh70708602012-02-24 14:33:28 +0000146#ifdef SQLITE_ENABLE_ZIPVFS
147 int sqlite3PagerWalFramesize(Pager *pPager);
148#endif
danb3bdc722012-02-23 15:35:49 +0000149
danielk1977bea2a942009-01-20 17:06:27 +0000150/* Functions used to query pager state and configuration. */
drhf49661a2008-12-10 16:45:50 +0000151u8 sqlite3PagerIsreadonly(Pager*);
danielk19773b8a05f2007-03-19 17:44:26 +0000152int sqlite3PagerRefcount(Pager*);
drh63da0892010-03-10 21:42:07 +0000153int sqlite3PagerMemUsed(Pager*);
danielk19773b8a05f2007-03-19 17:44:26 +0000154const char *sqlite3PagerFilename(Pager*);
drhd0679ed2007-08-28 22:24:34 +0000155const sqlite3_vfs *sqlite3PagerVfs(Pager*);
drhcc6bb3e2007-08-31 16:11:35 +0000156sqlite3_file *sqlite3PagerFile(Pager*);
danielk19773b8a05f2007-03-19 17:44:26 +0000157const char *sqlite3PagerJournalname(Pager*);
158int sqlite3PagerNosync(Pager*);
drh26b79942007-11-28 16:19:56 +0000159void *sqlite3PagerTempSpace(Pager*);
danielk197704103022009-02-03 16:51:24 +0000160int sqlite3PagerIsMemdb(Pager*);
dan58ca31c2011-09-22 14:41:16 +0000161void sqlite3PagerCacheStat(Pager *, int, int, int *);
dan1a83bc52011-10-21 14:27:32 +0000162void sqlite3PagerClearCache(Pager *);
drhdd793422001-06-28 01:54:48 +0000163
danielk197764beba42009-01-31 14:54:06 +0000164/* Functions used to truncate the database file. */
165void sqlite3PagerTruncateImage(Pager*,Pgno);
danielk19773460d192008-12-27 15:23:13 +0000166
dan47ee3862010-06-22 15:18:44 +0000167#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL)
168void *sqlite3PagerCodec(DbPage *);
dan47ee3862010-06-22 15:18:44 +0000169#endif
170
danielk1977bea2a942009-01-20 17:06:27 +0000171/* Functions to support testing and debugging. */
drh87cc3b32007-05-08 21:45:27 +0000172#if !defined(NDEBUG) || defined(SQLITE_TEST)
173 Pgno sqlite3PagerPagenumber(DbPage*);
174 int sqlite3PagerIswriteable(DbPage*);
175#endif
drhdd793422001-06-28 01:54:48 +0000176#ifdef SQLITE_TEST
drh87cc3b32007-05-08 21:45:27 +0000177 int *sqlite3PagerStats(Pager*);
178 void sqlite3PagerRefdump(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000179 void disable_simulated_io_errors(void);
180 void enable_simulated_io_errors(void);
danielk1977979f38e2007-03-27 16:19:51 +0000181#else
182# define disable_simulated_io_errors()
183# define enable_simulated_io_errors()
184#endif
185
danielk197713f72992005-12-18 08:51:22 +0000186#endif /* _PAGER_H_ */