refact
This commit is contained in:
parent
68cc3d4f2d
commit
1e5c2688db
|
@ -8,6 +8,7 @@ add_library(tdb "")
|
||||||
target_sources(tdb
|
target_sources(tdb
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"src/db/tdbPCache.c"
|
"src/db/tdbPCache.c"
|
||||||
|
"src/db/tdbPFile.c"
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
|
|
|
@ -15,207 +15,207 @@
|
||||||
|
|
||||||
#include "tdbInt.h"
|
#include "tdbInt.h"
|
||||||
|
|
||||||
typedef struct SPage1 {
|
// typedef struct SPage1 {
|
||||||
char magic[64];
|
// char magic[64];
|
||||||
SPgno mdbRootPgno; // master DB root page number
|
// SPgno mdbRootPgno; // master DB root page number
|
||||||
SPgno freePgno; // free list page number
|
// SPgno freePgno; // free list page number
|
||||||
uint32_t nFree; // number of free pages
|
// uint32_t nFree; // number of free pages
|
||||||
} SPage1;
|
// } SPage1;
|
||||||
|
|
||||||
typedef struct SFreePage {
|
// typedef struct SFreePage {
|
||||||
/* TODO */
|
// /* TODO */
|
||||||
} SFreePage;
|
// } SFreePage;
|
||||||
|
|
||||||
TDB_STATIC_ASSERT(sizeof(SPage1) <= TDB_MIN_PGSIZE, "TDB Page1 definition too large");
|
// TDB_STATIC_ASSERT(sizeof(SPage1) <= TDB_MIN_PGSIZE, "TDB Page1 definition too large");
|
||||||
|
|
||||||
static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData);
|
// static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData);
|
||||||
|
|
||||||
int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) {
|
// int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) {
|
||||||
SPgFile * pPgFile;
|
// SPgFile * pPgFile;
|
||||||
SPgCache *pPgCache;
|
// SPgCache *pPgCache;
|
||||||
size_t fnameLen;
|
// size_t fnameLen;
|
||||||
SPgno fsize;
|
// SPgno fsize;
|
||||||
|
|
||||||
*ppPgFile = NULL;
|
// *ppPgFile = NULL;
|
||||||
|
|
||||||
// create the handle
|
// // create the handle
|
||||||
fnameLen = strlen(fname);
|
// fnameLen = strlen(fname);
|
||||||
pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile) + fnameLen + 1);
|
// pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile) + fnameLen + 1);
|
||||||
if (pPgFile == NULL) {
|
// if (pPgFile == NULL) {
|
||||||
return -1;
|
// return -1;
|
||||||
}
|
// }
|
||||||
|
|
||||||
ASSERT(pEnv != NULL);
|
// ASSERT(pEnv != NULL);
|
||||||
|
|
||||||
// init the handle
|
// // init the handle
|
||||||
pPgFile->fname = (char *)(&(pPgFile[1]));
|
// pPgFile->fname = (char *)(&(pPgFile[1]));
|
||||||
memcpy(pPgFile->fname, fname, fnameLen);
|
// memcpy(pPgFile->fname, fname, fnameLen);
|
||||||
pPgFile->fname[fnameLen] = '\0';
|
// pPgFile->fname[fnameLen] = '\0';
|
||||||
pPgFile->fd = -1;
|
// pPgFile->fd = -1;
|
||||||
|
|
||||||
pPgFile->fd = open(fname, O_CREAT | O_RDWR, 0755);
|
// pPgFile->fd = open(fname, O_CREAT | O_RDWR, 0755);
|
||||||
if (pPgFile->fd < 0) {
|
// if (pPgFile->fd < 0) {
|
||||||
// TODO: handle error
|
// // TODO: handle error
|
||||||
return -1;
|
// return -1;
|
||||||
}
|
// }
|
||||||
|
|
||||||
tdbGnrtFileID(fname, pPgFile->fileid, false);
|
// tdbGnrtFileID(fname, pPgFile->fileid, false);
|
||||||
tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize);
|
// tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize);
|
||||||
|
|
||||||
pPgFile->fsize = fsize;
|
// pPgFile->fsize = fsize;
|
||||||
pPgFile->lsize = fsize;
|
// pPgFile->lsize = fsize;
|
||||||
|
|
||||||
if (pPgFile->fsize == 0) {
|
// if (pPgFile->fsize == 0) {
|
||||||
// A created file
|
// // A created file
|
||||||
SPgno pgno;
|
// SPgno pgno;
|
||||||
pgid_t pgid;
|
// pgid_t pgid;
|
||||||
|
|
||||||
pgFileAllocatePage(pPgFile, &pgno);
|
// pgFileAllocatePage(pPgFile, &pgno);
|
||||||
|
|
||||||
ASSERT(pgno == 1);
|
// ASSERT(pgno == 1);
|
||||||
|
|
||||||
memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN);
|
// memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN);
|
||||||
pgid.pgno = pgno;
|
// pgid.pgno = pgno;
|
||||||
|
|
||||||
pgCacheFetch(pPgCache, pgid);
|
// pgCacheFetch(pPgCache, pgid);
|
||||||
// Need to allocate the first page as a description page
|
// // Need to allocate the first page as a description page
|
||||||
} else {
|
// } else {
|
||||||
// An existing file
|
// // An existing file
|
||||||
}
|
// }
|
||||||
|
|
||||||
/* TODO: other open operations */
|
// /* TODO: other open operations */
|
||||||
|
|
||||||
// add the page file to the environment
|
// // add the page file to the environment
|
||||||
tdbEnvRgstPageFile(pEnv, pPgFile);
|
// tdbEnvRgstPageFile(pEnv, pPgFile);
|
||||||
pPgFile->pEnv = pEnv;
|
// pPgFile->pEnv = pEnv;
|
||||||
|
|
||||||
*ppPgFile = pPgFile;
|
// *ppPgFile = pPgFile;
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int pgFileClose(SPgFile *pPgFile) {
|
// int pgFileClose(SPgFile *pPgFile) {
|
||||||
if (pPgFile) {
|
// if (pPgFile) {
|
||||||
if (pPgFile->fd >= 0) {
|
// if (pPgFile->fd >= 0) {
|
||||||
close(pPgFile->fd);
|
// close(pPgFile->fd);
|
||||||
}
|
// }
|
||||||
|
|
||||||
tfree(pPgFile->fname);
|
// tfree(pPgFile->fname);
|
||||||
free(pPgFile);
|
// free(pPgFile);
|
||||||
}
|
// }
|
||||||
|
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno) {
|
// SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno) {
|
||||||
SPgCache *pPgCache;
|
// SPgCache *pPgCache;
|
||||||
SPage * pPage;
|
// SPage * pPage;
|
||||||
pgid_t pgid;
|
// pgid_t pgid;
|
||||||
|
|
||||||
// 1. Fetch from the page cache
|
// // 1. Fetch from the page cache
|
||||||
// pgCacheFetch(pPgCache, pgid);
|
// // pgCacheFetch(pPgCache, pgid);
|
||||||
|
|
||||||
// 2. If only get a page frame, no content, maybe
|
// // 2. If only get a page frame, no content, maybe
|
||||||
// need to load from the file
|
// // need to load from the file
|
||||||
if (1 /*page not initialized*/) {
|
// if (1 /*page not initialized*/) {
|
||||||
if (pgno < pPgFile->fsize) {
|
// if (pgno < pPgFile->fsize) {
|
||||||
// load the page content from the disk
|
// // load the page content from the disk
|
||||||
// ?? How about the freed pages ??
|
// // ?? How about the freed pages ??
|
||||||
} else {
|
// } else {
|
||||||
// zero the page, make the page as a empty
|
// // zero the page, make the page as a empty
|
||||||
// page with zero records.
|
// // page with zero records.
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
#if 0
|
// #if 0
|
||||||
pPgCache = pPgFile->pPgCache;
|
// pPgCache = pPgFile->pPgCache;
|
||||||
pPage = NULL;
|
// pPage = NULL;
|
||||||
memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN);
|
// memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN);
|
||||||
pgid.pgno = pgno;
|
// pgid.pgno = pgno;
|
||||||
|
|
||||||
if (pgno > pPgFile->pgFileSize) {
|
// if (pgno > pPgFile->pgFileSize) {
|
||||||
// TODO
|
// // TODO
|
||||||
} else {
|
// } else {
|
||||||
pPage = pgCacheFetch(pPgCache, pgid);
|
// pPage = pgCacheFetch(pPgCache, pgid);
|
||||||
if (1 /*Page is cached, no need to load from file*/) {
|
// if (1 /*Page is cached, no need to load from file*/) {
|
||||||
return pPage;
|
// return pPage;
|
||||||
} else {
|
// } else {
|
||||||
// TODO: handle error
|
// // TODO: handle error
|
||||||
if (pgFileRead(pPgFile, pgno, (void *)pPage) < 0) {
|
// if (pgFileRead(pPgFile, pgno, (void *)pPage) < 0) {
|
||||||
// todoerr
|
// // todoerr
|
||||||
}
|
// }
|
||||||
return pPage;
|
// return pPage;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
return pPage;
|
// return pPage;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int pgFileRelease(SPage *pPage) {
|
// int pgFileRelease(SPage *pPage) {
|
||||||
pgCacheRelease(pPage);
|
// pgCacheRelease(pPage);
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int pgFileWrite(SPage *pPage) {
|
// int pgFileWrite(SPage *pPage) {
|
||||||
// TODO
|
// // TODO
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno) {
|
// int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno) {
|
||||||
SPgno pgno;
|
// SPgno pgno;
|
||||||
SPage1 * pPage1;
|
// SPage1 * pPage1;
|
||||||
SPgCache *pPgCache;
|
// SPgCache *pPgCache;
|
||||||
pgid_t pgid;
|
// pgid_t pgid;
|
||||||
SPage * pPage;
|
// SPage * pPage;
|
||||||
|
|
||||||
if (pPgFile->lsize == 0) {
|
// if (pPgFile->lsize == 0) {
|
||||||
pgno = ++(pPgFile->lsize);
|
// pgno = ++(pPgFile->lsize);
|
||||||
} else {
|
// } else {
|
||||||
if (0) {
|
// if (0) {
|
||||||
// TODO: allocate from the free list
|
// // TODO: allocate from the free list
|
||||||
pPage = pgCacheFetch(pPgCache, pgid);
|
// pPage = pgCacheFetch(pPgCache, pgid);
|
||||||
|
|
||||||
if (pPage1->nFree > 0) {
|
// if (pPage1->nFree > 0) {
|
||||||
// TODO
|
// // TODO
|
||||||
} else {
|
// } else {
|
||||||
pgno = ++(pPgFile->lsize);
|
// pgno = ++(pPgFile->lsize);
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
pgno = ++(pPgFile->lsize);
|
// pgno = ++(pPgFile->lsize);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
*pPgno = pgno;
|
// *pPgno = pgno;
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData) {
|
// static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData) {
|
||||||
pgsz_t pgSize;
|
// pgsz_t pgSize;
|
||||||
ssize_t rsize;
|
// ssize_t rsize;
|
||||||
uint8_t *pTData;
|
// uint8_t *pTData;
|
||||||
size_t szToRead;
|
// size_t szToRead;
|
||||||
|
|
||||||
#if 0
|
// #if 0
|
||||||
|
|
||||||
// pgSize = ; (TODO)
|
// // pgSize = ; (TODO)
|
||||||
pTData = pData;
|
// pTData = pData;
|
||||||
szToRead = pgSize;
|
// szToRead = pgSize;
|
||||||
for (; szToRead > 0;) {
|
// for (; szToRead > 0;) {
|
||||||
rsize = pread(pPgFile->fd, pTData, szToRead, pgno * pgSize);
|
// rsize = pread(pPgFile->fd, pTData, szToRead, pgno * pgSize);
|
||||||
if (rsize < 0) {
|
// if (rsize < 0) {
|
||||||
if (errno == EINTR) {
|
// if (errno == EINTR) {
|
||||||
continue;
|
// continue;
|
||||||
} else {
|
// } else {
|
||||||
return -1;
|
// return -1;
|
||||||
}
|
// }
|
||||||
} else if (rsize == 0) {
|
// } else if (rsize == 0) {
|
||||||
return -1;
|
// return -1;
|
||||||
}
|
// }
|
||||||
|
|
||||||
szToRead -= rsize;
|
// szToRead -= rsize;
|
||||||
pTData += rsize;
|
// pTData += rsize;
|
||||||
}
|
// }
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
|
@ -123,7 +123,7 @@ typedef TD_DLIST_NODE(SPgFile) SPgFileListNode;
|
||||||
|
|
||||||
#include "tdbPCache.h"
|
#include "tdbPCache.h"
|
||||||
|
|
||||||
// #include "tdbPFile.h"
|
#include "tdbPFile.h"
|
||||||
|
|
||||||
// #include "tdbEnv.h"
|
// #include "tdbEnv.h"
|
||||||
|
|
||||||
|
|
|
@ -20,37 +20,37 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct __attribute__((__packed__)) {
|
// typedef struct __attribute__((__packed__)) {
|
||||||
char hdrInfo[16]; // info string
|
// char hdrInfo[16]; // info string
|
||||||
pgsz_t szPage; // page size of current file
|
// pgsz_t szPage; // page size of current file
|
||||||
int32_t cno; // commit number counter
|
// int32_t cno; // commit number counter
|
||||||
SPgno freePgno; // freelist page number
|
// SPgno freePgno; // freelist page number
|
||||||
uint8_t resv[100]; // reserved space
|
// uint8_t resv[100]; // reserved space
|
||||||
} SPgFileHdr;
|
// } SPgFileHdr;
|
||||||
|
|
||||||
#define TDB_PG_FILE_HDR_SIZE 128
|
// #define TDB_PG_FILE_HDR_SIZE 128
|
||||||
|
|
||||||
TDB_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 {
|
||||||
TENV * pEnv; // env containing this page file
|
// TENV * pEnv; // env containing this page file
|
||||||
char * fname; // backend file name
|
// char * fname; // backend file name
|
||||||
uint8_t fileid[TDB_FILE_ID_LEN]; // file id
|
// uint8_t fileid[TDB_FILE_ID_LEN]; // file id
|
||||||
SPgno lsize; // page file logical size (for count)
|
// SPgno lsize; // page file logical size (for count)
|
||||||
SPgno fsize; // real file size on disk (for rollback)
|
// SPgno fsize; // real file size on disk (for rollback)
|
||||||
int fd;
|
// int fd;
|
||||||
SPgFileListNode envHash;
|
// SPgFileListNode envHash;
|
||||||
SPgFileListNode envPgfList;
|
// SPgFileListNode envPgfList;
|
||||||
};
|
// };
|
||||||
|
|
||||||
int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv);
|
// int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv);
|
||||||
int pgFileClose(SPgFile *pPgFile);
|
// int pgFileClose(SPgFile *pPgFile);
|
||||||
|
|
||||||
SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno);
|
// SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno);
|
||||||
int pgFileRelease(SPage *pPage);
|
// int pgFileRelease(SPage *pPage);
|
||||||
|
|
||||||
int pgFileWrite(SPage *pPage);
|
// int pgFileWrite(SPage *pPage);
|
||||||
int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno);
|
// int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue