diff --git a/source/libs/tdb/src/db/btree.c b/source/libs/tdb/src/db/btree.c index 3174bfa0b9496ee25192d9cbdd05cc891af1147e..3ed6667c921105b1240038a101d3814f34665ad2 100644 --- a/source/libs/tdb/src/db/btree.c +++ b/source/libs/tdb/src/db/btree.c @@ -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); + + // 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; diff --git a/source/libs/tdb/src/inc/pgfile.h b/source/libs/tdb/src/inc/pgfile.h index 5a42199c53991b0bfbdcb80595bc3c690a9d5dea..67d81ffbb1d1c697541d0700dce9f798133e79ba 100644 --- a/source/libs/tdb/src/inc/pgfile.h +++ b/source/libs/tdb/src/inc/pgfile.h @@ -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 diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h index 2f9cd5af4ccb316b41a0e359083fc58191fdf0af..5c532c23f25ba3953189dfaf0f32c0dd6ce78157 100644 --- a/source/libs/tdb/src/inc/tdbInt.h +++ b/source/libs/tdb/src/inc/tdbInt.h @@ -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 diff --git a/source/libs/tdb/src/inc/tdbUtil.h b/source/libs/tdb/src/inc/tdbUtil.h index 2eeda286ec88e8e7ce4809cc663e77f1053fd3fa..f3e00a5ba55bc8a09cefe9b2181f056cc245c456 100644 --- a/source/libs/tdb/src/inc/tdbUtil.h +++ b/source/libs/tdb/src/inc/tdbUtil.h @@ -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)