diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/os_unix.c | 6 | ||||
-rw-r--r-- | src/pager.c | 8 | ||||
-rw-r--r-- | src/sqlite.h.in | 8 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/os_unix.c b/src/os_unix.c index 928ee6355..ecdd261d2 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3045,6 +3045,12 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ *(int*)pArg = ((unixFile*)id)->lastErrno; return SQLITE_OK; } + case SQLITE_FCNTL_SIZE_HINT: { + sqlite3_int64 szFile = *(sqlite3_int64*)pArg; + unixFile *pFile = (unixFile*)id; + ftruncate(pFile->h, szFile); + return SQLITE_OK; + } #ifndef NDEBUG /* The pager calls this method to signal that it has done ** a rollback and that the database is therefore unchanged and diff --git a/src/pager.c b/src/pager.c index 42403c997..43ac8eb32 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3332,6 +3332,14 @@ static int pager_write_pagelist(PgHdr *pList){ rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags); } + /* Before the first write, give the VFS a hint of what the final + ** file size will be. + */ + if( pPager->dbSize > (pPager->dbOrigSize+1) && isOpen(pPager->fd) ){ + sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; + sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); + } + while( rc==SQLITE_OK && pList ){ Pgno pgno = pList->pgno; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 8676aeaa7..4c149a684 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -678,11 +678,19 @@ struct sqlite3_io_methods { ** into an integer that the pArg argument points to. This capability ** is used during testing and only needs to be supported when SQLITE_TEST ** is defined. +** +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. */ #define SQLITE_FCNTL_LOCKSTATE 1 #define SQLITE_GET_LOCKPROXYFILE 2 #define SQLITE_SET_LOCKPROXYFILE 3 #define SQLITE_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 /* ** CAPI3REF: Mutex Handle |