1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Change pager_truncate() to a different method for extending files while

also ensuring that writes are page-size and page-aligned.

FossilOrigin-Name: 874bc8844f6494cdbf700bd884dee67d40f11fc0
This commit is contained in:
drh
2011-01-28 15:46:14 +00:00
parent fb3828c25f
commit bd1334dfd9
3 changed files with 25 additions and 14 deletions

View File

@@ -2477,20 +2477,21 @@ static int pager_truncate(Pager *pPager, Pgno nPage){
&& (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
){
i64 currentSize, newSize;
int szPage = pPager->pageSize;
assert( pPager->eLock==EXCLUSIVE_LOCK );
/* TODO: Is it safe to use Pager.dbFileSize here? */
rc = sqlite3OsFileSize(pPager->fd, &currentSize);
newSize = pPager->pageSize*(i64)nPage;
newSize = szPage*(i64)nPage;
if( rc==SQLITE_OK && currentSize!=newSize ){
if( currentSize>newSize ){
rc = sqlite3OsTruncate(pPager->fd, newSize);
}else{
char *pTmp = pPager->pTmpSpace;
memset(pTmp, 0, pPager->pageSize);
while( currentSize<newSize ){
rc = sqlite3OsWrite(pPager->fd, pTmp, pPager->pageSize, currentSize);
currentSize += pPager->pageSize;
}
memset(pTmp, 0, szPage);
testcase( (newSize-szPage) < currentSize );
testcase( (newSize-szPage) == currentSize );
testcase( (newSize-szPage) > currentSize );
rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage);
}
if( rc==SQLITE_OK ){
pPager->dbFileSize = nPage;