blob: 3eb5906955f883b8a941f8362cd4a5e52828116a [file] [log] [blame]
drha059ad02001-04-17 20:09:11 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drha059ad02001-04-17 20:09:11 +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:
drha059ad02001-04-17 20:09:11 +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.
drha059ad02001-04-17 20:09:11 +000010**
11*************************************************************************
12** This header file defines the interface that the sqlite B-Tree file
drh6446c4d2001-12-15 14:22:18 +000013** subsystem. See comments in the source code for a detailed description
14** of what each interface routine does.
drha059ad02001-04-17 20:09:11 +000015*/
drhbe0072d2001-09-13 14:46:09 +000016#ifndef _BTREE_H_
17#define _BTREE_H_
drha059ad02001-04-17 20:09:11 +000018
danielk19774adee202004-05-08 08:23:19 +000019/* TODO: This definition is just included so other modules compile. It
20** needs to be revisited.
21*/
22#define SQLITE_N_BTREE_META 10
23
drh73509ee2003-04-06 20:44:45 +000024/*
danielk1977951af802004-11-05 15:45:09 +000025** If defined as non-zero, auto-vacuum is enabled by default. Otherwise
26** it must be turned on for each database using "PRAGMA auto_vacuum = 1".
27*/
28#ifndef SQLITE_DEFAULT_AUTOVACUUM
29 #define SQLITE_DEFAULT_AUTOVACUUM 0
30#endif
31
danielk1977dddbcdc2007-04-26 14:42:34 +000032#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */
33#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */
34#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */
35
danielk1977951af802004-11-05 15:45:09 +000036/*
drh73509ee2003-04-06 20:44:45 +000037** Forward declarations of structure
38*/
drha059ad02001-04-17 20:09:11 +000039typedef struct Btree Btree;
40typedef struct BtCursor BtCursor;
danielk1977aef0bf62005-12-30 16:28:01 +000041typedef struct BtShared BtShared;
paulb95a8862003-04-01 21:16:41 +000042
drh73509ee2003-04-06 20:44:45 +000043
danielk197724162fe2004-06-04 06:22:00 +000044int sqlite3BtreeOpen(
dan3a6d8ae2011-04-23 15:54:54 +000045 sqlite3_vfs *pVfs, /* VFS to use with this b-tree */
drh90f5ecb2004-07-22 01:19:35 +000046 const char *zFilename, /* Name of database file to open */
danielk1977aef0bf62005-12-30 16:28:01 +000047 sqlite3 *db, /* Associated database connection */
danielk19770d19f7a2009-06-03 11:25:07 +000048 Btree **ppBtree, /* Return open Btree* here */
drh33f4e022007-09-03 15:19:34 +000049 int flags, /* Flags */
50 int vfsFlags /* Flags passed through to VFS open */
danielk197724162fe2004-06-04 06:22:00 +000051);
drh3aac2dd2004-04-26 14:10:20 +000052
53/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the
54** following values.
drh7bec5052005-02-06 02:45:41 +000055**
56** NOTE: These values must match the corresponding PAGER_ values in
57** pager.h.
drh73509ee2003-04-06 20:44:45 +000058*/
drhd4187c72010-08-30 22:15:45 +000059#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */
drh33f111d2012-01-17 15:29:14 +000060#define BTREE_MEMORY 2 /* This is an in-memory DB */
61#define BTREE_SINGLE 4 /* The file contains at most 1 b-tree */
62#define BTREE_UNORDERED 8 /* Use of a hash implementation is OK */
drhe53831d2007-08-17 01:14:38 +000063
drh3aac2dd2004-04-26 14:10:20 +000064int sqlite3BtreeClose(Btree*);
65int sqlite3BtreeSetCacheSize(Btree*,int);
drh0d0614b2013-03-25 23:09:28 +000066int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64);
drh40c39412013-08-16 20:42:20 +000067int sqlite3BtreeSetPagerFlags(Btree*,unsigned);
drh2c8997b2005-08-27 16:36:48 +000068int sqlite3BtreeSyncDisabled(Btree*);
danielk19770d19f7a2009-06-03 11:25:07 +000069int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix);
drh90f5ecb2004-07-22 01:19:35 +000070int sqlite3BtreeGetPageSize(Btree*);
drhf8e632b2007-05-08 14:51:36 +000071int sqlite3BtreeMaxPageCount(Btree*,int);
drhb1299152010-03-30 22:58:33 +000072u32 sqlite3BtreeLastPage(Btree*);
drh5b47efa2010-02-12 18:18:39 +000073int sqlite3BtreeSecureDelete(Btree*,int);
drh2011d5f2004-07-22 02:40:37 +000074int sqlite3BtreeGetReserve(Btree*);
drha1f38532012-10-01 12:44:26 +000075#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_DEBUG)
dan0094f372012-09-28 20:23:42 +000076int sqlite3BtreeGetReserveNoMutex(Btree *p);
drha1f38532012-10-01 12:44:26 +000077#endif
danielk1977951af802004-11-05 15:45:09 +000078int sqlite3BtreeSetAutoVacuum(Btree *, int);
79int sqlite3BtreeGetAutoVacuum(Btree *);
danielk197740b38dc2004-06-26 08:38:24 +000080int sqlite3BtreeBeginTrans(Btree*,int);
drh80e35f42007-03-30 14:06:34 +000081int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
dan60939d02011-03-29 15:40:55 +000082int sqlite3BtreeCommitPhaseTwo(Btree*, int);
drh3aac2dd2004-04-26 14:10:20 +000083int sqlite3BtreeCommit(Btree*);
drh0f198a72012-02-13 16:43:16 +000084int sqlite3BtreeRollback(Btree*,int);
danielk1977bd434552009-03-18 10:33:00 +000085int sqlite3BtreeBeginStmt(Btree*,int);
drh3aac2dd2004-04-26 14:10:20 +000086int sqlite3BtreeCreateTable(Btree*, int*, int flags);
danielk19771d850a72004-05-31 08:26:49 +000087int sqlite3BtreeIsInTrans(Btree*);
danielk19772372c2b2006-06-27 16:34:56 +000088int sqlite3BtreeIsInReadTrans(Btree*);
danielk197704103022009-02-03 16:51:24 +000089int sqlite3BtreeIsInBackup(Btree*);
danielk1977da184232006-01-05 11:34:32 +000090void *sqlite3BtreeSchema(Btree *, int, void(*)(void *));
danielk1977602b4662009-07-02 07:47:33 +000091int sqlite3BtreeSchemaLocked(Btree *pBtree);
92int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock);
danielk1977fd7f0452008-12-17 17:30:26 +000093int sqlite3BtreeSavepoint(Btree *, int, int);
drh3aac2dd2004-04-26 14:10:20 +000094
danielk19774adee202004-05-08 08:23:19 +000095const char *sqlite3BtreeGetFilename(Btree *);
danielk19775865e3d2004-06-14 06:03:57 +000096const char *sqlite3BtreeGetJournalname(Btree *);
danielk19774adee202004-05-08 08:23:19 +000097int sqlite3BtreeCopyFile(Btree *, Btree *);
98
danielk1977dddbcdc2007-04-26 14:42:34 +000099int sqlite3BtreeIncrVacuum(Btree *);
100
drh3aac2dd2004-04-26 14:10:20 +0000101/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR
drhd4187c72010-08-30 22:15:45 +0000102** of the flags shown below.
103**
104** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set.
105** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data
106** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With
107** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored
108** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL
109** indices.)
drh73509ee2003-04-06 20:44:45 +0000110*/
drh8b18dd42004-05-12 19:18:15 +0000111#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */
drhd4187c72010-08-30 22:15:45 +0000112#define BTREE_BLOBKEY 2 /* Table has keys only - no data */
drh73509ee2003-04-06 20:44:45 +0000113
danielk1977a0bf2652004-11-04 14:30:04 +0000114int sqlite3BtreeDropTable(Btree*, int, int*);
danielk1977c7af4842008-10-27 13:59:33 +0000115int sqlite3BtreeClearTable(Btree*, int, int*);
danielk19770d19f7a2009-06-03 11:25:07 +0000116void sqlite3BtreeTripAllCursors(Btree*, int);
117
danielk1977602b4662009-07-02 07:47:33 +0000118void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue);
drh3aac2dd2004-04-26 14:10:20 +0000119int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value);
danielk19770d19f7a2009-06-03 11:25:07 +0000120
danb483eba2012-10-13 19:58:11 +0000121int sqlite3BtreeNewDb(Btree *p);
122
danielk19770d19f7a2009-06-03 11:25:07 +0000123/*
124** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta
125** should be one of the following values. The integer values are assigned
126** to constants so that the offset of the corresponding field in an
127** SQLite database header may be found using the following formula:
128**
129** offset = 36 + (idx * 4)
130**
131** For example, the free-page-count field is located at byte offset 36 of
132** the database file header. The incr-vacuum-flag field is located at
133** byte offset 64 (== 36+4*7).
134*/
135#define BTREE_FREE_PAGE_COUNT 0
136#define BTREE_SCHEMA_VERSION 1
137#define BTREE_FILE_FORMAT 2
138#define BTREE_DEFAULT_CACHE_SIZE 3
139#define BTREE_LARGEST_ROOT_PAGE 4
140#define BTREE_TEXT_ENCODING 5
141#define BTREE_USER_VERSION 6
142#define BTREE_INCR_VACUUM 7
drh4ee09b42013-05-01 19:49:27 +0000143#define BTREE_APPLICATION_ID 8
paulb95a8862003-04-01 21:16:41 +0000144
dan428c2182012-08-06 18:50:11 +0000145/*
146** Values that may be OR'd together to form the second argument of an
147** sqlite3BtreeCursorHints() call.
148*/
149#define BTREE_BULKLOAD 0x00000001
150
drh3aac2dd2004-04-26 14:10:20 +0000151int sqlite3BtreeCursor(
danielk1977cd3e8f72008-03-25 09:47:35 +0000152 Btree*, /* BTree containing table to open */
153 int iTable, /* Index of root page */
154 int wrFlag, /* 1 for writing. 0 for read-only */
155 struct KeyInfo*, /* First argument to compare function */
156 BtCursor *pCursor /* Space to write cursor structure */
drh3aac2dd2004-04-26 14:10:20 +0000157);
drh59020f32008-04-26 13:39:46 +0000158int sqlite3BtreeCursorSize(void);
drhf25a5072009-11-18 23:01:25 +0000159void sqlite3BtreeCursorZero(BtCursor*);
paulb95a8862003-04-01 21:16:41 +0000160
drha34b6762004-05-07 13:30:42 +0000161int sqlite3BtreeCloseCursor(BtCursor*);
drhe63d9992008-08-13 19:11:48 +0000162int sqlite3BtreeMovetoUnpacked(
163 BtCursor*,
164 UnpackedRecord *pUnKey,
165 i64 intKey,
166 int bias,
167 int *pRes
168);
drha3460582008-07-11 21:02:53 +0000169int sqlite3BtreeCursorHasMoved(BtCursor*, int*);
drh3aac2dd2004-04-26 14:10:20 +0000170int sqlite3BtreeDelete(BtCursor*);
drh4a1c3802004-05-12 15:15:47 +0000171int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey,
drhb026e052007-05-02 01:34:31 +0000172 const void *pData, int nData,
danielk1977de630352009-05-04 11:42:29 +0000173 int nZero, int bias, int seekResult);
drh3aac2dd2004-04-26 14:10:20 +0000174int sqlite3BtreeFirst(BtCursor*, int *pRes);
175int sqlite3BtreeLast(BtCursor*, int *pRes);
176int sqlite3BtreeNext(BtCursor*, int *pRes);
drhc39e0002004-05-07 23:50:57 +0000177int sqlite3BtreeEof(BtCursor*);
drh3aac2dd2004-04-26 14:10:20 +0000178int sqlite3BtreePrevious(BtCursor*, int *pRes);
drh4a1c3802004-05-12 15:15:47 +0000179int sqlite3BtreeKeySize(BtCursor*, i64 *pSize);
drh3aac2dd2004-04-26 14:10:20 +0000180int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*);
drh501932c2013-11-21 21:59:53 +0000181const void *sqlite3BtreeKeyFetch(BtCursor*, u32 *pAmt);
182const void *sqlite3BtreeDataFetch(BtCursor*, u32 *pAmt);
drh3aac2dd2004-04-26 14:10:20 +0000183int sqlite3BtreeDataSize(BtCursor*, u32 *pSize);
184int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*);
drh7f751222009-03-17 22:33:00 +0000185void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64);
186sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*);
drh144f9ea2003-04-16 01:28:16 +0000187
drh1dcdbc02007-01-27 02:24:54 +0000188char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*);
drha34b6762004-05-07 13:30:42 +0000189struct Pager *sqlite3BtreePager(Btree*);
190
danielk1977dcbb5d32007-05-04 18:36:44 +0000191int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*);
danielk19772dec9702007-05-02 16:48:37 +0000192void sqlite3BtreeCacheOverflow(BtCursor *);
danielk1977be51a652008-10-08 17:58:48 +0000193void sqlite3BtreeClearCursor(BtCursor *);
dane04dc882010-04-20 18:53:15 +0000194int sqlite3BtreeSetVersion(Btree *pBt, int iVersion);
dan428c2182012-08-06 18:50:11 +0000195void sqlite3BtreeCursorHints(BtCursor *, unsigned int mask);
dane04dc882010-04-20 18:53:15 +0000196
drhea8ffdf2009-07-22 00:35:23 +0000197#ifndef NDEBUG
198int sqlite3BtreeCursorIsValid(BtCursor*);
199#endif
200
danielk1977a5533162009-02-24 10:01:51 +0000201#ifndef SQLITE_OMIT_BTREECOUNT
202int sqlite3BtreeCount(BtCursor *, i64 *);
203#endif
204
drha34b6762004-05-07 13:30:42 +0000205#ifdef SQLITE_TEST
drh3e27c022004-07-23 00:01:38 +0000206int sqlite3BtreeCursorInfo(BtCursor*, int*, int);
drhc8629a12004-05-08 20:07:40 +0000207void sqlite3BtreeCursorList(Btree*);
danielk1977b5402fb2005-01-12 07:15:04 +0000208#endif
drhbe0072d2001-09-13 14:46:09 +0000209
dana550f2d2010-08-02 10:47:05 +0000210#ifndef SQLITE_OMIT_WAL
dancdc1f042010-11-18 12:11:05 +0000211 int sqlite3BtreeCheckpoint(Btree*, int, int *, int *);
dana550f2d2010-08-02 10:47:05 +0000212#endif
213
drhb1ab8ea2007-08-29 00:33:07 +0000214/*
215** If we are not using shared cache, then there is no need to
216** use mutexes to access the BtShared structures. So make the
217** Enter and Leave procedures no-ops.
218*/
danielk1977f7590db2009-04-10 12:55:16 +0000219#ifndef SQLITE_OMIT_SHARED_CACHE
drhb1ab8ea2007-08-29 00:33:07 +0000220 void sqlite3BtreeEnter(Btree*);
danielk1977f7590db2009-04-10 12:55:16 +0000221 void sqlite3BtreeEnterAll(sqlite3*);
222#else
223# define sqlite3BtreeEnter(X)
224# define sqlite3BtreeEnterAll(X)
shanea6f6d202008-05-29 03:01:23 +0000225#endif
danielk1977f7590db2009-04-10 12:55:16 +0000226
227#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE
drhdc5b0472011-04-06 22:05:53 +0000228 int sqlite3BtreeSharable(Btree*);
danielk1977f7590db2009-04-10 12:55:16 +0000229 void sqlite3BtreeLeave(Btree*);
drhff0587c2007-08-29 17:43:19 +0000230 void sqlite3BtreeEnterCursor(BtCursor*);
231 void sqlite3BtreeLeaveCursor(BtCursor*);
drhb1ab8ea2007-08-29 00:33:07 +0000232 void sqlite3BtreeLeaveAll(sqlite3*);
shanea6f6d202008-05-29 03:01:23 +0000233#ifndef NDEBUG
danielk1977f7590db2009-04-10 12:55:16 +0000234 /* These routines are used inside assert() statements only. */
235 int sqlite3BtreeHoldsMutex(Btree*);
236 int sqlite3BtreeHoldsAllMutexes(sqlite3*);
drh21206082011-04-04 18:22:02 +0000237 int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*);
shanea6f6d202008-05-29 03:01:23 +0000238#endif
danielk1977f7590db2009-04-10 12:55:16 +0000239#else
240
drhdc5b0472011-04-06 22:05:53 +0000241# define sqlite3BtreeSharable(X) 0
danielk1977f7590db2009-04-10 12:55:16 +0000242# define sqlite3BtreeLeave(X)
drhff0587c2007-08-29 17:43:19 +0000243# define sqlite3BtreeEnterCursor(X)
244# define sqlite3BtreeLeaveCursor(X)
drhb1ab8ea2007-08-29 00:33:07 +0000245# define sqlite3BtreeLeaveAll(X)
danielk1977f7590db2009-04-10 12:55:16 +0000246
247# define sqlite3BtreeHoldsMutex(X) 1
248# define sqlite3BtreeHoldsAllMutexes(X) 1
drhe54e0512011-04-05 17:31:56 +0000249# define sqlite3SchemaMutexHeld(X,Y,Z) 1
drh900b31e2007-08-28 02:27:51 +0000250#endif
251
252
drhbe0072d2001-09-13 14:46:09 +0000253#endif /* _BTREE_H_ */