more TDB
This commit is contained in:
parent
49edc62e6d
commit
e19fdafda7
|
@ -27,13 +27,19 @@ typedef struct {
|
|||
} SBtIdx;
|
||||
|
||||
// Btree page header definition
|
||||
typedef struct {
|
||||
typedef struct __attribute__((__packed__)) {
|
||||
uint8_t flags;
|
||||
uint16_t ncells;
|
||||
pgsz_t pldOffset; // payload offset
|
||||
/* TODO */
|
||||
} 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 btreeDestroy(SBTree *pBt);
|
||||
static int btreeCursorMoveToChild(SBtCursor *pBtCur, pgno_t pgno);
|
||||
|
@ -77,23 +83,63 @@ int btreeCursorClose(SBtCursor *pBtCur) {
|
|||
}
|
||||
|
||||
int btreeCursorMoveTo(SBtCursor *pBtCur, int kLen, const void *pKey) {
|
||||
SPage * pPage;
|
||||
SBtPgHdr *pBtPgHdr;
|
||||
pgno_t childPgno;
|
||||
int idx;
|
||||
SPage * pPage;
|
||||
SBtPgHdr * pBtPgHdr;
|
||||
SPgFile * pPgFile;
|
||||
pgno_t childPgno;
|
||||
pgno_t rootPgno;
|
||||
int nPayload;
|
||||
void * pPayload;
|
||||
BtreeCmprFn cmpFn;
|
||||
|
||||
// 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
|
||||
for (;;) {
|
||||
int lidx, ridx, midx, cret;
|
||||
|
||||
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 (;;) {
|
||||
/* code */
|
||||
}
|
||||
// get the payload ptr at midx
|
||||
pPayload = BTREE_PAGE_PAYLOAD_AT(pPage, midx);
|
||||
|
||||
btreeCursorMoveToChild(pBtCur, childPgno);
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -30,7 +30,7 @@ typedef struct __attribute__((__packed__)) {
|
|||
|
||||
#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 {
|
||||
char * fname; // backend file name
|
||||
|
|
|
@ -29,7 +29,7 @@ typedef struct SPgFile SPgFile;
|
|||
|
||||
// pgno_t
|
||||
typedef int32_t pgno_t;
|
||||
#define TDB_IVLD_PGNO ((pgno_t)-1)
|
||||
#define TDB_IVLD_PGNO ((pgno_t)0)
|
||||
|
||||
// fileid
|
||||
#define TDB_FILE_ID_LEN 24
|
||||
|
|
|
@ -21,9 +21,9 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#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
|
||||
#define TD_STATIC_ASSERT(op, info)
|
||||
#define TDB_STATIC_ASSERT(op, info)
|
||||
#endif
|
||||
|
||||
#define TDB_ROUND8(x) (((x) + 7) & ~7)
|
||||
|
|
Loading…
Reference in New Issue