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

more TDB

上级 cad19023
......@@ -25,18 +25,29 @@ struct SBTree {
int (*FKeyComparator)(const void *pKey1, int keyLen1, const void *pKey2, int keyLen2);
};
typedef struct SPgHdr {
u8 flags;
u8 nFree;
u16 firstFree;
u16 nCells;
u16 pCell;
i32 kLen;
i32 vLen;
} SPgHdr;
typedef struct SBtPage {
SPgHdr *pHdr;
u16 * aCellIdx;
} SBtPage;
struct SBtCursor {
SBTree * pBt;
i8 iPage;
// SMemPage *pPage;
// SMemPage *apPage[BTREE_MAX_DEPTH + 1];
SBTree * pBt;
i8 iPage;
SBtPage *pPage;
};
// typedef struct SMemPage {
// u8 isInit;
// u8 isLeaf;
// SPgno pgno;
// } SMemPage;
static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen);
static int tdbEncodeLength(u8 *pBuf, uint len);
int tdbBtreeOpen(SPgno root, SBTree **ppBt) {
*ppBt = NULL;
......@@ -56,21 +67,72 @@ int tdbBtreeCursor(SBTree *pBt, SBtCursor *pCur) {
return 0;
}
int tdbBtreeCursorMoveTo(SBtCursor *pCur) {
/* TODO */
int tdbBtCursorInsert(SBtCursor *pCur, const void *pKey, int kLen, const void *pVal, int vLen) {
int ret;
SPFile *pFile;
ret = tdbBtCursorMoveTo(pCur, pKey, kLen);
if (ret < 0) {
// TODO: handle error
return -1;
}
pFile = pCur->pBt->pFile;
// ret = tdbPFileWrite(pFile, pCur->pPage);
// if (ret < 0) {
// // TODO: handle error
// return -1;
// }
return 0;
}
static int tdbBtreeCursorMoveToRoot(SBtCursor *pCur) {
SPFile *pFile;
SPage * pPage;
static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen) {
// TODO
return 0;
}
pFile = pCur->pBt->pFile;
static int tdbEncodeKeyValue(const void *pKey, int kLen, int kLenG, const void *pVal, int vLen, int vLenG, void *pBuf,
int *bLen) {
u8 *pPtr;
pPage = tdbPFileGet(pFile, pCur->pBt->root);
if (pPage == NULL) {
return -1;
ASSERT(kLen > 0 && vLen > 0);
ASSERT(kLenG == TDB_VARIANT_LEN || kLenG == kLen);
ASSERT(vLenG == TDB_VARIANT_LEN || vLenG == vLen);
pPtr = (u8 *)pBuf;
if (kLenG == TDB_VARIANT_LEN) {
pPtr += tdbEncodeLength(pPtr, kLen);
}
if (vLenG == TDB_VARIANT_LEN) {
pPtr += tdbEncodeLength(pPtr, vLen);
}
memcpy(pPtr, pKey, kLen);
pPtr += kLen;
memcpy(pPtr, pVal, vLen);
pPtr += vLen;
*bLen = pPtr - (u8 *)pBuf;
return 0;
}
static int tdbDecodeKeyValue(const void *pBuf, void *pKey, int *kLen, void *pVal, int *vLen) {
// TODO
return 0;
}
static int tdbEncodeLength(u8 *pBuf, uint len) {
int iCount = 0;
while (len > 127) {
pBuf[iCount++] = (u8)((len & 0xff) | 128);
len >>= 7;
}
pBuf[iCount++] = (u8)len;
return iCount;
}
\ No newline at end of file
......@@ -105,6 +105,18 @@ SPage *tdbPFileGet(SPFile *pFile, SPgno pgno) {
return pPage;
}
int tdbPFileWrite(SPFile *pFile, SPage *pPage) {
// TODO: if the page is not in journal, write to journal
// mark the page as dirty
return 0;
}
int tdbPFileAllocPage(SPFile *pFile, SPage **ppPage) {
// TODO
*ppPage = NULL;
return 0;
}
int tdbPFileBegin(SPFile *pFile) {
// TODO
return 0;
......
......@@ -23,6 +23,8 @@ extern "C" {
typedef struct SBTree SBTree;
typedef struct SBtCursor SBtCursor;
int tdbBtCursorInsert(SBtCursor *pCur, const void *pKey, int kLen, const void *pVal, int vLen);
#ifdef __cplusplus
}
#endif
......
......@@ -108,7 +108,7 @@ typedef TD_DLIST_NODE(SPgFile) SPgFileListNode;
} \
} while (0)
#define TDB_VARIANT_LEN (int)-1
#define TDB_VARIANT_LEN ((int)-1)
// page payload format
// <keyLen> + <valLen> + [key] + [value]
......
......@@ -25,6 +25,8 @@ typedef struct SPFile SPFile;
int tdbPFileOpen(SPCache *pCache, const char *fileName, SPFile **ppFile);
int tdbPFileClose(SPFile *pFile);
SPage *tdbPFileGet(SPFile *pFile, SPgno pgno);
int tdbPFileWrite(SPFile *pFile, SPage *pPage);
int tdbPFileAllocPage(SPFile *pFile, SPage **ppPage);
int tdbPFileBegin(SPFile *pFile);
int tdbPFileCommit(SPFile *pFile);
int tdbPFileRollback(SPFile *pFile);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册