/* ** 2001 September 15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This header file defines the interface that the sqlite B-Tree file ** subsystem. See comments in the source code for a detailed description ** of what each interface routine does. ** ** @(#) $Id: btree.h,v 1.31 2003/04/16 01:28:16 drh Exp $ */ #ifndef _BTREE_H_ #define _BTREE_H_ /* ** Forward declarations of structure */ typedef struct Btree Btree; typedef struct BtCursor BtCursor; typedef struct BtOps BtOps; typedef struct BtCursorOps BtCursorOps; /* ** An instance of the following structure contains pointers to all ** methods against an open BTree. Alternative BTree implementations ** (examples: file based versus in-memory) can be created by substituting ** different methods. Users of the BTree cannot tell the difference. ** ** In C++ we could do this by defining a virtual base class and then ** creating subclasses for each different implementation. But this is ** C not C++ so we have to be a little more explicit. */ struct BtOps { int (*Close)(Btree*); int (*SetCacheSize)(Btree*, int); int (*SetSafetyLevel)(Btree*, int); int (*BeginTrans)(Btree*); int (*Commit)(Btree*); int (*Rollback)(Btree*); int (*BeginCkpt)(Btree*); int (*CommitCkpt)(Btree*); int (*RollbackCkpt)(Btree*); int (*CreateTable)(Btree*, int*); int (*CreateIndex)(Btree*, int*); int (*DropTable)(Btree*, int); int (*ClearTable)(Btree*, int); int (*Cursor)(Btree*, int iTable, int wrFlag, BtCursor **ppCur); int (*GetMeta)(Btree*, int*); int (*UpdateMeta)(Btree*, int*); char *(*IntegrityCheck)(Btree*, int*, int); const char *(*GetFilename)(Btree*); int (*ChangeFilename)(Btree*, const char *zNew); #ifdef SQLITE_TEST int (*PageDump)(Btree*, int, int); struct Pager *(*Pager)(Btree*); #endif }; /* ** An instance of this structure defines all of the methods that can ** be executed against a cursor. */ struct BtCursorOps { int (*Moveto)(BtCursor*, const void *pKey, int nKey, int *pRes); int (*Delete)(BtCursor*); int (*Insert)(BtCursor*, const void *pKey, int nKey, const void *pData, int nData); int (*First)(BtCursor*, int *pRes); int (*Last)(BtCursor*, int *pRes); int (*Next)(BtCursor*, int *pRes); int (*Previous)(BtCursor*, int *pRes); int (*KeySize)(BtCursor*, int *pSize); int (*Key)(BtCursor*, int offset, int amt, char *zBuf); int (*KeyCompare)(BtCursor*, const void *pKey, int nKey, int nIgnore, int *pRes); int (*DataSize)(BtCursor*, int *pSize); int (*Data)(BtCursor*, int offset, int amt, char *zBuf); int (*CloseCursor)(BtCursor*); #ifdef SQLITE_TEST int (*CursorDump)(BtCursor*, int*); #endif }; /* ** The number of 4-byte "meta" values contained on the first page of each ** database file. */ #define SQLITE_N_BTREE_META 10 int sqliteBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); #define btOps(pBt) (*((BtOps **)(pBt))) #define btCOps(pCur) (*((BtCursorOps **)(pCur))) #define sqliteBtreeClose(pBt) (btOps(pBt)->Close(pBt)) #define sqliteBtreeSetCacheSize(pBt, sz) (btOps(pBt)->SetCacheSize(pBt, sz)) #define sqliteBtreeSetSafetyLevel(pBt, sl) (btOps(pBt)->SetSafetyLevel(pBt, sl)) #define sqliteBtreeBeginTrans(pBt) (btOps(pBt)->BeginTrans(pBt)) #define sqliteBtreeCommit(pBt) (btOps(pBt)->Commit(pBt)) #define sqliteBtreeRollback(pBt) (btOps(pBt)->Rollback(pBt)) #define sqliteBtreeBeginCkpt(pBt) (btOps(pBt)->BeginCkpt(pBt)) #define sqliteBtreeCommitCkpt(pBt) (btOps(pBt)->CommitCkpt(pBt)) #define sqliteBtreeRollbackCkpt(pBt) (btOps(pBt)->RollbackCkpt(pBt)) #define sqliteBtreeCreateTable(pBt,piTable)\ (btOps(pBt)->CreateTable(pBt,piTable)) #define sqliteBtreeCreateIndex(pBt, piIndex)\ (btOps(pBt)->CreateIndex(pBt, piIndex)) #define sqliteBtreeDropTable(pBt, iTable) (btOps(pBt)->DropTable(pBt, iTable)) #define sqliteBtreeClearTable(pBt, iTable)\ (btOps(pBt)->ClearTable(pBt, iTable)) #define sqliteBtreeCursor(pBt, iTable, wrFlag, ppCur)\ (btOps(pBt)->Cursor(pBt, iTable, wrFlag, ppCur)) #define sqliteBtreeMoveto(pCur, pKey, nKey, pRes)\ (btCOps(pCur)->Moveto(pCur, pKey, nKey, pRes)) #define sqliteBtreeDelete(pCur) (btCOps(pCur)->Delete(pCur)) #define sqliteBtreeInsert(pCur, pKey, nKey, pData, nData) \ (btCOps(pCur)->Insert(pCur, pKey, nKey, pData, nData)) #define sqliteBtreeFirst(pCur, pRes) (btCOps(pCur)->First(pCur, pRes)) #define sqliteBtreeLast(pCur, pRes) (btCOps(pCur)->Last(pCur, pRes)) #define sqliteBtreeNext(pCur, pRes) (btCOps(pCur)->Next(pCur, pRes)) #define sqliteBtreePrevious(pCur, pRes) (btCOps(pCur)->Previous(pCur, pRes)) #define sqliteBtreeKeySize(pCur, pSize) (btCOps(pCur)->KeySize(pCur, pSize) ) #define sqliteBtreeKey(pCur, offset, amt, zBuf)\ (btCOps(pCur)->Key(pCur, offset, amt, zBuf)) #define sqliteBtreeKeyCompare(pCur, pKey, nKey, nIgnore, pRes)\ (btCOps(pCur)->KeyCompare(pCur, pKey, nKey, nIgnore, pRes)) #define sqliteBtreeDataSize(pCur, pSize) (btCOps(pCur)->DataSize(pCur, pSize)) #define sqliteBtreeData(pCur, offset, amt, zBuf)\ (btCOps(pCur)->Data(pCur, offset, amt, zBuf)) #define sqliteBtreeCloseCursor(pCur) (btCOps(pCur)->CloseCursor(pCur)) #define sqliteBtreeGetMeta(pBt, aMeta) (btOps(pBt)->GetMeta(pBt, aMeta)) #define sqliteBtreeUpdateMeta(pBt, aMeta) (btOps(pBt)->UpdateMeta(pBt, aMeta)) #define sqliteBtreeIntegrityCheck(pBt, aRoot, nRoot)\ (btOps(pBt)->IntegrityCheck(pBt, aRoot, nRoot)) #define sqliteBtreeGetFilename(pBt) (btOps(pBt)->GetFilename(pBt)) #define sqliteBtreeChangeFilename(pBt, zNew)\ (btOps(pBt)->ChangeFilename(pBt, zNew)) #ifdef SQLITE_TEST #define sqliteBtreePageDump(pBt, pgno, recursive)\ (btOps(pBt)->PageDump(pBt, pgno, recursive)) #define sqliteBtreeCursorDump(pCur, aResult)\ (btCOps(pCur)->CursorDump(pCur, aResult)) #define sqliteBtreePager(pBt) (btOps(pBt)->Pager(pBt)) int btree_native_byte_order; #endif /* SQLITE_TEST */ #endif /* _BTREE_H_ */