more TDB
This commit is contained in:
parent
938b3a41d5
commit
db2c31cfc4
|
@ -25,9 +25,7 @@ struct SPager {
|
||||||
SPCache *pCache;
|
SPCache *pCache;
|
||||||
SPgno dbFileSize;
|
SPgno dbFileSize;
|
||||||
SPgno dbOrigSize;
|
SPgno dbOrigSize;
|
||||||
int nDirty;
|
|
||||||
SPage *pDirty;
|
SPage *pDirty;
|
||||||
SPage *pDirtyTail;
|
|
||||||
u8 inTran;
|
u8 inTran;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -46,6 +44,8 @@ TDB_STATIC_ASSERT(sizeof(SFileHdr) == 128, "Size of file header is not correct")
|
||||||
static int tdbPagerReadPage(SPager *pPager, SPage *pPage);
|
static int tdbPagerReadPage(SPager *pPager, SPage *pPage);
|
||||||
static int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
|
static int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
|
||||||
static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage *, void *), void *arg);
|
static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage *, void *), void *arg);
|
||||||
|
static int tdbPagerWritePageToJournal(SPager *pPager, SPage *pPage);
|
||||||
|
static int tdbPagerWritePageToDB(SPager *pPager, SPage *pPage);
|
||||||
|
|
||||||
int tdbPagerOpen(SPCache *pCache, const char *fileName, SPager **ppPager) {
|
int tdbPagerOpen(SPCache *pCache, const char *fileName, SPager **ppPager) {
|
||||||
uint8_t *pPtr;
|
uint8_t *pPtr;
|
||||||
|
@ -140,14 +140,25 @@ int tdbPagerWrite(SPager *pPager, SPage *pPage) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pPage->isDirty == 0) {
|
if (pPage->isDirty) return 0;
|
||||||
pPage->isDirty = 1;
|
|
||||||
// TODO: add the page to the dirty list
|
|
||||||
|
|
||||||
// TODO: write the page to the journal
|
// Set page as dirty
|
||||||
if (1 /*actually load from the file*/) {
|
pPage->isDirty = 1;
|
||||||
|
|
||||||
|
// Add page to dirty list
|
||||||
|
// TODO: sort the list according to the page number
|
||||||
|
pPage->pDirtyNext = pPager->pDirty;
|
||||||
|
pPager->pDirty = pPage;
|
||||||
|
|
||||||
|
// Write page to journal
|
||||||
|
if (TDB_PAGE_PGNO(pPage) <= pPager->dbOrigSize) {
|
||||||
|
ret = tdbPagerWritePageToJournal(pPager, pPage);
|
||||||
|
if (ret < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +181,37 @@ int tdbPagerBegin(SPager *pPager) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbPagerCommit(SPager *pPager) {
|
int tdbPagerCommit(SPager *pPager) {
|
||||||
// TODO
|
SPage *pPage;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Begin commit
|
||||||
|
{
|
||||||
|
// TODO: Sync the journal file (Here or when write ?)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
pPage = pPager->pDirty;
|
||||||
|
|
||||||
|
if (pPage == NULL) break;
|
||||||
|
|
||||||
|
ret = tdbPagerWritePageToDB(pPager, pPage);
|
||||||
|
if (ret < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pPager->pDirty = pPage->pDirtyNext;
|
||||||
|
pPage->pDirtyNext = NULL;
|
||||||
|
|
||||||
|
// TODO: release the page
|
||||||
|
}
|
||||||
|
|
||||||
|
fsync(pPager->fd);
|
||||||
|
|
||||||
|
close(pPager->jfd);
|
||||||
|
remove(pPager->jFileName);
|
||||||
|
pPager->jfd = -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,9 +296,7 @@ int tdbPagerNewPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initPage
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tdbPagerReturnPage(SPager *pPager, SPage *pPage) {
|
void tdbPagerReturnPage(SPager *pPager, SPage *pPage) { tdbPCacheRelease(pPager->pCache, pPage); }
|
||||||
tdbPCacheRelease(pPager->pCache, pPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tdbPagerAllocFreePage(SPager *pPager, SPgno *ppgno) {
|
static int tdbPagerAllocFreePage(SPager *pPager, SPgno *ppgno) {
|
||||||
// TODO: Allocate a page from the free list
|
// TODO: Allocate a page from the free list
|
||||||
|
@ -330,3 +369,42 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------- Journal manipulation
|
||||||
|
static int tdbPagerWritePageToJournal(SPager *pPager, SPage *pPage) {
|
||||||
|
int ret;
|
||||||
|
SPgno pgno;
|
||||||
|
|
||||||
|
pgno = TDB_PAGE_PGNO(pPage);
|
||||||
|
|
||||||
|
ret = tdbWrite(pPager->jfd, &pgno, sizeof(pgno));
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = tdbWrite(pPager->jfd, pPage->pData, pPage->pageSize);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tdbPagerWritePageToDB(SPager *pPager, SPage *pPage) {
|
||||||
|
i64 offset;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
offset = pPage->pageSize * TDB_PAGE_PGNO(pPage);
|
||||||
|
if (lseek(pPager->fd, offset, SEEK_SET) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = tdbWrite(pPager->fd, pPage->pData, pPage->pageSize);
|
||||||
|
if (ret < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -90,3 +90,8 @@ int tdbPRead(int fd, void *pData, int count, i64 offset) {
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tdbWrite(int fd, void *pData, int count) {
|
||||||
|
// TODO
|
||||||
|
return write(fd, pData, count);
|
||||||
|
}
|
|
@ -38,6 +38,7 @@ int tdbCheckFileAccess(const char *pathname, int mode);
|
||||||
int tdbGetFileSize(const char *fname, int pgSize, SPgno *pSize);
|
int tdbGetFileSize(const char *fname, int pgSize, SPgno *pSize);
|
||||||
|
|
||||||
int tdbPRead(int fd, void *pData, int count, i64 offset);
|
int tdbPRead(int fd, void *pData, int count, i64 offset);
|
||||||
|
int tdbWrite(int fd, void *pData, int count);
|
||||||
|
|
||||||
#define TDB_REALLOC(PTR, SIZE) \
|
#define TDB_REALLOC(PTR, SIZE) \
|
||||||
({ \
|
({ \
|
||||||
|
|
Loading…
Reference in New Issue