blob: ba16730863ee07033cc17a500ad1968050fb5b12 [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**
danielk1977c7af4842008-10-27 13:59:33 +000016** @(#) $Id: btree.h,v 1.105 2008/10/27 13:59:34 danielk1977 Exp $
drha059ad02001-04-17 20:09:11 +000017*/
drhbe0072d2001-09-13 14:46:09 +000018#ifndef _BTREE_H_
19#define _BTREE_H_
drha059ad02001-04-17 20:09:11 +000020
danielk19774adee202004-05-08 08:23:19 +000021/* TODO: This definition is just included so other modules compile. It
22** needs to be revisited.
23*/
24#define SQLITE_N_BTREE_META 10
25
drh73509ee2003-04-06 20:44:45 +000026/*
danielk1977951af802004-11-05 15:45:09 +000027** If defined as non-zero, auto-vacuum is enabled by default. Otherwise
28** it must be turned on for each database using "PRAGMA auto_vacuum = 1".
29*/
30#ifndef SQLITE_DEFAULT_AUTOVACUUM
31 #define SQLITE_DEFAULT_AUTOVACUUM 0
32#endif
33
danielk1977dddbcdc2007-04-26 14:42:34 +000034#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */
35#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */
36#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */
37
danielk1977951af802004-11-05 15:45:09 +000038/*
drh73509ee2003-04-06 20:44:45 +000039** Forward declarations of structure
40*/
drha059ad02001-04-17 20:09:11 +000041typedef struct Btree Btree;
42typedef struct BtCursor BtCursor;
danielk1977aef0bf62005-12-30 16:28:01 +000043typedef struct BtShared BtShared;
drh4cf7c7f2007-08-28 23:28:07 +000044typedef struct BtreeMutexArray BtreeMutexArray;
drh900b31e2007-08-28 02:27:51 +000045
46/*
47** This structure records all of the Btrees that need to hold
48** a mutex before we enter sqlite3VdbeExec(). The Btrees are
49** are placed in aBtree[] in order of aBtree[]->pBt. That way,
50** we can always lock and unlock them all quickly.
51*/
drh4cf7c7f2007-08-28 23:28:07 +000052struct BtreeMutexArray {
drh900b31e2007-08-28 02:27:51 +000053 int nMutex;
54 Btree *aBtree[SQLITE_MAX_ATTACHED+1];
55};
paulb95a8862003-04-01 21:16:41 +000056
drh73509ee2003-04-06 20:44:45 +000057
danielk197724162fe2004-06-04 06:22:00 +000058int sqlite3BtreeOpen(
drh90f5ecb2004-07-22 01:19:35 +000059 const char *zFilename, /* Name of database file to open */
danielk1977aef0bf62005-12-30 16:28:01 +000060 sqlite3 *db, /* Associated database connection */
drh90f5ecb2004-07-22 01:19:35 +000061 Btree **, /* Return open Btree* here */
drh33f4e022007-09-03 15:19:34 +000062 int flags, /* Flags */
63 int vfsFlags /* Flags passed through to VFS open */
danielk197724162fe2004-06-04 06:22:00 +000064);
drh3aac2dd2004-04-26 14:10:20 +000065
66/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the
67** following values.
drh7bec5052005-02-06 02:45:41 +000068**
69** NOTE: These values must match the corresponding PAGER_ values in
70** pager.h.
drh73509ee2003-04-06 20:44:45 +000071*/
drh3aac2dd2004-04-26 14:10:20 +000072#define BTREE_OMIT_JOURNAL 1 /* Do not use journal. No argument */
drh7bec5052005-02-06 02:45:41 +000073#define BTREE_NO_READLOCK 2 /* Omit readlocks on readonly files */
74#define BTREE_MEMORY 4 /* In-memory DB. No argument */
drhe53831d2007-08-17 01:14:38 +000075#define BTREE_READONLY 8 /* Open the database in read-only mode */
76#define BTREE_READWRITE 16 /* Open for both reading and writing */
77#define BTREE_CREATE 32 /* Create the database if it does not exist */
78
drh3aac2dd2004-04-26 14:10:20 +000079int sqlite3BtreeClose(Btree*);
80int sqlite3BtreeSetCacheSize(Btree*,int);
drhac530b12006-02-11 01:25:50 +000081int sqlite3BtreeSetSafetyLevel(Btree*,int,int);
drh2c8997b2005-08-27 16:36:48 +000082int sqlite3BtreeSyncDisabled(Btree*);
drh90f5ecb2004-07-22 01:19:35 +000083int sqlite3BtreeSetPageSize(Btree*,int,int);
84int sqlite3BtreeGetPageSize(Btree*);
drhf8e632b2007-05-08 14:51:36 +000085int sqlite3BtreeMaxPageCount(Btree*,int);
drh2011d5f2004-07-22 02:40:37 +000086int sqlite3BtreeGetReserve(Btree*);
danielk1977951af802004-11-05 15:45:09 +000087int sqlite3BtreeSetAutoVacuum(Btree *, int);
88int sqlite3BtreeGetAutoVacuum(Btree *);
danielk197740b38dc2004-06-26 08:38:24 +000089int sqlite3BtreeBeginTrans(Btree*,int);
drh80e35f42007-03-30 14:06:34 +000090int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
91int sqlite3BtreeCommitPhaseTwo(Btree*);
drh3aac2dd2004-04-26 14:10:20 +000092int sqlite3BtreeCommit(Btree*);
93int sqlite3BtreeRollback(Btree*);
94int sqlite3BtreeBeginStmt(Btree*);
95int sqlite3BtreeCommitStmt(Btree*);
96int sqlite3BtreeRollbackStmt(Btree*);
97int sqlite3BtreeCreateTable(Btree*, int*, int flags);
danielk19771d850a72004-05-31 08:26:49 +000098int sqlite3BtreeIsInTrans(Btree*);
99int sqlite3BtreeIsInStmt(Btree*);
danielk19772372c2b2006-06-27 16:34:56 +0000100int sqlite3BtreeIsInReadTrans(Btree*);
danielk1977da184232006-01-05 11:34:32 +0000101void *sqlite3BtreeSchema(Btree *, int, void(*)(void *));
danielk1977c87d34d2006-01-06 13:00:28 +0000102int sqlite3BtreeSchemaLocked(Btree *);
danielk1977c00da102006-01-07 13:21:04 +0000103int sqlite3BtreeLockTable(Btree *, int, u8);
drh3aac2dd2004-04-26 14:10:20 +0000104
danielk19774adee202004-05-08 08:23:19 +0000105const char *sqlite3BtreeGetFilename(Btree *);
danielk19775865e3d2004-06-14 06:03:57 +0000106const char *sqlite3BtreeGetDirname(Btree *);
107const char *sqlite3BtreeGetJournalname(Btree *);
danielk19774adee202004-05-08 08:23:19 +0000108int sqlite3BtreeCopyFile(Btree *, Btree *);
109
danielk1977dddbcdc2007-04-26 14:42:34 +0000110int sqlite3BtreeIncrVacuum(Btree *);
111
drh3aac2dd2004-04-26 14:10:20 +0000112/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR
113** of the following flags:
drh73509ee2003-04-06 20:44:45 +0000114*/
drh8b18dd42004-05-12 19:18:15 +0000115#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */
116#define BTREE_ZERODATA 2 /* Table has keys only - no data */
117#define BTREE_LEAFDATA 4 /* Data stored in leaves only. Implies INTKEY */
drh73509ee2003-04-06 20:44:45 +0000118
danielk1977a0bf2652004-11-04 14:30:04 +0000119int sqlite3BtreeDropTable(Btree*, int, int*);
danielk1977c7af4842008-10-27 13:59:33 +0000120int sqlite3BtreeClearTable(Btree*, int, int*);
drh3aac2dd2004-04-26 14:10:20 +0000121int sqlite3BtreeGetMeta(Btree*, int idx, u32 *pValue);
122int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value);
drhfb982642007-08-30 01:19:59 +0000123void sqlite3BtreeTripAllCursors(Btree*, int);
paulb95a8862003-04-01 21:16:41 +0000124
drh3aac2dd2004-04-26 14:10:20 +0000125int sqlite3BtreeCursor(
danielk1977cd3e8f72008-03-25 09:47:35 +0000126 Btree*, /* BTree containing table to open */
127 int iTable, /* Index of root page */
128 int wrFlag, /* 1 for writing. 0 for read-only */
129 struct KeyInfo*, /* First argument to compare function */
130 BtCursor *pCursor /* Space to write cursor structure */
drh3aac2dd2004-04-26 14:10:20 +0000131);
drh59020f32008-04-26 13:39:46 +0000132int sqlite3BtreeCursorSize(void);
paulb95a8862003-04-01 21:16:41 +0000133
drha34b6762004-05-07 13:30:42 +0000134int sqlite3BtreeCloseCursor(BtCursor*);
drhe14006d2008-03-25 17:23:32 +0000135int sqlite3BtreeMoveto(
136 BtCursor*,
137 const void *pKey,
drhe14006d2008-03-25 17:23:32 +0000138 i64 nKey,
139 int bias,
140 int *pRes
141);
drhe63d9992008-08-13 19:11:48 +0000142int sqlite3BtreeMovetoUnpacked(
143 BtCursor*,
144 UnpackedRecord *pUnKey,
145 i64 intKey,
146 int bias,
147 int *pRes
148);
drha3460582008-07-11 21:02:53 +0000149int sqlite3BtreeCursorHasMoved(BtCursor*, int*);
drh3aac2dd2004-04-26 14:10:20 +0000150int sqlite3BtreeDelete(BtCursor*);
drh4a1c3802004-05-12 15:15:47 +0000151int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey,
drhb026e052007-05-02 01:34:31 +0000152 const void *pData, int nData,
153 int nZero, int bias);
drh3aac2dd2004-04-26 14:10:20 +0000154int sqlite3BtreeFirst(BtCursor*, int *pRes);
155int sqlite3BtreeLast(BtCursor*, int *pRes);
156int sqlite3BtreeNext(BtCursor*, int *pRes);
drhc39e0002004-05-07 23:50:57 +0000157int sqlite3BtreeEof(BtCursor*);
drhf328bc82004-05-10 23:29:49 +0000158int sqlite3BtreeFlags(BtCursor*);
drh3aac2dd2004-04-26 14:10:20 +0000159int sqlite3BtreePrevious(BtCursor*, int *pRes);
drh4a1c3802004-05-12 15:15:47 +0000160int sqlite3BtreeKeySize(BtCursor*, i64 *pSize);
drh3aac2dd2004-04-26 14:10:20 +0000161int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*);
drhb21c8cd2007-08-21 19:33:56 +0000162sqlite3 *sqlite3BtreeCursorDb(const BtCursor*);
drhe51c44f2004-05-30 20:46:09 +0000163const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt);
164const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt);
drh3aac2dd2004-04-26 14:10:20 +0000165int sqlite3BtreeDataSize(BtCursor*, u32 *pSize);
166int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*);
drh144f9ea2003-04-16 01:28:16 +0000167
drh1dcdbc02007-01-27 02:24:54 +0000168char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*);
drha34b6762004-05-07 13:30:42 +0000169struct Pager *sqlite3BtreePager(Btree*);
170
danielk1977dcbb5d32007-05-04 18:36:44 +0000171int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*);
danielk19772dec9702007-05-02 16:48:37 +0000172void sqlite3BtreeCacheOverflow(BtCursor *);
danielk1977be51a652008-10-08 17:58:48 +0000173void sqlite3BtreeClearCursor(BtCursor *);
drhf328bc82004-05-10 23:29:49 +0000174
drha34b6762004-05-07 13:30:42 +0000175#ifdef SQLITE_TEST
drh3e27c022004-07-23 00:01:38 +0000176int sqlite3BtreeCursorInfo(BtCursor*, int*, int);
drhc8629a12004-05-08 20:07:40 +0000177void sqlite3BtreeCursorList(Btree*);
danielk1977b5402fb2005-01-12 07:15:04 +0000178#endif
drhbe0072d2001-09-13 14:46:09 +0000179
drhb1ab8ea2007-08-29 00:33:07 +0000180/*
181** If we are not using shared cache, then there is no need to
182** use mutexes to access the BtShared structures. So make the
183** Enter and Leave procedures no-ops.
184*/
drh900b31e2007-08-28 02:27:51 +0000185#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE
drhb1ab8ea2007-08-29 00:33:07 +0000186 void sqlite3BtreeEnter(Btree*);
187 void sqlite3BtreeLeave(Btree*);
shanea6f6d202008-05-29 03:01:23 +0000188#ifndef NDEBUG
189 /* This routine is used inside assert() statements only. */
drh1fee73e2007-08-29 04:00:57 +0000190 int sqlite3BtreeHoldsMutex(Btree*);
shanea6f6d202008-05-29 03:01:23 +0000191#endif
drhff0587c2007-08-29 17:43:19 +0000192 void sqlite3BtreeEnterCursor(BtCursor*);
193 void sqlite3BtreeLeaveCursor(BtCursor*);
drhb1ab8ea2007-08-29 00:33:07 +0000194 void sqlite3BtreeEnterAll(sqlite3*);
195 void sqlite3BtreeLeaveAll(sqlite3*);
shanea6f6d202008-05-29 03:01:23 +0000196#ifndef NDEBUG
197 /* This routine is used inside assert() statements only. */
drh1fee73e2007-08-29 04:00:57 +0000198 int sqlite3BtreeHoldsAllMutexes(sqlite3*);
shanea6f6d202008-05-29 03:01:23 +0000199#endif
drh4cf7c7f2007-08-28 23:28:07 +0000200 void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*);
201 void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*);
202 void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*);
drh900b31e2007-08-28 02:27:51 +0000203#else
drhb1ab8ea2007-08-29 00:33:07 +0000204# define sqlite3BtreeEnter(X)
205# define sqlite3BtreeLeave(X)
shanea6f6d202008-05-29 03:01:23 +0000206#ifndef NDEBUG
207 /* This routine is used inside assert() statements only. */
drh1fee73e2007-08-29 04:00:57 +0000208# define sqlite3BtreeHoldsMutex(X) 1
shanea6f6d202008-05-29 03:01:23 +0000209#endif
drhff0587c2007-08-29 17:43:19 +0000210# define sqlite3BtreeEnterCursor(X)
211# define sqlite3BtreeLeaveCursor(X)
drhb1ab8ea2007-08-29 00:33:07 +0000212# define sqlite3BtreeEnterAll(X)
213# define sqlite3BtreeLeaveAll(X)
shanea6f6d202008-05-29 03:01:23 +0000214#ifndef NDEBUG
215 /* This routine is used inside assert() statements only. */
drh1fee73e2007-08-29 04:00:57 +0000216# define sqlite3BtreeHoldsAllMutexes(X) 1
shanea6f6d202008-05-29 03:01:23 +0000217#endif
drh4cf7c7f2007-08-28 23:28:07 +0000218# define sqlite3BtreeMutexArrayEnter(X)
219# define sqlite3BtreeMutexArrayLeave(X)
220# define sqlite3BtreeMutexArrayInsert(X,Y)
drh900b31e2007-08-28 02:27:51 +0000221#endif
222
223
drhbe0072d2001-09-13 14:46:09 +0000224#endif /* _BTREE_H_ */