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

more TDB

上级 49edc62e
...@@ -27,13 +27,19 @@ typedef struct { ...@@ -27,13 +27,19 @@ typedef struct {
} SBtIdx; } SBtIdx;
// Btree page header definition // Btree page header definition
typedef struct { typedef struct __attribute__((__packed__)) {
uint8_t flags; uint8_t flags;
uint16_t ncells; uint16_t ncells;
pgsz_t pldOffset; // payload offset pgsz_t pldOffset; // payload offset
/* TODO */ /* TODO */
} SBtPgHdr; } SBtPgHdr;
typedef int (*BtreeCmprFn)(const void *, const void *);
#define BTREE_PAGE_HDR(pPage) NULL /* TODO */
#define BTREE_PAGE_PAYLOAD_AT(pPage, idx) NULL /*TODO*/
#define BTREE_PAGE_IS_LEAF(pPage) 0 /* TODO */
static int btreeCreate(SBTree **pBt); static int btreeCreate(SBTree **pBt);
static int btreeDestroy(SBTree *pBt); static int btreeDestroy(SBTree *pBt);
static int btreeCursorMoveToChild(SBtCursor *pBtCur, pgno_t pgno); static int btreeCursorMoveToChild(SBtCursor *pBtCur, pgno_t pgno);
...@@ -77,23 +83,63 @@ int btreeCursorClose(SBtCursor *pBtCur) { ...@@ -77,23 +83,63 @@ int btreeCursorClose(SBtCursor *pBtCur) {
} }
int btreeCursorMoveTo(SBtCursor *pBtCur, int kLen, const void *pKey) { int btreeCursorMoveTo(SBtCursor *pBtCur, int kLen, const void *pKey) {
SPage * pPage; SPage * pPage;
SBtPgHdr *pBtPgHdr; SBtPgHdr * pBtPgHdr;
pgno_t childPgno; SPgFile * pPgFile;
int idx; pgno_t childPgno;
pgno_t rootPgno;
int nPayload;
void * pPayload;
BtreeCmprFn cmpFn;
// 1. Move the cursor to the root page // 1. Move the cursor to the root page
if (rootPgno == TDB_IVLD_PGNO) {
// No any data in this btree, just return not found (TODO)
return 0;
} else {
// Load the page from the file by the SPgFile handle
pPage = pgFileFetch(pPgFile, rootPgno);
pBtCur->pPage = pPage;
}
// 2. Loop to search over the whole tree // 2. Loop to search over the whole tree
for (;;) { for (;;) {
int lidx, ridx, midx, cret;
pPage = pBtCur->pPage; pPage = pBtCur->pPage;
pBtPgHdr = BTREE_PAGE_HDR(pPage);
nPayload = pBtPgHdr->ncells;
// Loop to search in current page // Binary search the page
lidx = 0;
ridx = nPayload - 1;
midx = (lidx + ridx) >> 1;
for (;;) { for (;;) {
/* code */ // get the payload ptr at midx
pPayload = BTREE_PAGE_PAYLOAD_AT(pPage, midx);
// the payload and the key
cret = cmpFn(pKey, pPayload);
if (cret < 0) {
/* TODO */
} else if (cret > 0) {
/* TODO */
} else {
/* TODO */
}
if (lidx > ridx) break;
midx = (lidx + ridx) >> 1;
}
if (BTREE_PAGE_IS_LEAF(pPage)) {
/* TODO */
break;
} else {
/* TODO */
btreeCursorMoveToChild(pBtCur, childPgno);
} }
btreeCursorMoveToChild(pBtCur, childPgno);
} }
return 0; return 0;
......
...@@ -30,7 +30,7 @@ typedef struct __attribute__((__packed__)) { ...@@ -30,7 +30,7 @@ typedef struct __attribute__((__packed__)) {
#define TDB_PG_FILE_HDR_SIZE 128 #define TDB_PG_FILE_HDR_SIZE 128
TD_STATIC_ASSERT(sizeof(SPgFileHdr) == TDB_PG_FILE_HDR_SIZE, "Page file header size if not 128"); TDB_STATIC_ASSERT(sizeof(SPgFileHdr) == TDB_PG_FILE_HDR_SIZE, "Page file header size if not 128");
struct SPgFile { struct SPgFile {
char * fname; // backend file name char * fname; // backend file name
......
...@@ -29,7 +29,7 @@ typedef struct SPgFile SPgFile; ...@@ -29,7 +29,7 @@ typedef struct SPgFile SPgFile;
// pgno_t // pgno_t
typedef int32_t pgno_t; typedef int32_t pgno_t;
#define TDB_IVLD_PGNO ((pgno_t)-1) #define TDB_IVLD_PGNO ((pgno_t)0)
// fileid // fileid
#define TDB_FILE_ID_LEN 24 #define TDB_FILE_ID_LEN 24
......
...@@ -21,9 +21,9 @@ extern "C" { ...@@ -21,9 +21,9 @@ extern "C" {
#endif #endif
#if __STDC_VERSION__ >= 201112L #if __STDC_VERSION__ >= 201112L
#define TD_STATIC_ASSERT(op, info) static_assert(op, info) #define TDB_STATIC_ASSERT(op, info) static_assert(op, info)
#else #else
#define TD_STATIC_ASSERT(op, info) #define TDB_STATIC_ASSERT(op, info)
#endif #endif
#define TDB_ROUND8(x) (((x) + 7) & ~7) #define TDB_ROUND8(x) (((x) + 7) & ~7)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册