From 8f6781a7bb0a884a7abab33ab3c907ff3bbcc680 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 16 Feb 2022 07:32:34 +0000 Subject: [PATCH] more TDB --- source/libs/tdb/src/db/tdb.c | 2 +- source/libs/tdb/src/db/tdbPgFile.c | 33 +++++++++++++++++++++++++++--- source/libs/tdb/src/db/tdbUtil.c | 14 +++++++++++-- source/libs/tdb/src/inc/tdbUtil.h | 2 +- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/source/libs/tdb/src/db/tdb.c b/source/libs/tdb/src/db/tdb.c index e79313d1ca..6fcb2686fd 100644 --- a/source/libs/tdb/src/db/tdb.c +++ b/source/libs/tdb/src/db/tdb.c @@ -115,7 +115,7 @@ int tdbOpen(TDB *pDb, const char *fname, const char *dbname, TENV *pEnv) { } } - pDb->pBt->root = dbRootPgno; + // pDb->pBt->root = dbRootPgno; // register pDb->pPgFile = pPgFile; diff --git a/source/libs/tdb/src/db/tdbPgFile.c b/source/libs/tdb/src/db/tdbPgFile.c index d6223a5788..030f57de4c 100644 --- a/source/libs/tdb/src/db/tdbPgFile.c +++ b/source/libs/tdb/src/db/tdbPgFile.c @@ -30,6 +30,7 @@ int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) { SPgFile * pPgFile; SPgCache *pPgCache; size_t fnameLen; + pgno_t fsize; *ppPgFile = NULL; @@ -55,6 +56,28 @@ int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) { } tdbGnrtFileID(fname, pPgFile->fileid, false); + tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize); + + pPgFile->fsize = fsize; + pPgFile->lsize = fsize; + + if (pPgFile->fsize == 0) { + // A created file + pgno_t pgno; + pgid_t pgid; + + pgFileAllocatePage(pPgFile, &pgno); + + ASSERT(pgno == 1); + + memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); + pgid.pgno = pgno; + + pgCacheFetch(pPgCache, pgid); + // Need to allocate the first page as a description page + } else { + // An existing file + } /* TODO: other open operations */ @@ -122,10 +145,14 @@ int pgFileWrite(SPage *pPage) { int pgFileAllocatePage(SPgFile *pPgFile, pgno_t *pPgno) { pgno_t pgno; - if (0) { - // TODO: allocate from the free list - } else { + if (pPgFile->lsize == 0) { pgno = ++(pPgFile->lsize); + } else { + if (0) { + // TODO: allocate from the free list + } else { + pgno = ++(pPgFile->lsize); + } } *pPgno = pgno; diff --git a/source/libs/tdb/src/db/tdbUtil.c b/source/libs/tdb/src/db/tdbUtil.c index 591e7eedd4..fa9a3297da 100644 --- a/source/libs/tdb/src/db/tdbUtil.c +++ b/source/libs/tdb/src/db/tdbUtil.c @@ -51,7 +51,17 @@ int tdbCheckFileAccess(const char *pathname, int mode) { return access(pathname, flags); } -int64_t tdbGetFileSize(const char *fname) { - // TODO +int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize) { + struct stat st; + int ret; + + ret = stat(fname, &st); + if (ret != 0) { + return -1; + } + + ASSERT(st.st_size % pgSize == 0); + + *pSize = st.st_size / pgSize; return 0; } \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbUtil.h b/source/libs/tdb/src/inc/tdbUtil.h index f3e00a5ba5..8108e5aba6 100644 --- a/source/libs/tdb/src/inc/tdbUtil.h +++ b/source/libs/tdb/src/inc/tdbUtil.h @@ -35,7 +35,7 @@ int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique); #define TDB_W_OK 0x4 int tdbCheckFileAccess(const char *pathname, int mode); -int64_t tdbGetFileSize(const char *fname); +int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize); #ifdef __cplusplus }