aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2025-01-02 15:03:13 +0000
committerdrh <>2025-01-02 15:03:13 +0000
commita683b055fbecd8a9e78602003bad558eb1a61420 (patch)
tree6c39531cb0dba051dfe3d9be71df5f193323070c /src
parente0b6ee51859720138fcaafd042eb605a2ecdeeb4 (diff)
downloadsqlite-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.c36
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 */
};