Skip to content

Commit d4e39ba

Browse files
committed
libsql-sqlite3: Optimize libsql_pager_has_codec() function
Cache the result of libsql_pager_has_codec() in Pager struct to avoid walking through all VFSes every time a page is read.
1 parent 7ea80c3 commit d4e39ba

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

libsql-ffi/bundled/SQLite3MultipleCiphers/src/sqlite3.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58152,6 +58152,7 @@ struct Pager {
5815258152
u8 readOnly; /* True for a read-only database */
5815358153
u8 memDb; /* True to inhibit all file I/O */
5815458154
u8 memVfs; /* VFS-implemented memory database */
58155+
u8 hasCodec; /* True if pager has encryption codec */
5815558156

5815658157
/**************************************************************************
5815758158
** The following block contains those class members that change during
@@ -58380,7 +58381,7 @@ static const unsigned char aJournalMagic[] = {
5838058381
SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
5838158382
if( pPager->fd->pMethods==0 ) return 0;
5838258383
if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0;
58383-
if( libsql_pager_has_codec(pPager) != 0 ) return 0;
58384+
if( pPager->hasCodec ) return 0;
5838458385
#ifndef SQLITE_OMIT_WAL
5838558386
if( pagerUseWal(pPager) ){
5838658387
u32 iRead = 0;
@@ -58603,7 +58604,7 @@ static void setGetterMethod(Pager *pPager){
5860358604
if( pPager->errCode ){
5860458605
pPager->xGet = getPageError;
5860558606
#if SQLITE_MAX_MMAP_SIZE>0
58606-
}else if( USEFETCH(pPager) && libsql_pager_has_codec(pPager) == 0 ){
58607+
}else if( USEFETCH(pPager) && !pPager->hasCodec ){
5860758608
pPager->xGet = getPageMMap;
5860858609
#endif /* SQLITE_MAX_MMAP_SIZE>0 */
5860958610
}else{
@@ -62625,6 +62626,8 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
6262562626
/* pPager->xBusyHandler = 0; */
6262662627
/* pPager->pBusyHandlerArg = 0; */
6262762628
pPager->xReiniter = xReinit;
62629+
/* Cache the codec check result to avoid expensive VFS stack traversal on every page read */
62630+
pPager->hasCodec = libsql_pager_has_codec(pPager);
6262862631
setGetterMethod(pPager);
6262962632
/* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
6263062633
/* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */

libsql-ffi/bundled/src/sqlite3.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58152,6 +58152,7 @@ struct Pager {
5815258152
u8 readOnly; /* True for a read-only database */
5815358153
u8 memDb; /* True to inhibit all file I/O */
5815458154
u8 memVfs; /* VFS-implemented memory database */
58155+
u8 hasCodec; /* True if pager has encryption codec */
5815558156

5815658157
/**************************************************************************
5815758158
** The following block contains those class members that change during
@@ -58380,7 +58381,7 @@ static const unsigned char aJournalMagic[] = {
5838058381
SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
5838158382
if( pPager->fd->pMethods==0 ) return 0;
5838258383
if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0;
58383-
if( libsql_pager_has_codec(pPager) != 0 ) return 0;
58384+
if( pPager->hasCodec ) return 0;
5838458385
#ifndef SQLITE_OMIT_WAL
5838558386
if( pagerUseWal(pPager) ){
5838658387
u32 iRead = 0;
@@ -58603,7 +58604,7 @@ static void setGetterMethod(Pager *pPager){
5860358604
if( pPager->errCode ){
5860458605
pPager->xGet = getPageError;
5860558606
#if SQLITE_MAX_MMAP_SIZE>0
58606-
}else if( USEFETCH(pPager) && libsql_pager_has_codec(pPager) == 0 ){
58607+
}else if( USEFETCH(pPager) && !pPager->hasCodec ){
5860758608
pPager->xGet = getPageMMap;
5860858609
#endif /* SQLITE_MAX_MMAP_SIZE>0 */
5860958610
}else{
@@ -62625,6 +62626,8 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
6262562626
/* pPager->xBusyHandler = 0; */
6262662627
/* pPager->pBusyHandlerArg = 0; */
6262762628
pPager->xReiniter = xReinit;
62629+
/* Cache the codec check result to avoid expensive VFS stack traversal on every page read */
62630+
pPager->hasCodec = libsql_pager_has_codec(pPager);
6262862631
setGetterMethod(pPager);
6262962632
/* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
6263062633
/* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */

libsql-sqlite3/src/pager.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ struct Pager {
630630
u8 readOnly; /* True for a read-only database */
631631
u8 memDb; /* True to inhibit all file I/O */
632632
u8 memVfs; /* VFS-implemented memory database */
633+
u8 hasCodec; /* True if pager has encryption codec */
633634

634635
/**************************************************************************
635636
** The following block contains those class members that change during
@@ -858,7 +859,7 @@ static const unsigned char aJournalMagic[] = {
858859
int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
859860
if( pPager->fd->pMethods==0 ) return 0;
860861
if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0;
861-
if( libsql_pager_has_codec(pPager) != 0 ) return 0;
862+
if( pPager->hasCodec ) return 0;
862863
#ifndef SQLITE_OMIT_WAL
863864
if( pagerUseWal(pPager) ){
864865
u32 iRead = 0;
@@ -1081,7 +1082,7 @@ static void setGetterMethod(Pager *pPager){
10811082
if( pPager->errCode ){
10821083
pPager->xGet = getPageError;
10831084
#if SQLITE_MAX_MMAP_SIZE>0
1084-
}else if( USEFETCH(pPager) && libsql_pager_has_codec(pPager) == 0 ){
1085+
}else if( USEFETCH(pPager) && !pPager->hasCodec ){
10851086
pPager->xGet = getPageMMap;
10861087
#endif /* SQLITE_MAX_MMAP_SIZE>0 */
10871088
}else{
@@ -5103,6 +5104,8 @@ int sqlite3PagerOpen(
51035104
/* pPager->xBusyHandler = 0; */
51045105
/* pPager->pBusyHandlerArg = 0; */
51055106
pPager->xReiniter = xReinit;
5107+
/* Cache the codec check result to avoid expensive VFS stack traversal on every page read */
5108+
pPager->hasCodec = libsql_pager_has_codec(pPager);
51065109
setGetterMethod(pPager);
51075110
/* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
51085111
/* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */

0 commit comments

Comments
 (0)