17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate ** 2001 September 15 37c478bd9Sstevel@tonic-gate ** 47c478bd9Sstevel@tonic-gate ** The author disclaims copyright to this source code. In place of 57c478bd9Sstevel@tonic-gate ** a legal notice, here is a blessing: 67c478bd9Sstevel@tonic-gate ** 77c478bd9Sstevel@tonic-gate ** May you do good and not evil. 87c478bd9Sstevel@tonic-gate ** May you find forgiveness for yourself and forgive others. 97c478bd9Sstevel@tonic-gate ** May you share freely, never taking more than you give. 107c478bd9Sstevel@tonic-gate ** 117c478bd9Sstevel@tonic-gate ************************************************************************* 127c478bd9Sstevel@tonic-gate ** This header file defines the interface that the sqlite B-Tree file 137c478bd9Sstevel@tonic-gate ** subsystem. See comments in the source code for a detailed description 147c478bd9Sstevel@tonic-gate ** of what each interface routine does. 157c478bd9Sstevel@tonic-gate ** 167c478bd9Sstevel@tonic-gate ** @(#) $Id: btree.h,v 1.36 2004/02/10 02:57:59 drh Exp $ 177c478bd9Sstevel@tonic-gate */ 187c478bd9Sstevel@tonic-gate #ifndef _BTREE_H_ 197c478bd9Sstevel@tonic-gate #define _BTREE_H_ 207c478bd9Sstevel@tonic-gate 217c478bd9Sstevel@tonic-gate /* 227c478bd9Sstevel@tonic-gate ** Forward declarations of structure 237c478bd9Sstevel@tonic-gate */ 247c478bd9Sstevel@tonic-gate typedef struct Btree Btree; 257c478bd9Sstevel@tonic-gate typedef struct BtCursor BtCursor; 267c478bd9Sstevel@tonic-gate typedef struct BtOps BtOps; 277c478bd9Sstevel@tonic-gate typedef struct BtCursorOps BtCursorOps; 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate /* 317c478bd9Sstevel@tonic-gate ** An instance of the following structure contains pointers to all 327c478bd9Sstevel@tonic-gate ** methods against an open BTree. Alternative BTree implementations 337c478bd9Sstevel@tonic-gate ** (examples: file based versus in-memory) can be created by substituting 347c478bd9Sstevel@tonic-gate ** different methods. Users of the BTree cannot tell the difference. 357c478bd9Sstevel@tonic-gate ** 367c478bd9Sstevel@tonic-gate ** In C++ we could do this by defining a virtual base class and then 377c478bd9Sstevel@tonic-gate ** creating subclasses for each different implementation. But this is 387c478bd9Sstevel@tonic-gate ** C not C++ so we have to be a little more explicit. 397c478bd9Sstevel@tonic-gate */ 407c478bd9Sstevel@tonic-gate struct BtOps { 417c478bd9Sstevel@tonic-gate int (*Close)(Btree*); 427c478bd9Sstevel@tonic-gate int (*SetCacheSize)(Btree*, int); 437c478bd9Sstevel@tonic-gate int (*SetSafetyLevel)(Btree*, int); 447c478bd9Sstevel@tonic-gate int (*BeginTrans)(Btree*); 457c478bd9Sstevel@tonic-gate int (*Commit)(Btree*); 467c478bd9Sstevel@tonic-gate int (*Rollback)(Btree*); 477c478bd9Sstevel@tonic-gate int (*BeginCkpt)(Btree*); 487c478bd9Sstevel@tonic-gate int (*CommitCkpt)(Btree*); 497c478bd9Sstevel@tonic-gate int (*RollbackCkpt)(Btree*); 507c478bd9Sstevel@tonic-gate int (*CreateTable)(Btree*, int*); 517c478bd9Sstevel@tonic-gate int (*CreateIndex)(Btree*, int*); 527c478bd9Sstevel@tonic-gate int (*DropTable)(Btree*, int); 537c478bd9Sstevel@tonic-gate int (*ClearTable)(Btree*, int); 547c478bd9Sstevel@tonic-gate int (*Cursor)(Btree*, int iTable, int wrFlag, BtCursor **ppCur); 557c478bd9Sstevel@tonic-gate int (*GetMeta)(Btree*, int*); 567c478bd9Sstevel@tonic-gate int (*UpdateMeta)(Btree*, int*); 577c478bd9Sstevel@tonic-gate char *(*IntegrityCheck)(Btree*, int*, int); 587c478bd9Sstevel@tonic-gate const char *(*GetFilename)(Btree*); 597c478bd9Sstevel@tonic-gate int (*Copyfile)(Btree*,Btree*); 607c478bd9Sstevel@tonic-gate struct Pager *(*Pager)(Btree*); 617c478bd9Sstevel@tonic-gate #ifdef SQLITE_TEST 627c478bd9Sstevel@tonic-gate int (*PageDump)(Btree*, int, int); 637c478bd9Sstevel@tonic-gate #endif 647c478bd9Sstevel@tonic-gate }; 657c478bd9Sstevel@tonic-gate 667c478bd9Sstevel@tonic-gate /* 677c478bd9Sstevel@tonic-gate ** An instance of this structure defines all of the methods that can 687c478bd9Sstevel@tonic-gate ** be executed against a cursor. 697c478bd9Sstevel@tonic-gate */ 707c478bd9Sstevel@tonic-gate struct BtCursorOps { 717c478bd9Sstevel@tonic-gate int (*Moveto)(BtCursor*, const void *pKey, int nKey, int *pRes); 727c478bd9Sstevel@tonic-gate int (*Delete)(BtCursor*); 737c478bd9Sstevel@tonic-gate int (*Insert)(BtCursor*, const void *pKey, int nKey, 747c478bd9Sstevel@tonic-gate const void *pData, int nData); 757c478bd9Sstevel@tonic-gate int (*First)(BtCursor*, int *pRes); 767c478bd9Sstevel@tonic-gate int (*Last)(BtCursor*, int *pRes); 777c478bd9Sstevel@tonic-gate int (*Next)(BtCursor*, int *pRes); 787c478bd9Sstevel@tonic-gate int (*Previous)(BtCursor*, int *pRes); 797c478bd9Sstevel@tonic-gate int (*KeySize)(BtCursor*, int *pSize); 807c478bd9Sstevel@tonic-gate int (*Key)(BtCursor*, int offset, int amt, char *zBuf); 817c478bd9Sstevel@tonic-gate int (*KeyCompare)(BtCursor*, const void *pKey, int nKey, 827c478bd9Sstevel@tonic-gate int nIgnore, int *pRes); 837c478bd9Sstevel@tonic-gate int (*DataSize)(BtCursor*, int *pSize); 847c478bd9Sstevel@tonic-gate int (*Data)(BtCursor*, int offset, int amt, char *zBuf); 857c478bd9Sstevel@tonic-gate int (*CloseCursor)(BtCursor*); 867c478bd9Sstevel@tonic-gate #ifdef SQLITE_TEST 877c478bd9Sstevel@tonic-gate int (*CursorDump)(BtCursor*, int*); 887c478bd9Sstevel@tonic-gate #endif 897c478bd9Sstevel@tonic-gate }; 907c478bd9Sstevel@tonic-gate 917c478bd9Sstevel@tonic-gate /* 927c478bd9Sstevel@tonic-gate ** The number of 4-byte "meta" values contained on the first page of each 937c478bd9Sstevel@tonic-gate ** database file. 947c478bd9Sstevel@tonic-gate */ 957c478bd9Sstevel@tonic-gate #define SQLITE_N_BTREE_META 10 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate int sqliteBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); 987c478bd9Sstevel@tonic-gate int sqliteRbtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); 997c478bd9Sstevel@tonic-gate 1007c478bd9Sstevel@tonic-gate #define btOps(pBt) (*((BtOps **)(pBt))) 1017c478bd9Sstevel@tonic-gate #define btCOps(pCur) (*((BtCursorOps **)(pCur))) 1027c478bd9Sstevel@tonic-gate 1037c478bd9Sstevel@tonic-gate #define sqliteBtreeClose(pBt) (btOps(pBt)->Close(pBt)) 1047c478bd9Sstevel@tonic-gate #define sqliteBtreeSetCacheSize(pBt, sz) (btOps(pBt)->SetCacheSize(pBt, sz)) 1057c478bd9Sstevel@tonic-gate #define sqliteBtreeSetSafetyLevel(pBt, sl) (btOps(pBt)->SetSafetyLevel(pBt, sl)) 1067c478bd9Sstevel@tonic-gate #define sqliteBtreeBeginTrans(pBt) (btOps(pBt)->BeginTrans(pBt)) 1077c478bd9Sstevel@tonic-gate #define sqliteBtreeCommit(pBt) (btOps(pBt)->Commit(pBt)) 1087c478bd9Sstevel@tonic-gate #define sqliteBtreeRollback(pBt) (btOps(pBt)->Rollback(pBt)) 1097c478bd9Sstevel@tonic-gate #define sqliteBtreeBeginCkpt(pBt) (btOps(pBt)->BeginCkpt(pBt)) 1107c478bd9Sstevel@tonic-gate #define sqliteBtreeCommitCkpt(pBt) (btOps(pBt)->CommitCkpt(pBt)) 1117c478bd9Sstevel@tonic-gate #define sqliteBtreeRollbackCkpt(pBt) (btOps(pBt)->RollbackCkpt(pBt)) 1127c478bd9Sstevel@tonic-gate #define sqliteBtreeCreateTable(pBt,piTable)\ 1137c478bd9Sstevel@tonic-gate (btOps(pBt)->CreateTable(pBt,piTable)) 1147c478bd9Sstevel@tonic-gate #define sqliteBtreeCreateIndex(pBt, piIndex)\ 1157c478bd9Sstevel@tonic-gate (btOps(pBt)->CreateIndex(pBt, piIndex)) 1167c478bd9Sstevel@tonic-gate #define sqliteBtreeDropTable(pBt, iTable) (btOps(pBt)->DropTable(pBt, iTable)) 1177c478bd9Sstevel@tonic-gate #define sqliteBtreeClearTable(pBt, iTable)\ 1187c478bd9Sstevel@tonic-gate (btOps(pBt)->ClearTable(pBt, iTable)) 1197c478bd9Sstevel@tonic-gate #define sqliteBtreeCursor(pBt, iTable, wrFlag, ppCur)\ 1207c478bd9Sstevel@tonic-gate (btOps(pBt)->Cursor(pBt, iTable, wrFlag, ppCur)) 1217c478bd9Sstevel@tonic-gate #define sqliteBtreeMoveto(pCur, pKey, nKey, pRes)\ 1227c478bd9Sstevel@tonic-gate (btCOps(pCur)->Moveto(pCur, pKey, nKey, pRes)) 1237c478bd9Sstevel@tonic-gate #define sqliteBtreeDelete(pCur) (btCOps(pCur)->Delete(pCur)) 1247c478bd9Sstevel@tonic-gate #define sqliteBtreeInsert(pCur, pKey, nKey, pData, nData) \ 1257c478bd9Sstevel@tonic-gate (btCOps(pCur)->Insert(pCur, pKey, nKey, pData, nData)) 1267c478bd9Sstevel@tonic-gate #define sqliteBtreeFirst(pCur, pRes) (btCOps(pCur)->First(pCur, pRes)) 1277c478bd9Sstevel@tonic-gate #define sqliteBtreeLast(pCur, pRes) (btCOps(pCur)->Last(pCur, pRes)) 1287c478bd9Sstevel@tonic-gate #define sqliteBtreeNext(pCur, pRes) (btCOps(pCur)->Next(pCur, pRes)) 1297c478bd9Sstevel@tonic-gate #define sqliteBtreePrevious(pCur, pRes) (btCOps(pCur)->Previous(pCur, pRes)) 1307c478bd9Sstevel@tonic-gate #define sqliteBtreeKeySize(pCur, pSize) (btCOps(pCur)->KeySize(pCur, pSize) ) 1317c478bd9Sstevel@tonic-gate #define sqliteBtreeKey(pCur, offset, amt, zBuf)\ 1327c478bd9Sstevel@tonic-gate (btCOps(pCur)->Key(pCur, offset, amt, zBuf)) 1337c478bd9Sstevel@tonic-gate #define sqliteBtreeKeyCompare(pCur, pKey, nKey, nIgnore, pRes)\ 1347c478bd9Sstevel@tonic-gate (btCOps(pCur)->KeyCompare(pCur, pKey, nKey, nIgnore, pRes)) 1357c478bd9Sstevel@tonic-gate #define sqliteBtreeDataSize(pCur, pSize) (btCOps(pCur)->DataSize(pCur, pSize)) 1367c478bd9Sstevel@tonic-gate #define sqliteBtreeData(pCur, offset, amt, zBuf)\ 1377c478bd9Sstevel@tonic-gate (btCOps(pCur)->Data(pCur, offset, amt, zBuf)) 1387c478bd9Sstevel@tonic-gate #define sqliteBtreeCloseCursor(pCur) (btCOps(pCur)->CloseCursor(pCur)) 1397c478bd9Sstevel@tonic-gate #define sqliteBtreeGetMeta(pBt, aMeta) (btOps(pBt)->GetMeta(pBt, aMeta)) 1407c478bd9Sstevel@tonic-gate #define sqliteBtreeUpdateMeta(pBt, aMeta) (btOps(pBt)->UpdateMeta(pBt, aMeta)) 1417c478bd9Sstevel@tonic-gate #define sqliteBtreeIntegrityCheck(pBt, aRoot, nRoot)\ 1427c478bd9Sstevel@tonic-gate (btOps(pBt)->IntegrityCheck(pBt, aRoot, nRoot)) 1437c478bd9Sstevel@tonic-gate #define sqliteBtreeGetFilename(pBt) (btOps(pBt)->GetFilename(pBt)) 1447c478bd9Sstevel@tonic-gate #define sqliteBtreeCopyFile(pBt1, pBt2) (btOps(pBt1)->Copyfile(pBt1, pBt2)) 1457c478bd9Sstevel@tonic-gate #define sqliteBtreePager(pBt) (btOps(pBt)->Pager(pBt)) 1467c478bd9Sstevel@tonic-gate 1477c478bd9Sstevel@tonic-gate #ifdef SQLITE_TEST 1487c478bd9Sstevel@tonic-gate #define sqliteBtreePageDump(pBt, pgno, recursive)\ 1497c478bd9Sstevel@tonic-gate (btOps(pBt)->PageDump(pBt, pgno, recursive)) 1507c478bd9Sstevel@tonic-gate #define sqliteBtreeCursorDump(pCur, aResult)\ 1517c478bd9Sstevel@tonic-gate (btCOps(pCur)->CursorDump(pCur, aResult)) 1527c478bd9Sstevel@tonic-gate int btree_native_byte_order; 1537c478bd9Sstevel@tonic-gate #endif /* SQLITE_TEST */ 1547c478bd9Sstevel@tonic-gate 1557c478bd9Sstevel@tonic-gate 1567c478bd9Sstevel@tonic-gate #endif /* _BTREE_H_ */ 157