提交 aaab6de4 编写于 作者: H Hongze Cheng

more

上级 708fef9a
...@@ -29,7 +29,8 @@ struct SPCache { ...@@ -29,7 +29,8 @@ struct SPCache {
SPgHdr * pFree; SPgHdr * pFree;
}; };
#define PCACHE_PAGE_HASH(pgid) 0 // TODO #define PCACHE_PAGE_HASH(pgid) 0 // TODO
#define PAGE_IS_UNPINNED(pPage) true // TODO
static void tdbPCacheInitLock(SPCache *pCache); static void tdbPCacheInitLock(SPCache *pCache);
static void tdbPCacheClearLock(SPCache *pCache); static void tdbPCacheClearLock(SPCache *pCache);
...@@ -37,6 +38,7 @@ static void tdbPCacheLock(SPCache *pCache); ...@@ -37,6 +38,7 @@ static void tdbPCacheLock(SPCache *pCache);
static void tdbPCacheUnlock(SPCache *pCache); static void tdbPCacheUnlock(SPCache *pCache);
static bool tdbPCacheLocked(SPCache *pCache); static bool tdbPCacheLocked(SPCache *pCache);
static SPgHdr *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, bool alcNewPage); static SPgHdr *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, bool alcNewPage);
static void tdbPCachePinPage(SPgHdr *pPage);
int tdbOpenPCache(int pageSize, int cacheSize, int extraSize, SPCache **ppCache) { int tdbOpenPCache(int pageSize, int cacheSize, int extraSize, SPCache **ppCache) {
SPCache *pCache; SPCache *pCache;
...@@ -113,14 +115,16 @@ static SPgHdr *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, bool alcN ...@@ -113,14 +115,16 @@ static SPgHdr *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, bool alcN
pPage = pPage->pHashNext; pPage = pPage->pHashNext;
} }
if (pPage) { if (pPage || !alcNewPage) {
// TODO: pin the page and return the page if (pPage) tdbPCachePinPage(pPage);
return pPage;
} else if (!alcNewPage) {
return pPage; return pPage;
} }
// Try other methods
return pPage; return pPage;
}
static void tdbPCachePinPage(SPgHdr *pPage) {
if (PAGE_IS_UNPINNED(pPage)) {
/* TODO */
}
} }
\ No newline at end of file
...@@ -27,6 +27,7 @@ struct SPgHdr { ...@@ -27,6 +27,7 @@ struct SPgHdr {
void * pData; void * pData;
void * pExtra; void * pExtra;
SPgid pgid; SPgid pgid;
uint8_t isLocalPage;
SPgHdr *pFreeNext; SPgHdr *pFreeNext;
SPgHdr *pHashNext; SPgHdr *pHashNext;
}; };
......
...@@ -82,7 +82,6 @@ ...@@ -82,7 +82,6 @@
// #define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */ // #define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */
struct Pager { struct Pager {
sqlite3_vfs *pVfs; /* OS functions to use for IO */
u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */
u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */ u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */
u8 useJournal; /* Use a rollback journal on this file */ u8 useJournal; /* Use a rollback journal on this file */
...@@ -4099,86 +4098,85 @@ int sqlite3PagerOpen(Pager **ppPager, const char *zFilename, int nExtra, int fla ...@@ -4099,86 +4098,85 @@ int sqlite3PagerOpen(Pager **ppPager, const char *zFilename, int nExtra, int fla
** + The value returned by sqlite3OsSectorSize() ** + The value returned by sqlite3OsSectorSize()
** + The largest page size that can be written atomically. ** + The largest page size that can be written atomically.
*/ */
if (rc == SQLITE_OK) { // if (rc == SQLITE_OK) {
int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); // int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
if (!readOnly) { // if (!readOnly) {
setSectorSize(pPager); // setSectorSize(pPager);
assert(SQLITE_DEFAULT_PAGE_SIZE <= SQLITE_MAX_DEFAULT_PAGE_SIZE); // if (szPageDflt < pPager->sectorSize) {
if (szPageDflt < pPager->sectorSize) { // if (pPager->sectorSize > SQLITE_MAX_DEFAULT_PAGE_SIZE) {
if (pPager->sectorSize > SQLITE_MAX_DEFAULT_PAGE_SIZE) { // szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE;
szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE; // } else {
} else { // szPageDflt = (u32)pPager->sectorSize;
szPageDflt = (u32)pPager->sectorSize; // }
} // }
} // }
} // pPager->noLock = sqlite3_uri_boolean(pPager->zFilename, "nolock", 0);
pPager->noLock = sqlite3_uri_boolean(pPager->zFilename, "nolock", 0); // if ((iDc & SQLITE_IOCAP_IMMUTABLE) != 0 || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0)) {
if ((iDc & SQLITE_IOCAP_IMMUTABLE) != 0 || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0)) { // vfsFlags |= SQLITE_OPEN_READONLY;
vfsFlags |= SQLITE_OPEN_READONLY; // goto act_like_temp_file;
goto act_like_temp_file; // }
} // }
} // /* The following call to PagerSetPagesize() serves to set the value of
/* The following call to PagerSetPagesize() serves to set the value of // ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer.
** Pager.pageSize and to allocate the Pager.pTmpSpace buffer. // */
*/ // if (rc == SQLITE_OK) {
if (rc == SQLITE_OK) { // assert(pPager->memDb == 0);
assert(pPager->memDb == 0); // rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1);
rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); // testcase(rc != SQLITE_OK);
testcase(rc != SQLITE_OK); // }
}
/* Initialize the PCache object. */ // /* Initialize the PCache object. */
if (rc == SQLITE_OK) { // if (rc == SQLITE_OK) {
nExtra = ROUND8(nExtra); // nExtra = ROUND8(nExtra);
assert(nExtra >= 8 && nExtra < 1000); // assert(nExtra >= 8 && nExtra < 1000);
rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, !memDb ? pagerStress : 0, (void *)pPager, pPager->pPCache); // rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, !memDb ? pagerStress : 0, (void *)pPager, pPager->pPCache);
} // }
/* If an error occurred above, free the Pager structure and close the file. // /* If an error occurred above, free the Pager structure and close the file.
*/ // */
if (rc != SQLITE_OK) { // if (rc != SQLITE_OK) {
sqlite3OsClose(pPager->fd); // sqlite3OsClose(pPager->fd);
sqlite3PageFree(pPager->pTmpSpace); // sqlite3PageFree(pPager->pTmpSpace);
sqlite3_free(pPager); // sqlite3_free(pPager);
return rc; // return rc;
} // }
PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename)); // PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename));
IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) // IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename))
pPager->useJournal = (u8)useJournal; // pPager->useJournal = (u8)useJournal;
pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; // pPager->mxPgno = SQLITE_MAX_PAGE_COUNT;
pPager->tempFile = (u8)tempFile; // pPager->tempFile = (u8)tempFile;
assert(tempFile == PAGER_LOCKINGMODE_NORMAL || tempFile == PAGER_LOCKINGMODE_EXCLUSIVE); // assert(tempFile == PAGER_LOCKINGMODE_NORMAL || tempFile == PAGER_LOCKINGMODE_EXCLUSIVE);
assert(PAGER_LOCKINGMODE_EXCLUSIVE == 1); // assert(PAGER_LOCKINGMODE_EXCLUSIVE == 1);
pPager->exclusiveMode = (u8)tempFile; // pPager->exclusiveMode = (u8)tempFile;
pPager->changeCountDone = pPager->tempFile; // pPager->changeCountDone = pPager->tempFile;
pPager->memDb = (u8)memDb; // pPager->memDb = (u8)memDb;
pPager->readOnly = (u8)readOnly; // pPager->readOnly = (u8)readOnly;
assert(useJournal || pPager->tempFile); // assert(useJournal || pPager->tempFile);
pPager->noSync = pPager->tempFile; // pPager->noSync = pPager->tempFile;
if (pPager->noSync) { // if (pPager->noSync) {
assert(pPager->fullSync == 0); // assert(pPager->fullSync == 0);
assert(pPager->extraSync == 0); // assert(pPager->extraSync == 0);
assert(pPager->syncFlags == 0); // assert(pPager->syncFlags == 0);
assert(pPager->walSyncFlags == 0); // assert(pPager->walSyncFlags == 0);
} else { // } else {
pPager->fullSync = 1; // pPager->fullSync = 1;
pPager->extraSync = 0; // pPager->extraSync = 0;
pPager->syncFlags = SQLITE_SYNC_NORMAL; // pPager->syncFlags = SQLITE_SYNC_NORMAL;
pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL << 2); // pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL << 2);
} // }
pPager->nExtra = (u16)nExtra; // pPager->nExtra = (u16)nExtra;
pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT; // pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT;
assert(isOpen(pPager->fd) || tempFile); // assert(isOpen(pPager->fd) || tempFile);
setSectorSize(pPager); // setSectorSize(pPager);
if (!useJournal) { // if (!useJournal) {
pPager->journalMode = PAGER_JOURNALMODE_OFF; // pPager->journalMode = PAGER_JOURNALMODE_OFF;
} else if (memDb || memJM) { // } else if (memDb || memJM) {
pPager->journalMode = PAGER_JOURNALMODE_MEMORY; // pPager->journalMode = PAGER_JOURNALMODE_MEMORY;
} // }
pPager->xReiniter = xReinit; // pPager->xReiniter = xReinit;
setGetterMethod(pPager); // setGetterMethod(pPager);
*ppPager = pPager; *ppPager = pPager;
return SQLITE_OK; return SQLITE_OK;
......
...@@ -14,11 +14,14 @@ ...@@ -14,11 +14,14 @@
*/ */
#include <assert.h> #include <assert.h>
#include <fcntl.h>
#include <pthread.h> #include <pthread.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifndef SQLITEINT_H #ifndef SQLITEINT_H
#define SQLITEINT_H #define SQLITEINT_H
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册