提交 cde7a7c6 编写于 作者: H Hongze Cheng

more TDB

上级 13b7ba3e
...@@ -381,19 +381,20 @@ static int tdbBtreeInitPage(SPage *pPage, void *arg) { ...@@ -381,19 +381,20 @@ static int tdbBtreeInitPage(SPage *pPage, void *arg) {
SBTree *pBt; SBTree *pBt;
u16 flags; u16 flags;
u8 isLeaf; u8 isLeaf;
u8 szAmHdr;
pBt = (SBTree *)arg; pBt = (SBTree *)arg;
flags = TDB_PAGE_FLAGS(pPage); flags = TDB_PAGE_FLAGS(pPage);
isLeaf = TDB_BTREE_PAGE_IS_LEAF(flags); isLeaf = TDB_BTREE_PAGE_IS_LEAF(flags);
if (isLeaf) { if (isLeaf) {
pPage->szAmHdr = 0; szAmHdr = 0;
} else { } else {
pPage->szAmHdr = sizeof(SBtPageHdr); szAmHdr = sizeof(SBtPageHdr);
} }
pPage->xCellSize = NULL; // TODO pPage->xCellSize = NULL; // TODO
tdbPageInit(pPage); tdbPageInit(pPage, szAmHdr);
TDB_BTREE_ASSERT_FLAG(flags); TDB_BTREE_ASSERT_FLAG(flags);
...@@ -416,6 +417,7 @@ static int tdbBtreeZeroPage(SPage *pPage, void *arg) { ...@@ -416,6 +417,7 @@ static int tdbBtreeZeroPage(SPage *pPage, void *arg) {
u16 flags; u16 flags;
SBTree *pBt; SBTree *pBt;
u8 isLeaf; u8 isLeaf;
u8 szAmHdr;
flags = ((SBtreeZeroPageArg *)arg)->flags; flags = ((SBtreeZeroPageArg *)arg)->flags;
pBt = ((SBtreeZeroPageArg *)arg)->pBt; pBt = ((SBtreeZeroPageArg *)arg)->pBt;
...@@ -425,13 +427,13 @@ static int tdbBtreeZeroPage(SPage *pPage, void *arg) { ...@@ -425,13 +427,13 @@ static int tdbBtreeZeroPage(SPage *pPage, void *arg) {
TDB_PAGE_FLAGS_SET(pPage, flags); TDB_PAGE_FLAGS_SET(pPage, flags);
// Set szAmHdr // Set szAmHdr
if (isLeaf) { if (isLeaf) {
pPage->szAmHdr = 0; szAmHdr = 0;
} else { } else {
pPage->szAmHdr = sizeof(SBtPageHdr); szAmHdr = sizeof(SBtPageHdr);
} }
pPage->xCellSize = NULL; // TODO pPage->xCellSize = NULL; // TODO
tdbPageZero(pPage); tdbPageZero(pPage, szAmHdr);
if (isLeaf) { if (isLeaf) {
pPage->kLen = pBt->keyLen; pPage->kLen = pBt->keyLen;
......
...@@ -61,7 +61,6 @@ struct SPage { ...@@ -61,7 +61,6 @@ struct SPage {
u8 *pData; u8 *pData;
SPageMethods *pPageMethods; SPageMethods *pPageMethods;
// Fields below used by pager and am // Fields below used by pager and am
u8 szAmHdr;
u8 *pAmHdr; u8 *pAmHdr;
u8 *pPageHdr; u8 *pPageHdr;
u8 *pCellIdx; u8 *pCellIdx;
...@@ -111,8 +110,8 @@ struct SPage { ...@@ -111,8 +110,8 @@ struct SPage {
int tdbPageCreate(int pageSize, SPage **ppPage, void *(*xMalloc)(void *, size_t), void *arg); int tdbPageCreate(int pageSize, SPage **ppPage, void *(*xMalloc)(void *, size_t), void *arg);
int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg); int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg);
void tdbPageZero(SPage *pPage); void tdbPageZero(SPage *pPage, u8 szAmHdr);
void tdbPageInit(SPage *pPage); void tdbPageInit(SPage *pPage, u8 szAmHdr);
int tdbPageInsertCell(SPage *pPage, int idx, SCell *pCell, int szCell); int tdbPageInsertCell(SPage *pPage, int idx, SCell *pCell, int szCell);
int tdbPageDropCell(SPage *pPage, int idx); int tdbPageDropCell(SPage *pPage, int idx);
...@@ -134,6 +133,7 @@ static inline SCell *tdbPageGetCell(SPage *pPage, int idx) { ...@@ -134,6 +133,7 @@ static inline SCell *tdbPageGetCell(SPage *pPage, int idx) {
} }
lidx = idx - iOvfl; lidx = idx - iOvfl;
ASSERT(lidx >= 0 && lidx < pPage->pPageMethods->getCellNum(pPage));
pCell = pPage->pData + pPage->pPageMethods->getCellOffset(pPage, lidx); pCell = pPage->pData + pPage->pPageMethods->getCellOffset(pPage, lidx);
return pCell; return pCell;
......
...@@ -32,8 +32,8 @@ extern SPageMethods pageLargeMethods; ...@@ -32,8 +32,8 @@ extern SPageMethods pageLargeMethods;
#define TDB_PAGE_NFREE_SET(pPage, NFREE) (*(pPage)->pPageMethods->setFreeBytes)(pPage, NFREE) #define TDB_PAGE_NFREE_SET(pPage, NFREE) (*(pPage)->pPageMethods->setFreeBytes)(pPage, NFREE)
#define TDB_PAGE_CELL_OFFSET_AT_SET(pPage, idx, OFFSET) (*(pPage)->pPageMethods->setCellOffset)(pPage, idx, OFFSET) #define TDB_PAGE_CELL_OFFSET_AT_SET(pPage, idx, OFFSET) (*(pPage)->pPageMethods->setCellOffset)(pPage, idx, OFFSET)
#define TDB_PAGE_CELL_AT(pPage, idx) ((pPage)->pData + TDB_PAGE_CELL_OFFSET_AT(pPage, idx)) #define TDB_PAGE_CELL_AT(pPage, idx) ((pPage)->pData + TDB_PAGE_CELL_OFFSET_AT(pPage, idx))
#define TDB_PAGE_MAX_FREE_BLOCK(pPage) \ #define TDB_PAGE_MAX_FREE_BLOCK(pPage, szAmHdr) \
((pPage)->pageSize - (pPage)->szAmHdr - TDB_PAGE_HDR_SIZE(pPage) - sizeof(SPageFtr)) ((pPage)->pageSize - (szAmHdr)-TDB_PAGE_HDR_SIZE(pPage) - sizeof(SPageFtr))
static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell); static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell);
static int tdbPageDefragment(SPage *pPage); static int tdbPageDefragment(SPage *pPage);
...@@ -79,17 +79,25 @@ int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg) ...@@ -79,17 +79,25 @@ int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg)
return 0; return 0;
} }
void tdbPageZero(SPage *pPage) { void tdbPageZero(SPage *pPage, u8 szAmHdr) {
pPage->pAmHdr = pPage->pData;
pPage->pPageHdr = pPage->pAmHdr + szAmHdr;
TDB_PAGE_NCELLS_SET(pPage, 0); TDB_PAGE_NCELLS_SET(pPage, 0);
TDB_PAGE_CCELLS_SET(pPage, pPage->pageSize - sizeof(SPageFtr)); TDB_PAGE_CCELLS_SET(pPage, pPage->pageSize - sizeof(SPageFtr));
TDB_PAGE_FCELL_SET(pPage, 0); TDB_PAGE_FCELL_SET(pPage, 0);
TDB_PAGE_NFREE_SET(pPage, TDB_PAGE_MAX_FREE_BLOCK(pPage)); TDB_PAGE_NFREE_SET(pPage, TDB_PAGE_MAX_FREE_BLOCK(pPage, szAmHdr));
tdbPageInit(pPage); pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage);
pPage->pFreeStart = pPage->pCellIdx;
pPage->pFreeEnd = pPage->pData + TDB_PAGE_CCELLS(pPage);
pPage->pPageFtr = (SPageFtr *)(pPage->pData + pPage->pageSize - sizeof(SPageFtr));
pPage->nOverflow = 0;
ASSERT((u8 *)pPage->pPageFtr == pPage->pFreeEnd);
} }
void tdbPageInit(SPage *pPage) { void tdbPageInit(SPage *pPage, u8 szAmHdr) {
pPage->pAmHdr = pPage->pData; pPage->pAmHdr = pPage->pData;
pPage->pPageHdr = pPage->pAmHdr + pPage->szAmHdr; pPage->pPageHdr = pPage->pAmHdr + szAmHdr;
pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage); pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage);
pPage->pFreeStart = pPage->pCellIdx + TDB_PAGE_OFFSET_SIZE(pPage) * TDB_PAGE_NCELLS(pPage); pPage->pFreeStart = pPage->pCellIdx + TDB_PAGE_OFFSET_SIZE(pPage) * TDB_PAGE_NCELLS(pPage);
pPage->pFreeEnd = pPage->pData + TDB_PAGE_CCELLS(pPage); pPage->pFreeEnd = pPage->pData + TDB_PAGE_CCELLS(pPage);
...@@ -107,7 +115,7 @@ int tdbPageInsertCell(SPage *pPage, int idx, SCell *pCell, int szCell) { ...@@ -107,7 +115,7 @@ int tdbPageInsertCell(SPage *pPage, int idx, SCell *pCell, int szCell) {
int lidx; // local idx int lidx; // local idx
SCell *pNewCell; SCell *pNewCell;
ASSERT(szCell <= TDB_PAGE_MAX_FREE_BLOCK(pPage)); ASSERT(szCell <= TDB_PAGE_MAX_FREE_BLOCK(pPage, pPage->pPageHdr - pPage->pAmHdr));
nFree = TDB_PAGE_NFREE(pPage); nFree = TDB_PAGE_NFREE(pPage);
nCells = TDB_PAGE_NCELLS(pPage); nCells = TDB_PAGE_NCELLS(pPage);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册