more
This commit is contained in:
parent
708fef9af0
commit
aaab6de403
|
@ -30,6 +30,7 @@ struct SPCache {
|
||||||
};
|
};
|
||||||
|
|
||||||
#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);
|
||||||
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
|
||||||
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 */
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 @@
|
||||||
// #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
|
||||||
** + 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 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#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
|
||||||
|
|
Loading…
Reference in New Issue