diff options
author | drh <> | 2025-01-02 15:03:13 +0000 |
---|---|---|
committer | drh <> | 2025-01-02 15:03:13 +0000 |
commit | a683b055fbecd8a9e78602003bad558eb1a61420 (patch) | |
tree | 6c39531cb0dba051dfe3d9be71df5f193323070c /src | |
parent | e0b6ee51859720138fcaafd042eb605a2ecdeeb4 (diff) | |
download | sqlite-a683b055fbecd8a9e78602003bad558eb1a61420.tar.gz sqlite-a683b055fbecd8a9e78602003bad558eb1a61420.zip |
Improvements to the way that truncation is implemented in sqlite_dbpage().
FossilOrigin-Name: ac4bb2e4ecf0bdb0d8ac12b1ccb42d51af02f519a038cfc79faab5c216971056
Diffstat (limited to 'src')
-rw-r--r-- | src/dbpage.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/dbpage.c b/src/dbpage.c index 74f345570..e435dcfec 100644 --- a/src/dbpage.c +++ b/src/dbpage.c @@ -317,6 +317,24 @@ static int dbpageRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ return SQLITE_OK; } +/* +** Open write transactions. Since we do not know in advance which database +** files will be written by the sqlite_dbpage virtual table, start a write +** transaction on them all. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. +*/ +static int dbpageBeginTrans(DbpageTable *pTab){ + sqlite3 *db = pTab->db; + int rc = SQLITE_OK; + int i; + for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ) rc = sqlite3BtreeBeginTrans(pBt, 1, 0); + } + return rc; +} + static int dbpageUpdate( sqlite3_vtab *pVtab, int argc, @@ -384,6 +402,12 @@ static int dbpageUpdate( goto update_fail; } } + + if( dbpageBeginTrans(pTab)!=SQLITE_OK ){ + zErr = "failed to open transaction"; + goto update_fail; + } + pPager = sqlite3BtreePager(pBt); rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pDbPage, 0); if( rc==SQLITE_OK ){ @@ -405,18 +429,8 @@ update_fail: return SQLITE_ERROR; } -/* Since we do not know in advance which database files will be -** written by the sqlite_dbpage virtual table, start a write transaction -** on them all. -*/ static int dbpageBegin(sqlite3_vtab *pVtab){ DbpageTable *pTab = (DbpageTable *)pVtab; - sqlite3 *db = pTab->db; - int i; - for(i=0; i<db->nDb; i++){ - Btree *pBt = db->aDb[i].pBt; - if( pBt ) (void)sqlite3BtreeBeginTrans(pBt, 1, 0); - } pTab->pgnoTrunc = 0; return SQLITE_OK; } @@ -474,7 +488,7 @@ int sqlite3DbpageRegister(sqlite3 *db){ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - dbpageRollbackTo, /* xRollbackTo */ + 0/*dbpageRollbackTo*/, /* xRollbackTo */ 0, /* xShadowName */ 0 /* xIntegrity */ }; |