Lines Matching refs:p

467 #define rbuIsVacuum(p) ((p)->zTarget==0)  argument
864 static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ in rbuObjIterNext() argument
865 int rc = p->rc; in rbuObjIterNext()
871 rc = sqlite3_exec(p->dbMain, in rbuObjIterNext()
876 , 0, 0, &p->zErrmsg in rbuObjIterNext()
886 rc = resetAndCollectError(pIter->pTblIter, &p->zErrmsg); in rbuObjIterNext()
901 rc = resetAndCollectError(pIter->pIdxIter, &p->zErrmsg); in rbuObjIterNext()
917 p->rc = rc; in rbuObjIterNext()
949 sqlite3rbu *p = sqlite3_user_data(pCtx); in rbuTargetNameFunc() local
955 if( rbuIsVacuum(p) ){ in rbuTargetNameFunc()
980 static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ in rbuObjIterFirst() argument
984 rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg, in rbuObjIterFirst()
991 , rbuIsVacuum(p) ? "AND rootpage!=0 AND rootpage IS NOT NULL" : "")); in rbuObjIterFirst()
994 rc = prepareAndCollectError(p->dbMain, &pIter->pIdxIter, &p->zErrmsg, in rbuObjIterFirst()
1002 p->rc = rc; in rbuObjIterFirst()
1003 return rbuObjIterNext(p, pIter); in rbuObjIterFirst()
1015 static char *rbuMPrintf(sqlite3rbu *p, const char *zFmt, ...){ in rbuMPrintf() argument
1020 if( p->rc==SQLITE_OK ){ in rbuMPrintf()
1021 if( zSql==0 ) p->rc = SQLITE_NOMEM; in rbuMPrintf()
1040 static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ in rbuMPrintfExec() argument
1045 if( p->rc==SQLITE_OK ){ in rbuMPrintfExec()
1047 p->rc = SQLITE_NOMEM; in rbuMPrintfExec()
1049 p->rc = sqlite3_exec(db, zSql, 0, 0, &p->zErrmsg); in rbuMPrintfExec()
1054 return p->rc; in rbuMPrintfExec()
1067 static void *rbuMalloc(sqlite3rbu *p, sqlite3_int64 nByte){ in rbuMalloc() argument
1069 if( p->rc==SQLITE_OK ){ in rbuMalloc()
1073 p->rc = SQLITE_NOMEM; in rbuMalloc()
1087 static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ in rbuAllocateIterArrays() argument
1091 azNew = (char**)rbuMalloc(p, nByte); in rbuAllocateIterArrays()
1137 static void rbuFinalize(sqlite3rbu *p, sqlite3_stmt *pStmt){ in rbuFinalize() argument
1140 if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){ in rbuFinalize()
1141 p->rc = rc; in rbuFinalize()
1142 p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); in rbuFinalize()
1186 sqlite3rbu *p, in rbuTableType() argument
1203 assert( p->rc==SQLITE_OK ); in rbuTableType()
1204 p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg, in rbuTableType()
1212 if( p->rc!=SQLITE_OK || sqlite3_step(aStmt[0])!=SQLITE_ROW ){ in rbuTableType()
1222 p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[1], &p->zErrmsg, in rbuTableType()
1225 if( p->rc ) goto rbuTableType_end; in rbuTableType()
1230 p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[2], &p->zErrmsg, in rbuTableType()
1234 if( p->rc==SQLITE_OK ){ in rbuTableType()
1246 p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[3], &p->zErrmsg, in rbuTableType()
1249 if( p->rc==SQLITE_OK ){ in rbuTableType()
1262 rbuFinalize(p, aStmt[i]); in rbuTableType()
1271 static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ in rbuObjIterCacheIndexedCols() argument
1275 if( p->rc==SQLITE_OK ){ in rbuObjIterCacheIndexedCols()
1277 p->rc = prepareFreeAndCollectError(p->dbMain, &pList, &p->zErrmsg, in rbuObjIterCacheIndexedCols()
1283 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pList) ){ in rbuObjIterCacheIndexedCols()
1291 p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, in rbuObjIterCacheIndexedCols()
1294 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ in rbuObjIterCacheIndexedCols()
1301 rbuFinalize(p, pXInfo); in rbuObjIterCacheIndexedCols()
1311 rbuFinalize(p, pList); in rbuObjIterCacheIndexedCols()
1325 static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ in rbuObjIterCacheTableInfo() argument
1336 rbuTableType(p, pIter->zTbl, &pIter->eType, &iTnum, &pIter->iPkTnum); in rbuObjIterCacheTableInfo()
1337 if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_NOTABLE ){ in rbuObjIterCacheTableInfo()
1338 p->rc = SQLITE_ERROR; in rbuObjIterCacheTableInfo()
1339 p->zErrmsg = sqlite3_mprintf("no such table: %s", pIter->zTbl); in rbuObjIterCacheTableInfo()
1341 if( p->rc ) return p->rc; in rbuObjIterCacheTableInfo()
1352 p->rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, in rbuObjIterCacheTableInfo()
1355 if( p->rc==SQLITE_OK ){ in rbuObjIterCacheTableInfo()
1357 rbuAllocateIterArrays(p, pIter, nCol); in rbuObjIterCacheTableInfo()
1359 for(i=0; p->rc==SQLITE_OK && i<nCol; i++){ in rbuObjIterCacheTableInfo()
1362 char *zCopy = rbuStrndup(zName, &p->rc); in rbuObjIterCacheTableInfo()
1373 if( p->rc==SQLITE_OK in rbuObjIterCacheTableInfo()
1374 && rbuIsVacuum(p)==0 in rbuObjIterCacheTableInfo()
1377 p->rc = SQLITE_ERROR; in rbuObjIterCacheTableInfo()
1378 p->zErrmsg = sqlite3_mprintf( in rbuObjIterCacheTableInfo()
1387 if( p->rc==SQLITE_OK ){ in rbuObjIterCacheTableInfo()
1388 p->rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, in rbuObjIterCacheTableInfo()
1392 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ in rbuObjIterCacheTableInfo()
1399 p->rc = SQLITE_ERROR; in rbuObjIterCacheTableInfo()
1400 p->zErrmsg = sqlite3_mprintf("column missing from %q: %s", in rbuObjIterCacheTableInfo()
1413 pIter->azTblType[iOrder] = rbuStrndup(zType, &p->rc); in rbuObjIterCacheTableInfo()
1421 rbuFinalize(p, pStmt); in rbuObjIterCacheTableInfo()
1422 rbuObjIterCacheIndexedCols(p, pIter); in rbuObjIterCacheTableInfo()
1427 return p->rc; in rbuObjIterCacheTableInfo()
1436 sqlite3rbu *p, /* RBU object */ in rbuObjIterGetCollist() argument
1444 zList = rbuMPrintf(p, "%z%s\"%w\"", zList, zSep, z); in rbuObjIterGetCollist()
1457 sqlite3rbu *p, /* RBU object */ in rbuObjIterGetPkList() argument
1471 zRet = rbuMPrintf(p, "%z%s%s\"%w\"%s", zRet, zSep, zPre, zCol, zPost); in rbuObjIterGetPkList()
1502 sqlite3rbu *p, /* RBU handle */ in rbuVacuumTableStart() argument
1510 p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, in rbuVacuumTableStart()
1515 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ in rbuVacuumTableStart()
1517 zRet = rbuMPrintf(p, " WHERE _rowid_ > %lld ", iMax); in rbuVacuumTableStart()
1519 rbuFinalize(p, pMax); in rbuVacuumTableStart()
1521 char *zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", " DESC"); in rbuVacuumTableStart()
1522 char *zSelect = rbuObjIterGetPkList(p, pIter, "quote(", "||','||", ")"); in rbuVacuumTableStart()
1523 char *zList = rbuObjIterGetPkList(p, pIter, "", ", ", ""); in rbuVacuumTableStart()
1525 if( p->rc==SQLITE_OK ){ in rbuVacuumTableStart()
1526 p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, in rbuVacuumTableStart()
1532 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ in rbuVacuumTableStart()
1534 zRet = rbuMPrintf(p, " WHERE (%s) > (%s) ", zList, zVal); in rbuVacuumTableStart()
1536 rbuFinalize(p, pMax); in rbuVacuumTableStart()
1569 sqlite3rbu *p, /* RBU handle */ in rbuVacuumIndexStart() argument
1582 p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, in rbuVacuumIndexStart()
1585 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ in rbuVacuumIndexStart()
1607 zLhs = rbuMPrintf(p, "%z%s \"%w\" COLLATE %Q", in rbuVacuumIndexStart()
1610 zOrder = rbuMPrintf(p, "%z%s \"rbu_imp_%d%w\" COLLATE %Q DESC", in rbuVacuumIndexStart()
1613 zSelect = rbuMPrintf(p, "%z%s quote(\"rbu_imp_%d%w\")", in rbuVacuumIndexStart()
1619 rbuFinalize(p, pXInfo); in rbuVacuumIndexStart()
1622 if( p->rc==SQLITE_OK ){ in rbuVacuumIndexStart()
1625 p->rc = prepareFreeAndCollectError(p->dbMain, &pSel, &p->zErrmsg, in rbuVacuumIndexStart()
1630 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSel) ){ in rbuVacuumIndexStart()
1635 p->rc = SQLITE_NOMEM; in rbuVacuumIndexStart()
1640 zVector = rbuMPrintf(p, "%z%s%s", zVector, zSep, zQuoted); in rbuVacuumIndexStart()
1645 zRet = rbuMPrintf(p, "(%s) > (%s)", zLhs, zVector); in rbuVacuumIndexStart()
1648 rbuFinalize(p, pSel); in rbuVacuumIndexStart()
1684 sqlite3rbu *p, /* RBU object */ in rbuObjIterGetIndexCols() argument
1691 int rc = p->rc; /* Error code */ in rbuObjIterGetIndexCols()
1703 assert( p->zErrmsg==0 ); in rbuObjIterGetIndexCols()
1704 rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, in rbuObjIterGetIndexCols()
1731 }else if( rbuIsVacuum(p) ){ in rbuObjIterGetIndexCols()
1774 p->rc = rc; in rbuObjIterGetIndexCols()
1796 sqlite3rbu *p, in rbuObjIterGetOldlist() argument
1801 if( p->rc==SQLITE_OK && pIter->abIndexed ){ in rbuObjIterGetOldlist()
1813 p->rc = SQLITE_NOMEM; in rbuObjIterGetOldlist()
1820 zList = rbuMPrintf(p, "%z, %s._rowid_", zList, zObj); in rbuObjIterGetOldlist()
1837 sqlite3rbu *p, in rbuObjIterGetWhere() argument
1842 zList = rbuMPrintf(p, "_rowid_ = ?%d", pIter->nTblCol+1); in rbuObjIterGetWhere()
1848 zList = rbuMPrintf(p, "%z%sc%d=?%d", zList, zSep, i, i+1); in rbuObjIterGetWhere()
1852 zList = rbuMPrintf(p, in rbuObjIterGetWhere()
1862 zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", zList, zSep, zCol, i+1); in rbuObjIterGetWhere()
1877 static void rbuBadControlError(sqlite3rbu *p){ in rbuBadControlError() argument
1878 p->rc = SQLITE_ERROR; in rbuBadControlError()
1879 p->zErrmsg = sqlite3_mprintf("invalid rbu_control value"); in rbuBadControlError()
1901 sqlite3rbu *p, in rbuObjIterGetSetlist() argument
1906 if( p->rc==SQLITE_OK ){ in rbuObjIterGetSetlist()
1910 rbuBadControlError(p); in rbuObjIterGetSetlist()
1916 zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", in rbuObjIterGetSetlist()
1922 zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_delta(\"%w\", ?%d)", in rbuObjIterGetSetlist()
1928 zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)", in rbuObjIterGetSetlist()
1954 static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ in rbuObjIterGetBindlist() argument
1958 zRet = (char*)rbuMalloc(p, nByte); in rbuObjIterGetBindlist()
1981 static char *rbuWithoutRowidPK(sqlite3rbu *p, RbuObjIter *pIter){ in rbuWithoutRowidPK() argument
1984 if( p->rc==SQLITE_OK ){ in rbuWithoutRowidPK()
1989 p->rc = prepareFreeAndCollectError(p->dbMain, &pXList, &p->zErrmsg, in rbuWithoutRowidPK()
1992 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXList) ){ in rbuWithoutRowidPK()
1997 p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, in rbuWithoutRowidPK()
2004 rbuFinalize(p, pXList); in rbuWithoutRowidPK()
2006 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ in rbuWithoutRowidPK()
2011 z = rbuMPrintf(p, "%z%s\"%w\"%s", z, zSep, zCol, zDesc); in rbuWithoutRowidPK()
2015 z = rbuMPrintf(p, "%z)", z); in rbuWithoutRowidPK()
2016 rbuFinalize(p, pXInfo); in rbuWithoutRowidPK()
2040 static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ in rbuCreateImposterTable2() argument
2041 if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_EXTERNAL ){ in rbuCreateImposterTable2()
2053 p->rc = prepareAndCollectError(p->dbMain, &pQuery, &p->zErrmsg, in rbuCreateImposterTable2()
2056 if( p->rc==SQLITE_OK ){ in rbuCreateImposterTable2()
2063 p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, in rbuCreateImposterTable2()
2067 rbuFinalize(p, pQuery); in rbuCreateImposterTable2()
2069 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ in rbuCreateImposterTable2()
2075 zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma, in rbuCreateImposterTable2()
2078 zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":""); in rbuCreateImposterTable2()
2082 zCols = rbuMPrintf(p, "%z, id INTEGER", zCols); in rbuCreateImposterTable2()
2083 rbuFinalize(p, pXInfo); in rbuCreateImposterTable2()
2085 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); in rbuCreateImposterTable2()
2086 rbuMPrintfExec(p, p->dbMain, in rbuCreateImposterTable2()
2090 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); in rbuCreateImposterTable2()
2114 static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ in rbuCreateImposterTable() argument
2115 if( p->rc==SQLITE_OK && pIter->eType!=RBU_PK_VTAB ){ in rbuCreateImposterTable()
2120 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); in rbuCreateImposterTable()
2122 for(iCol=0; p->rc==SQLITE_OK && iCol<pIter->nTblCol; iCol++){ in rbuCreateImposterTable()
2127 p->rc = sqlite3_table_column_metadata( in rbuCreateImposterTable()
2128 p->dbMain, "main", pIter->zTbl, zCol, 0, &zColl, 0, 0, 0 in rbuCreateImposterTable()
2136 zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s", in rbuCreateImposterTable()
2144 char *zPk = rbuWithoutRowidPK(p, pIter); in rbuCreateImposterTable()
2146 zSql = rbuMPrintf(p, "%z, %z", zSql, zPk); in rbuCreateImposterTable()
2150 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); in rbuCreateImposterTable()
2151 rbuMPrintfExec(p, p->dbMain, "CREATE TABLE \"rbu_imp_%w\"(%z)%s", in rbuCreateImposterTable()
2155 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); in rbuCreateImposterTable()
2171 sqlite3rbu *p, in rbuObjIterPrepareTmpInsert() argument
2177 char *zBind = rbuObjIterGetBindlist(p, pIter->nTblCol + 1 + bRbuRowid); in rbuObjIterPrepareTmpInsert()
2180 p->rc = prepareFreeAndCollectError( in rbuObjIterPrepareTmpInsert()
2181 p->dbRbu, &pIter->pTmpInsert, &p->zErrmsg, sqlite3_mprintf( in rbuObjIterPrepareTmpInsert()
2183 p->zStateDb, pIter->zDataTbl, zCollist, zRbuRowid, zBind in rbuObjIterPrepareTmpInsert()
2193 sqlite3rbu *p = sqlite3_user_data(pCtx); in rbuTmpInsertFunc() local
2198 || p->objiter.eType==RBU_PK_EXTERNAL in rbuTmpInsertFunc()
2199 || p->objiter.eType==RBU_PK_NONE in rbuTmpInsertFunc()
2202 p->nPhaseOneStep += p->objiter.nIndex; in rbuTmpInsertFunc()
2206 rc = sqlite3_bind_value(p->objiter.pTmpInsert, i+1, apVal[i]); in rbuTmpInsertFunc()
2209 sqlite3_step(p->objiter.pTmpInsert); in rbuTmpInsertFunc()
2210 rc = sqlite3_reset(p->objiter.pTmpInsert); in rbuTmpInsertFunc()
2218 static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ in rbuObjIterGetIndexWhere() argument
2220 int rc = p->rc; in rbuObjIterGetIndexWhere()
2226 rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, in rbuObjIterGetIndexWhere()
2309 p->rc = rc; in rbuObjIterGetIndexWhere()
2319 sqlite3rbu *p, in rbuObjIterPrepareAll() argument
2324 if( pIter->pSelect==0 && rbuObjIterCacheTableInfo(p, pIter)==SQLITE_OK ){ in rbuObjIterPrepareAll()
2327 char **pz = &p->zErrmsg; in rbuObjIterPrepareAll()
2333 if( !zLimit ) p->rc = SQLITE_NOMEM; in rbuObjIterPrepareAll()
2346 zPart = rbuObjIterGetIndexWhere(p, pIter); in rbuObjIterPrepareAll()
2348 p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind in rbuObjIterPrepareAll()
2350 zBind = rbuObjIterGetBindlist(p, nBind); in rbuObjIterPrepareAll()
2353 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); in rbuObjIterPrepareAll()
2354 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1,tnum); in rbuObjIterPrepareAll()
2355 rbuMPrintfExec(p, p->dbMain, in rbuObjIterPrepareAll()
2359 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); in rbuObjIterPrepareAll()
2363 if( p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2364 p->rc = prepareFreeAndCollectError( in rbuObjIterPrepareAll()
2365 p->dbMain, &pIter->pInsert, &p->zErrmsg, in rbuObjIterPrepareAll()
2371 if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2372 p->rc = prepareFreeAndCollectError( in rbuObjIterPrepareAll()
2373 p->dbMain, &pIter->pDelete, &p->zErrmsg, in rbuObjIterPrepareAll()
2379 if( p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2381 if( rbuIsVacuum(p) ){ in rbuObjIterPrepareAll()
2384 zStart = rbuVacuumIndexStart(p, pIter); in rbuObjIterPrepareAll()
2405 zCollist, p->zStateDb, pIter->zDataTbl, in rbuObjIterPrepareAll()
2415 zCollist, p->zStateDb, pIter->zDataTbl, zPart, in rbuObjIterPrepareAll()
2422 if( p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2423 p->rc = prepareFreeAndCollectError(p->dbRbu,&pIter->pSelect,pz,zSql); in rbuObjIterPrepareAll()
2437 ||(pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)); in rbuObjIterPrepareAll()
2441 char *zBindings = rbuObjIterGetBindlist(p, pIter->nTblCol + bRbuRowid); in rbuObjIterPrepareAll()
2442 char *zWhere = rbuObjIterGetWhere(p, pIter); in rbuObjIterPrepareAll()
2443 char *zOldlist = rbuObjIterGetOldlist(p, pIter, "old"); in rbuObjIterPrepareAll()
2444 char *zNewlist = rbuObjIterGetOldlist(p, pIter, "new"); in rbuObjIterPrepareAll()
2446 zCollist = rbuObjIterGetCollist(p, pIter); in rbuObjIterPrepareAll()
2450 rbuCreateImposterTable(p, pIter); in rbuObjIterPrepareAll()
2451 rbuCreateImposterTable2(p, pIter); in rbuObjIterPrepareAll()
2455 if( p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2456 p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pInsert, pz, in rbuObjIterPrepareAll()
2467 if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2468 p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pDelete, pz, in rbuObjIterPrepareAll()
2475 if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ in rbuObjIterPrepareAll()
2482 rbuMPrintfExec(p, p->dbRbu, in rbuObjIterPrepareAll()
2485 , p->zStateDb, pIter->zDataTbl in rbuObjIterPrepareAll()
2490 rbuMPrintfExec(p, p->dbMain, in rbuObjIterPrepareAll()
2511 rbuMPrintfExec(p, p->dbMain, in rbuObjIterPrepareAll()
2520 rbuObjIterPrepareTmpInsert(p, pIter, zCollist, zRbuRowid); in rbuObjIterPrepareAll()
2524 if( p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2529 zRbuRowid = rbuIsVacuum(p) ? ",_rowid_ " : ",rbu_rowid"; in rbuObjIterPrepareAll()
2532 if( rbuIsVacuum(p) ){ in rbuObjIterPrepareAll()
2534 zStart = rbuVacuumTableStart(p, pIter, bRbuRowid, zWrite); in rbuObjIterPrepareAll()
2541 zOrder = rbuMPrintf(p, "_rowid_"); in rbuObjIterPrepareAll()
2543 zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", ""); in rbuObjIterPrepareAll()
2547 if( p->rc==SQLITE_OK ){ in rbuObjIterPrepareAll()
2548 p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, in rbuObjIterPrepareAll()
2552 (rbuIsVacuum(p) ? "0 AS " : ""), in rbuObjIterPrepareAll()
2573 return p->rc; in rbuObjIterPrepareAll()
2586 sqlite3rbu *p, /* RBU handle */ in rbuGetUpdateStmt() argument
2621 pUp = (RbuUpdateStmt*)rbuMalloc(p, sizeof(RbuUpdateStmt)+pIter->nTblCol+1); in rbuGetUpdateStmt()
2625 char *zWhere = rbuObjIterGetWhere(p, pIter); in rbuGetUpdateStmt()
2626 char *zSet = rbuObjIterGetSetlist(p, pIter, zMask); in rbuGetUpdateStmt()
2641 p->rc = prepareFreeAndCollectError( in rbuGetUpdateStmt()
2642 p->dbMain, &pUp->pUpdate, &p->zErrmsg, zUpdate in rbuGetUpdateStmt()
2650 return p->rc; in rbuGetUpdateStmt()
2654 sqlite3rbu *p, in rbuOpenDbhandle() argument
2659 if( p->rc==SQLITE_OK ){ in rbuOpenDbhandle()
2661 p->rc = sqlite3_open_v2(zName, &db, flags, bUseVfs ? p->zVfsName : 0); in rbuOpenDbhandle()
2662 if( p->rc ){ in rbuOpenDbhandle()
2663 p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); in rbuOpenDbhandle()
2674 static void rbuFreeState(RbuState *p){ in rbuFreeState() argument
2675 if( p ){ in rbuFreeState()
2676 sqlite3_free(p->zTbl); in rbuFreeState()
2677 sqlite3_free(p->zDataTbl); in rbuFreeState()
2678 sqlite3_free(p->zIdx); in rbuFreeState()
2679 sqlite3_free(p); in rbuFreeState()
2692 static RbuState *rbuLoadState(sqlite3rbu *p){ in rbuLoadState() argument
2698 pRet = (RbuState*)rbuMalloc(p, sizeof(RbuState)); in rbuLoadState()
2701 rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, in rbuLoadState()
2702 sqlite3_mprintf("SELECT k, v FROM %s.rbu_state", p->zStateDb) in rbuLoadState()
2712 p->rc = SQLITE_CORRUPT; in rbuLoadState()
2760 p->rc = rc; in rbuLoadState()
2773 static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){ in rbuOpenDatabase() argument
2774 assert( p->rc || (p->dbMain==0 && p->dbRbu==0) ); in rbuOpenDatabase()
2775 assert( p->rc || rbuIsVacuum(p) || p->zTarget!=0 ); in rbuOpenDatabase()
2776 assert( dbMain==0 || rbuIsVacuum(p)==0 ); in rbuOpenDatabase()
2779 p->dbRbu = rbuOpenDbhandle(p, p->zRbu, 1); in rbuOpenDatabase()
2780 p->dbMain = dbMain; in rbuOpenDatabase()
2782 if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ in rbuOpenDatabase()
2783 sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); in rbuOpenDatabase()
2784 if( p->zState==0 ){ in rbuOpenDatabase()
2785 const char *zFile = sqlite3_db_filename(p->dbRbu, "main"); in rbuOpenDatabase()
2786 p->zState = rbuMPrintf(p, "file:///%s-vacuum?modeof=%s", zFile, zFile); in rbuOpenDatabase()
2792 if( p->zState ){ in rbuOpenDatabase()
2793 rbuMPrintfExec(p, p->dbRbu, "ATTACH %Q AS stat", p->zState); in rbuOpenDatabase()
2794 memcpy(p->zStateDb, "stat", 4); in rbuOpenDatabase()
2796 memcpy(p->zStateDb, "main", 4); in rbuOpenDatabase()
2800 if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ in rbuOpenDatabase()
2801 p->rc = sqlite3_exec(p->dbRbu, "BEGIN", 0, 0, 0); in rbuOpenDatabase()
2806 rbuMPrintfExec(p, p->dbRbu, RBU_CREATE_STATE, p->zStateDb); in rbuOpenDatabase()
2809 if( rbuIsVacuum(p) ){ in rbuOpenDatabase()
2810 if( p->rc==SQLITE_OK ){ in rbuOpenDatabase()
2814 p->rc = prepareAndCollectError(p->dbRbu, &pCnt, &p->zErrmsg, in rbuOpenDatabase()
2817 if( p->rc==SQLITE_OK in rbuOpenDatabase()
2824 if( p->rc==SQLITE_OK ) p->rc = rc2; in rbuOpenDatabase()
2826 if( p->rc==SQLITE_OK && bOk==0 ){ in rbuOpenDatabase()
2827 p->rc = SQLITE_ERROR; in rbuOpenDatabase()
2828 p->zErrmsg = sqlite3_mprintf("invalid state database"); in rbuOpenDatabase()
2831 if( p->rc==SQLITE_OK ){ in rbuOpenDatabase()
2832 p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); in rbuOpenDatabase()
2838 if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ in rbuOpenDatabase()
2841 p->nRbu = 0; in rbuOpenDatabase()
2842 p->pRbuFd = 0; in rbuOpenDatabase()
2843 rc = sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); in rbuOpenDatabase()
2844 if( rc!=SQLITE_NOTFOUND ) p->rc = rc; in rbuOpenDatabase()
2845 if( p->eStage>=RBU_STAGE_MOVE ){ in rbuOpenDatabase()
2848 RbuState *pState = rbuLoadState(p); in rbuOpenDatabase()
2854 if( bOpen ) p->dbMain = rbuOpenDbhandle(p, p->zRbu, p->nRbu<=1); in rbuOpenDatabase()
2857 p->eStage = 0; in rbuOpenDatabase()
2858 if( p->rc==SQLITE_OK && p->dbMain==0 ){ in rbuOpenDatabase()
2859 if( !rbuIsVacuum(p) ){ in rbuOpenDatabase()
2860 p->dbMain = rbuOpenDbhandle(p, p->zTarget, 1); in rbuOpenDatabase()
2861 }else if( p->pRbuFd->pWalFd ){ in rbuOpenDatabase()
2863 p->pRbuFd->bNolock = 0; in rbuOpenDatabase()
2864 sqlite3_close(p->dbRbu); in rbuOpenDatabase()
2865 sqlite3_close(p->dbMain); in rbuOpenDatabase()
2866 p->dbMain = 0; in rbuOpenDatabase()
2867 p->dbRbu = 0; in rbuOpenDatabase()
2871 p->rc = SQLITE_ERROR; in rbuOpenDatabase()
2872 p->zErrmsg = sqlite3_mprintf("cannot vacuum wal mode database"); in rbuOpenDatabase()
2876 if( strlen(p->zRbu)>=5 && 0==memcmp("file:", p->zRbu, 5) ){ in rbuOpenDatabase()
2877 zExtra = &p->zRbu[5]; in rbuOpenDatabase()
2885 sqlite3_db_filename(p->dbRbu, "main"), in rbuOpenDatabase()
2890 p->rc = SQLITE_NOMEM; in rbuOpenDatabase()
2893 p->dbMain = rbuOpenDbhandle(p, zTarget, p->nRbu<=1); in rbuOpenDatabase()
2898 if( p->rc==SQLITE_OK ){ in rbuOpenDatabase()
2899 p->rc = sqlite3_create_function(p->dbMain, in rbuOpenDatabase()
2900 "rbu_tmp_insert", -1, SQLITE_UTF8, (void*)p, rbuTmpInsertFunc, 0, 0 in rbuOpenDatabase()
2904 if( p->rc==SQLITE_OK ){ in rbuOpenDatabase()
2905 p->rc = sqlite3_create_function(p->dbMain, in rbuOpenDatabase()
2910 if( p->rc==SQLITE_OK ){ in rbuOpenDatabase()
2911 p->rc = sqlite3_create_function(p->dbRbu, in rbuOpenDatabase()
2912 "rbu_target_name", -1, SQLITE_UTF8, (void*)p, rbuTargetNameFunc, 0, 0 in rbuOpenDatabase()
2916 if( p->rc==SQLITE_OK ){ in rbuOpenDatabase()
2917 p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); in rbuOpenDatabase()
2919 rbuMPrintfExec(p, p->dbMain, "SELECT * FROM sqlite_schema"); in rbuOpenDatabase()
2924 if( p->rc==SQLITE_OK ){ in rbuOpenDatabase()
2925 p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); in rbuOpenDatabase()
2928 if( p->rc==SQLITE_NOTFOUND ){ in rbuOpenDatabase()
2929 p->rc = SQLITE_ERROR; in rbuOpenDatabase()
2930 p->zErrmsg = sqlite3_mprintf("rbu vfs not found"); in rbuOpenDatabase()
2975 static i64 rbuShmChecksum(sqlite3rbu *p){ in rbuShmChecksum() argument
2977 if( p->rc==SQLITE_OK ){ in rbuShmChecksum()
2978 sqlite3_file *pDb = p->pTargetFd->pReal; in rbuShmChecksum()
2980 p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, (void volatile**)&ptr); in rbuShmChecksum()
2981 if( p->rc==SQLITE_OK ){ in rbuShmChecksum()
3004 static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ in rbuSetupCheckpoint() argument
3010 p->eStage = 0; in rbuSetupCheckpoint()
3011 if( p->rc==SQLITE_OK ){ in rbuSetupCheckpoint()
3012 p->rc = sqlite3_exec(p->dbMain, "SELECT * FROM sqlite_schema", 0, 0, 0); in rbuSetupCheckpoint()
3044 if( p->rc==SQLITE_OK ){ in rbuSetupCheckpoint()
3046 p->eStage = RBU_STAGE_CAPTURE; in rbuSetupCheckpoint()
3047 rc2 = sqlite3_exec(p->dbMain, "PRAGMA main.wal_checkpoint=restart", 0, 0,0); in rbuSetupCheckpoint()
3048 if( rc2!=SQLITE_INTERNAL ) p->rc = rc2; in rbuSetupCheckpoint()
3051 if( p->rc==SQLITE_OK && p->nFrame>0 ){ in rbuSetupCheckpoint()
3052 p->eStage = RBU_STAGE_CKPT; in rbuSetupCheckpoint()
3053 p->nStep = (pState ? pState->nRow : 0); in rbuSetupCheckpoint()
3054 p->aBuf = rbuMalloc(p, p->pgsz); in rbuSetupCheckpoint()
3055 p->iWalCksum = rbuShmChecksum(p); in rbuSetupCheckpoint()
3058 if( p->rc==SQLITE_OK ){ in rbuSetupCheckpoint()
3059 if( p->nFrame==0 || (pState && pState->iWalCksum!=p->iWalCksum) ){ in rbuSetupCheckpoint()
3060 p->rc = SQLITE_DONE; in rbuSetupCheckpoint()
3061 p->eStage = RBU_STAGE_DONE; in rbuSetupCheckpoint()
3064 sqlite3_file *pDb = p->pTargetFd->pReal; in rbuSetupCheckpoint()
3065 sqlite3_file *pWal = p->pTargetFd->pWalFd->pReal; in rbuSetupCheckpoint()
3066 assert( p->nPagePerSector==0 ); in rbuSetupCheckpoint()
3068 if( nSectorSize>p->pgsz ){ in rbuSetupCheckpoint()
3069 p->nPagePerSector = nSectorSize / p->pgsz; in rbuSetupCheckpoint()
3071 p->nPagePerSector = 1; in rbuSetupCheckpoint()
3078 p->rc = pWal->pMethods->xSync(pWal, SQLITE_SYNC_NORMAL); in rbuSetupCheckpoint()
3130 static void rbuCheckpointFrame(sqlite3rbu *p, RbuFrame *pFrame){ in rbuCheckpointFrame() argument
3131 sqlite3_file *pWal = p->pTargetFd->pWalFd->pReal; in rbuCheckpointFrame()
3132 sqlite3_file *pDb = p->pTargetFd->pReal; in rbuCheckpointFrame()
3135 assert( p->rc==SQLITE_OK ); in rbuCheckpointFrame()
3136 iOff = (i64)(pFrame->iWalFrame-1) * (p->pgsz + 24) + 32 + 24; in rbuCheckpointFrame()
3137 p->rc = pWal->pMethods->xRead(pWal, p->aBuf, p->pgsz, iOff); in rbuCheckpointFrame()
3138 if( p->rc ) return; in rbuCheckpointFrame()
3140 iOff = (i64)(pFrame->iDbPage-1) * p->pgsz; in rbuCheckpointFrame()
3141 p->rc = pDb->pMethods->xWrite(pDb, p->aBuf, p->pgsz, iOff); in rbuCheckpointFrame()
3204 static void rbuMoveOalFile(sqlite3rbu *p){ in rbuMoveOalFile() argument
3205 const char *zBase = sqlite3_db_filename(p->dbMain, "main"); in rbuMoveOalFile()
3210 if( rbuIsVacuum(p) ){ in rbuMoveOalFile()
3211 zMove = sqlite3_db_filename(p->dbRbu, "main"); in rbuMoveOalFile()
3216 assert( p->eStage==RBU_STAGE_MOVE ); in rbuMoveOalFile()
3217 assert( p->rc==SQLITE_OK && p->zErrmsg==0 ); in rbuMoveOalFile()
3219 p->rc = SQLITE_NOMEM; in rbuMoveOalFile()
3233 rbuObjIterFinalize(&p->objiter); in rbuMoveOalFile()
3234 sqlite3_close(p->dbRbu); in rbuMoveOalFile()
3235 sqlite3_close(p->dbMain); in rbuMoveOalFile()
3236 p->dbMain = 0; in rbuMoveOalFile()
3237 p->dbRbu = 0; in rbuMoveOalFile()
3239 dbMain = rbuOpenDbhandle(p, p->zTarget, 1); in rbuMoveOalFile()
3241 assert( p->rc==SQLITE_OK ); in rbuMoveOalFile()
3242 p->rc = rbuLockDatabase(dbMain); in rbuMoveOalFile()
3245 if( p->rc==SQLITE_OK ){ in rbuMoveOalFile()
3246 p->rc = p->xRename(p->pRenameArg, zOal, zWal); in rbuMoveOalFile()
3249 if( p->rc!=SQLITE_OK in rbuMoveOalFile()
3250 || rbuIsVacuum(p) in rbuMoveOalFile()
3257 if( p->rc==SQLITE_OK ){ in rbuMoveOalFile()
3258 rbuOpenDatabase(p, dbMain, 0); in rbuMoveOalFile()
3259 rbuSetupCheckpoint(p, 0); in rbuMoveOalFile()
3284 static int rbuStepType(sqlite3rbu *p, const char **pzMask){ in rbuStepType() argument
3285 int iCol = p->objiter.nCol; /* Index of rbu_control column */ in rbuStepType()
3288 switch( sqlite3_column_type(p->objiter.pSelect, iCol) ){ in rbuStepType()
3290 int iVal = sqlite3_column_int(p->objiter.pSelect, iCol); in rbuStepType()
3302 const unsigned char *z = sqlite3_column_text(p->objiter.pSelect, iCol); in rbuStepType()
3304 p->rc = SQLITE_NOMEM; in rbuStepType()
3318 rbuBadControlError(p); in rbuStepType()
3340 static void rbuStepOneOp(sqlite3rbu *p, int eType){ in rbuStepOneOp() argument
3341 RbuObjIter *pIter = &p->objiter; in rbuStepOneOp()
3346 assert( p->rc==SQLITE_OK ); in rbuStepOneOp()
3357 p->nPhaseOneStep -= p->objiter.nIndex; in rbuStepOneOp()
3374 p->rc = SQLITE_MISMATCH; in rbuStepOneOp()
3375 p->zErrmsg = sqlite3_mprintf("datatype mismatch"); in rbuStepOneOp()
3384 p->rc = sqlite3_bind_value(pWriter, i+1, pVal); in rbuStepOneOp()
3385 if( p->rc ) return; in rbuStepOneOp()
3390 || (pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)) in rbuStepOneOp()
3400 rbuIsVacuum(p) ? "rowid" : "rbu_rowid" in rbuStepOneOp()
3403 p->rc = sqlite3_bind_value(pWriter, pIter->nCol+1, pVal); in rbuStepOneOp()
3406 if( p->rc==SQLITE_OK ){ in rbuStepOneOp()
3408 p->rc = resetAndCollectError(pWriter, &p->zErrmsg); in rbuStepOneOp()
3423 static int rbuStep(sqlite3rbu *p){ in rbuStep() argument
3424 RbuObjIter *pIter = &p->objiter; in rbuStep()
3426 int eType = rbuStepType(p, &zMask); in rbuStep()
3436 rbuBadControlError(p); in rbuStep()
3440 p->nPhaseOneStep += p->objiter.nIndex; in rbuStep()
3441 rbuStepOneOp(p, RBU_DELETE); in rbuStep()
3443 if( p->rc==SQLITE_OK ) rbuStepOneOp(p, RBU_INSERT); in rbuStep()
3446 rbuStepOneOp(p, eType); in rbuStep()
3452 p->nPhaseOneStep -= p->objiter.nIndex; in rbuStep()
3453 rbuGetUpdateStmt(p, pIter, zMask, &pUpdate); in rbuStep()
3456 for(i=0; p->rc==SQLITE_OK && i<pIter->nCol; i++){ in rbuStep()
3460 p->rc = sqlite3_bind_value(pUpdate, i+1, pVal); in rbuStep()
3463 if( p->rc==SQLITE_OK in rbuStep()
3469 p->rc = sqlite3_bind_value(pUpdate, pIter->nCol+1, pVal); in rbuStep()
3471 if( p->rc==SQLITE_OK ){ in rbuStep()
3473 p->rc = resetAndCollectError(pUpdate, &p->zErrmsg); in rbuStep()
3478 return p->rc; in rbuStep()
3488 static void rbuIncrSchemaCookie(sqlite3rbu *p){ in rbuIncrSchemaCookie() argument
3489 if( p->rc==SQLITE_OK ){ in rbuIncrSchemaCookie()
3490 sqlite3 *dbread = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); in rbuIncrSchemaCookie()
3494 p->rc = prepareAndCollectError(dbread, &pStmt, &p->zErrmsg, in rbuIncrSchemaCookie()
3497 if( p->rc==SQLITE_OK ){ in rbuIncrSchemaCookie()
3506 rbuFinalize(p, pStmt); in rbuIncrSchemaCookie()
3508 if( p->rc==SQLITE_OK ){ in rbuIncrSchemaCookie()
3509 rbuMPrintfExec(p, p->dbMain, "PRAGMA schema_version = %d", iCookie+1); in rbuIncrSchemaCookie()
3519 static void rbuSaveState(sqlite3rbu *p, int eStage){ in rbuSaveState() argument
3520 if( p->rc==SQLITE_OK || p->rc==SQLITE_DONE ){ in rbuSaveState()
3522 rbu_file *pFd = (rbuIsVacuum(p) ? p->pRbuFd : p->pTargetFd); in rbuSaveState()
3525 assert( p->zErrmsg==0 ); in rbuSaveState()
3526 rc = prepareFreeAndCollectError(p->dbRbu, &pInsert, &p->zErrmsg, in rbuSaveState()
3539 p->zStateDb, in rbuSaveState()
3541 RBU_STATE_TBL, p->objiter.zTbl, in rbuSaveState()
3542 RBU_STATE_IDX, p->objiter.zIdx, in rbuSaveState()
3543 RBU_STATE_ROW, p->nStep, in rbuSaveState()
3544 RBU_STATE_PROGRESS, p->nProgress, in rbuSaveState()
3545 RBU_STATE_CKPT, p->iWalCksum, in rbuSaveState()
3547 RBU_STATE_OALSZ, p->iOalSz, in rbuSaveState()
3548 RBU_STATE_PHASEONESTEP, p->nPhaseOneStep, in rbuSaveState()
3549 RBU_STATE_DATATBL, p->objiter.zDataTbl in rbuSaveState()
3558 if( rc!=SQLITE_OK ) p->rc = rc; in rbuSaveState()
3580 static void rbuCopyPragma(sqlite3rbu *p, const char *zPragma){ in rbuCopyPragma() argument
3581 if( p->rc==SQLITE_OK ){ in rbuCopyPragma()
3583 p->rc = prepareFreeAndCollectError(p->dbRbu, &pPragma, &p->zErrmsg, in rbuCopyPragma()
3586 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPragma) ){ in rbuCopyPragma()
3587 p->rc = rbuMPrintfExec(p, p->dbMain, "PRAGMA main.%s = %d", in rbuCopyPragma()
3591 rbuFinalize(p, pPragma); in rbuCopyPragma()
3600 static void rbuCreateTargetSchema(sqlite3rbu *p){ in rbuCreateTargetSchema() argument
3604 assert( rbuIsVacuum(p) ); in rbuCreateTargetSchema()
3605 p->rc = sqlite3_exec(p->dbMain, "PRAGMA writable_schema=1", 0,0, &p->zErrmsg); in rbuCreateTargetSchema()
3606 if( p->rc==SQLITE_OK ){ in rbuCreateTargetSchema()
3607 p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, in rbuCreateTargetSchema()
3614 while( p->rc==SQLITE_OK && sqlite3_step(pSql)==SQLITE_ROW ){ in rbuCreateTargetSchema()
3616 p->rc = sqlite3_exec(p->dbMain, zSql, 0, 0, &p->zErrmsg); in rbuCreateTargetSchema()
3618 rbuFinalize(p, pSql); in rbuCreateTargetSchema()
3619 if( p->rc!=SQLITE_OK ) return; in rbuCreateTargetSchema()
3621 if( p->rc==SQLITE_OK ){ in rbuCreateTargetSchema()
3622 p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, in rbuCreateTargetSchema()
3627 if( p->rc==SQLITE_OK ){ in rbuCreateTargetSchema()
3628 p->rc = prepareAndCollectError(p->dbMain, &pInsert, &p->zErrmsg, in rbuCreateTargetSchema()
3633 while( p->rc==SQLITE_OK && sqlite3_step(pSql)==SQLITE_ROW ){ in rbuCreateTargetSchema()
3639 p->rc = sqlite3_reset(pInsert); in rbuCreateTargetSchema()
3641 if( p->rc==SQLITE_OK ){ in rbuCreateTargetSchema()
3642 p->rc = sqlite3_exec(p->dbMain, "PRAGMA writable_schema=0",0,0,&p->zErrmsg); in rbuCreateTargetSchema()
3645 rbuFinalize(p, pSql); in rbuCreateTargetSchema()
3646 rbuFinalize(p, pInsert); in rbuCreateTargetSchema()
3652 int sqlite3rbu_step(sqlite3rbu *p){ in sqlite3rbu_step() argument
3653 if( p ){ in sqlite3rbu_step()
3654 switch( p->eStage ){ in sqlite3rbu_step()
3656 RbuObjIter *pIter = &p->objiter; in sqlite3rbu_step()
3660 if( rbuIsVacuum(p) && p->nProgress==0 && p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3661 rbuCreateTargetSchema(p); in sqlite3rbu_step()
3662 rbuCopyPragma(p, "user_version"); in sqlite3rbu_step()
3663 rbuCopyPragma(p, "application_id"); in sqlite3rbu_step()
3666 while( p->rc==SQLITE_OK && pIter->zTbl ){ in sqlite3rbu_step()
3672 if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ in sqlite3rbu_step()
3673 rbuMPrintfExec(p, p->dbRbu, in sqlite3rbu_step()
3674 "DELETE FROM %s.'rbu_tmp_%q'", p->zStateDb, pIter->zDataTbl in sqlite3rbu_step()
3678 rbuObjIterPrepareAll(p, pIter, 0); in sqlite3rbu_step()
3681 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3684 p->nProgress++; in sqlite3rbu_step()
3685 p->nStep++; in sqlite3rbu_step()
3686 return rbuStep(p); in sqlite3rbu_step()
3688 p->rc = sqlite3_reset(pIter->pSelect); in sqlite3rbu_step()
3689 p->nStep = 0; in sqlite3rbu_step()
3693 rbuObjIterNext(p, pIter); in sqlite3rbu_step()
3696 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3698 rbuSaveState(p, RBU_STAGE_MOVE); in sqlite3rbu_step()
3699 rbuIncrSchemaCookie(p); in sqlite3rbu_step()
3700 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3701 p->rc = sqlite3_exec(p->dbMain, "COMMIT", 0, 0, &p->zErrmsg); in sqlite3rbu_step()
3703 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3704 p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, &p->zErrmsg); in sqlite3rbu_step()
3706 p->eStage = RBU_STAGE_MOVE; in sqlite3rbu_step()
3712 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3713 rbuMoveOalFile(p); in sqlite3rbu_step()
3714 p->nProgress++; in sqlite3rbu_step()
3720 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3721 if( p->nStep>=p->nFrame ){ in sqlite3rbu_step()
3722 sqlite3_file *pDb = p->pTargetFd->pReal; in sqlite3rbu_step()
3725 p->rc = pDb->pMethods->xSync(pDb, SQLITE_SYNC_NORMAL); in sqlite3rbu_step()
3728 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3730 p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, &ptr); in sqlite3rbu_step()
3731 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3732 ((u32 volatile*)ptr)[24] = p->iMaxFrame; in sqlite3rbu_step()
3736 if( p->rc==SQLITE_OK ){ in sqlite3rbu_step()
3737 p->eStage = RBU_STAGE_DONE; in sqlite3rbu_step()
3738 p->rc = SQLITE_DONE; in sqlite3rbu_step()
3753 RbuFrame *pFrame = &p->aFrame[p->nStep]; in sqlite3rbu_step()
3754 iSector = (pFrame->iDbPage-1) / p->nPagePerSector; in sqlite3rbu_step()
3755 rbuCheckpointFrame(p, pFrame); in sqlite3rbu_step()
3756 p->nStep++; in sqlite3rbu_step()
3757 }while( p->nStep<p->nFrame in sqlite3rbu_step()
3758 && iSector==((p->aFrame[p->nStep].iDbPage-1) / p->nPagePerSector) in sqlite3rbu_step()
3759 && p->rc==SQLITE_OK in sqlite3rbu_step()
3762 p->nProgress++; in sqlite3rbu_step()
3770 return p->rc; in sqlite3rbu_step()
3797 static void rbuSetupOal(sqlite3rbu *p, RbuState *pState){ in rbuSetupOal() argument
3798 assert( p->rc==SQLITE_OK ); in rbuSetupOal()
3800 RbuObjIter *pIter = &p->objiter; in rbuSetupOal()
3808 rc = rbuObjIterNext(p, pIter); in rbuSetupOal()
3813 p->zErrmsg = sqlite3_mprintf("rbu_state mismatch error"); in rbuSetupOal()
3817 p->nStep = pState->nRow; in rbuSetupOal()
3818 rc = rbuObjIterPrepareAll(p, &p->objiter, p->nStep); in rbuSetupOal()
3821 p->rc = rc; in rbuSetupOal()
3830 static void rbuDeleteOalFile(sqlite3rbu *p){ in rbuDeleteOalFile() argument
3831 char *zOal = rbuMPrintf(p, "%s-oal", p->zTarget); in rbuDeleteOalFile()
3834 assert( pVfs && p->rc==SQLITE_OK && p->zErrmsg==0 ); in rbuDeleteOalFile()
3846 static void rbuCreateVfs(sqlite3rbu *p){ in rbuCreateVfs() argument
3850 assert( p->rc==SQLITE_OK ); in rbuCreateVfs()
3853 p->rc = sqlite3rbu_create_vfs(zRnd, 0); in rbuCreateVfs()
3854 if( p->rc==SQLITE_OK ){ in rbuCreateVfs()
3857 p->zVfsName = pVfs->zName; in rbuCreateVfs()
3858 ((rbu_vfs*)pVfs)->pRbu = p; in rbuCreateVfs()
3866 static void rbuDeleteVfs(sqlite3rbu *p){ in rbuDeleteVfs() argument
3867 if( p->zVfsName ){ in rbuDeleteVfs()
3868 sqlite3rbu_destroy_vfs(p->zVfsName); in rbuDeleteVfs()
3869 p->zVfsName = 0; in rbuDeleteVfs()
3883 sqlite3rbu *p = (sqlite3rbu*)sqlite3_user_data(pCtx); in rbuIndexCntFunc() local
3887 sqlite3 *db = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); in rbuIndexCntFunc()
3928 static void rbuInitPhaseOneSteps(sqlite3rbu *p){ in rbuInitPhaseOneSteps() argument
3929 if( p->rc==SQLITE_OK ){ in rbuInitPhaseOneSteps()
3933 p->nPhaseOneStep = -1; in rbuInitPhaseOneSteps()
3935 p->rc = sqlite3_create_function(p->dbRbu, in rbuInitPhaseOneSteps()
3936 "rbu_index_cnt", 1, SQLITE_UTF8, (void*)p, rbuIndexCntFunc, 0, 0 in rbuInitPhaseOneSteps()
3941 if( p->rc==SQLITE_OK ){ in rbuInitPhaseOneSteps()
3942 p->rc = prepareAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, in rbuInitPhaseOneSteps()
3946 if( p->rc==SQLITE_OK ){ in rbuInitPhaseOneSteps()
3950 p->rc = sqlite3_finalize(pStmt); in rbuInitPhaseOneSteps()
3953 if( p->rc==SQLITE_OK && bExists ){ in rbuInitPhaseOneSteps()
3954 p->rc = prepareAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, in rbuInitPhaseOneSteps()
3958 if( p->rc==SQLITE_OK ){ in rbuInitPhaseOneSteps()
3960 p->nPhaseOneStep = sqlite3_column_int64(pStmt, 0); in rbuInitPhaseOneSteps()
3962 p->rc = sqlite3_finalize(pStmt); in rbuInitPhaseOneSteps()
3974 sqlite3rbu *p; in openRbuHandle() local
3979 p = (sqlite3rbu*)sqlite3_malloc64(nByte); in openRbuHandle()
3980 if( p ){ in openRbuHandle()
3984 memset(p, 0, sizeof(sqlite3rbu)); in openRbuHandle()
3985 sqlite3rbu_rename_handler(p, 0, 0); in openRbuHandle()
3986 rbuCreateVfs(p); in openRbuHandle()
3989 if( p->rc==SQLITE_OK ){ in openRbuHandle()
3990 char *pCsr = (char*)&p[1]; in openRbuHandle()
3993 p->zTarget = pCsr; in openRbuHandle()
3994 memcpy(p->zTarget, zTarget, nTarget+1); in openRbuHandle()
3997 p->zRbu = pCsr; in openRbuHandle()
3998 memcpy(p->zRbu, zRbu, nRbu+1); in openRbuHandle()
4001 p->zState = rbuMPrintf(p, "%s", zState); in openRbuHandle()
4011 rbuOpenDatabase(p, 0, &bRetry); in openRbuHandle()
4013 rbuOpenDatabase(p, 0, 0); in openRbuHandle()
4017 if( p->rc==SQLITE_OK ){ in openRbuHandle()
4018 pState = rbuLoadState(p); in openRbuHandle()
4019 assert( pState || p->rc!=SQLITE_OK ); in openRbuHandle()
4020 if( p->rc==SQLITE_OK ){ in openRbuHandle()
4023 rbuDeleteOalFile(p); in openRbuHandle()
4024 rbuInitPhaseOneSteps(p); in openRbuHandle()
4025 p->eStage = RBU_STAGE_OAL; in openRbuHandle()
4027 p->eStage = pState->eStage; in openRbuHandle()
4028 p->nPhaseOneStep = pState->nPhaseOneStep; in openRbuHandle()
4030 p->nProgress = pState->nProgress; in openRbuHandle()
4031 p->iOalSz = pState->iOalSz; in openRbuHandle()
4034 assert( p->rc!=SQLITE_OK || p->eStage!=0 ); in openRbuHandle()
4036 if( p->rc==SQLITE_OK && p->pTargetFd->pWalFd ){ in openRbuHandle()
4037 if( p->eStage==RBU_STAGE_OAL ){ in openRbuHandle()
4038 p->rc = SQLITE_ERROR; in openRbuHandle()
4039 p->zErrmsg = sqlite3_mprintf("cannot update wal mode database"); in openRbuHandle()
4040 }else if( p->eStage==RBU_STAGE_MOVE ){ in openRbuHandle()
4041 p->eStage = RBU_STAGE_CKPT; in openRbuHandle()
4042 p->nStep = 0; in openRbuHandle()
4046 if( p->rc==SQLITE_OK in openRbuHandle()
4047 && (p->eStage==RBU_STAGE_OAL || p->eStage==RBU_STAGE_MOVE) in openRbuHandle()
4050 rbu_file *pFd = (rbuIsVacuum(p) ? p->pRbuFd : p->pTargetFd); in openRbuHandle()
4056 p->rc = SQLITE_BUSY; in openRbuHandle()
4057 p->zErrmsg = sqlite3_mprintf("database modified during rbu %s", in openRbuHandle()
4058 (rbuIsVacuum(p) ? "vacuum" : "update") in openRbuHandle()
4063 if( p->rc==SQLITE_OK ){ in openRbuHandle()
4064 if( p->eStage==RBU_STAGE_OAL ){ in openRbuHandle()
4065 sqlite3 *db = p->dbMain; in openRbuHandle()
4066 p->rc = sqlite3_exec(p->dbRbu, "BEGIN", 0, 0, &p->zErrmsg); in openRbuHandle()
4069 if( p->rc==SQLITE_OK ){ in openRbuHandle()
4070 p->rc = rbuObjIterFirst(p, &p->objiter); in openRbuHandle()
4075 if( p->rc==SQLITE_OK && p->objiter.zTbl==0 ){ in openRbuHandle()
4076 p->rc = SQLITE_DONE; in openRbuHandle()
4077 p->eStage = RBU_STAGE_DONE; in openRbuHandle()
4079 if( p->rc==SQLITE_OK && pState->eStage==0 && rbuIsVacuum(p) ){ in openRbuHandle()
4080 rbuCopyPragma(p, "page_size"); in openRbuHandle()
4081 rbuCopyPragma(p, "auto_vacuum"); in openRbuHandle()
4086 if( p->rc==SQLITE_OK ){ in openRbuHandle()
4087 p->rc = sqlite3_exec(db, "BEGIN IMMEDIATE", 0, 0, &p->zErrmsg); in openRbuHandle()
4093 if( p->rc==SQLITE_OK ){ in openRbuHandle()
4096 p->rc = sqlite3_exec( in openRbuHandle()
4097 db, "PRAGMA journal_mode=off",0,0,&p->zErrmsg); in openRbuHandle()
4101 if( p->rc==SQLITE_OK ){ in openRbuHandle()
4102 rbuSetupOal(p, pState); in openRbuHandle()
4105 }else if( p->eStage==RBU_STAGE_MOVE ){ in openRbuHandle()
4107 }else if( p->eStage==RBU_STAGE_CKPT ){ in openRbuHandle()
4108 if( !rbuIsVacuum(p) && rbuExclusiveCheckpoint(p->dbMain) ){ in openRbuHandle()
4112 p->eStage = RBU_STAGE_DONE; in openRbuHandle()
4113 rbuLockDatabase(p->dbMain); in openRbuHandle()
4114 p->eStage = RBU_STAGE_CKPT; in openRbuHandle()
4116 rbuSetupCheckpoint(p, pState); in openRbuHandle()
4117 }else if( p->eStage==RBU_STAGE_DONE ){ in openRbuHandle()
4118 p->rc = SQLITE_DONE; in openRbuHandle()
4120 p->rc = SQLITE_CORRUPT; in openRbuHandle()
4127 return p; in openRbuHandle()
4191 static void rbuEditErrmsg(sqlite3rbu *p){ in rbuEditErrmsg() argument
4192 if( p->rc==SQLITE_CONSTRAINT && p->zErrmsg ){ in rbuEditErrmsg()
4194 size_t nErrmsg = strlen(p->zErrmsg); in rbuEditErrmsg()
4196 if( memcmp(&p->zErrmsg[i], "rbu_imp_", 8)==0 ){ in rbuEditErrmsg()
4198 while( p->zErrmsg[i+nDel]>='0' && p->zErrmsg[i+nDel]<='9' ) nDel++; in rbuEditErrmsg()
4199 memmove(&p->zErrmsg[i], &p->zErrmsg[i+nDel], nErrmsg + 1 - i - nDel); in rbuEditErrmsg()
4209 int sqlite3rbu_close(sqlite3rbu *p, char **pzErrmsg){ in sqlite3rbu_close() argument
4211 if( p ){ in sqlite3rbu_close()
4214 if( p->rc==SQLITE_OK && p->eStage==RBU_STAGE_OAL ){ in sqlite3rbu_close()
4215 p->rc = sqlite3_exec(p->dbMain, "COMMIT", 0, 0, &p->zErrmsg); in sqlite3rbu_close()
4219 if( p->rc==SQLITE_OK && p->eStage==RBU_STAGE_CKPT ){ in sqlite3rbu_close()
4220 sqlite3_file *pDb = p->pTargetFd->pReal; in sqlite3rbu_close()
4221 p->rc = pDb->pMethods->xSync(pDb, SQLITE_SYNC_NORMAL); in sqlite3rbu_close()
4224 rbuSaveState(p, p->eStage); in sqlite3rbu_close()
4226 if( p->rc==SQLITE_OK && p->eStage==RBU_STAGE_OAL ){ in sqlite3rbu_close()
4227 p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, &p->zErrmsg); in sqlite3rbu_close()
4231 rbuObjIterFinalize(&p->objiter); in sqlite3rbu_close()
4238 if( rbuIsVacuum(p) && p->rc!=SQLITE_OK && p->dbRbu ){ in sqlite3rbu_close()
4239 int rc2 = sqlite3_exec(p->dbRbu, "DELETE FROM stat.rbu_state", 0, 0, 0); in sqlite3rbu_close()
4240 if( p->rc==SQLITE_DONE && rc2!=SQLITE_OK ) p->rc = rc2; in sqlite3rbu_close()
4244 sqlite3_close(p->dbRbu); in sqlite3rbu_close()
4245 sqlite3_close(p->dbMain); in sqlite3rbu_close()
4246 assert( p->szTemp==0 ); in sqlite3rbu_close()
4247 rbuDeleteVfs(p); in sqlite3rbu_close()
4248 sqlite3_free(p->aBuf); in sqlite3rbu_close()
4249 sqlite3_free(p->aFrame); in sqlite3rbu_close()
4251 rbuEditErrmsg(p); in sqlite3rbu_close()
4252 rc = p->rc; in sqlite3rbu_close()
4254 *pzErrmsg = p->zErrmsg; in sqlite3rbu_close()
4256 sqlite3_free(p->zErrmsg); in sqlite3rbu_close()
4258 sqlite3_free(p->zState); in sqlite3rbu_close()
4259 sqlite3_free(p); in sqlite3rbu_close()
4280 void sqlite3rbu_bp_progress(sqlite3rbu *p, int *pnOne, int *pnTwo){ in sqlite3rbu_bp_progress() argument
4282 switch( p->eStage ){ in sqlite3rbu_bp_progress()
4284 if( p->nPhaseOneStep>0 ){ in sqlite3rbu_bp_progress()
4285 *pnOne = (int)(MAX_PROGRESS * (i64)p->nProgress/(i64)p->nPhaseOneStep); in sqlite3rbu_bp_progress()
4299 *pnTwo = (int)(MAX_PROGRESS * (i64)p->nStep / (i64)p->nFrame); in sqlite3rbu_bp_progress()
4315 int sqlite3rbu_state(sqlite3rbu *p){ in sqlite3rbu_state() argument
4330 if( p->rc!=SQLITE_OK && p->rc!=SQLITE_DONE ){ in sqlite3rbu_state()
4333 assert( p->rc!=SQLITE_DONE || p->eStage==RBU_STAGE_DONE ); in sqlite3rbu_state()
4334 assert( p->eStage==RBU_STAGE_OAL in sqlite3rbu_state()
4335 || p->eStage==RBU_STAGE_MOVE in sqlite3rbu_state()
4336 || p->eStage==RBU_STAGE_CKPT in sqlite3rbu_state()
4337 || p->eStage==RBU_STAGE_DONE in sqlite3rbu_state()
4339 return aRes[p->eStage]; in sqlite3rbu_state()
4343 int sqlite3rbu_savestate(sqlite3rbu *p){ in sqlite3rbu_savestate() argument
4344 int rc = p->rc; in sqlite3rbu_savestate()
4347 assert( p->eStage>=RBU_STAGE_OAL && p->eStage<=RBU_STAGE_DONE ); in sqlite3rbu_savestate()
4348 if( p->eStage==RBU_STAGE_OAL ){ in sqlite3rbu_savestate()
4350 if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "COMMIT", 0, 0, 0); in sqlite3rbu_savestate()
4354 if( rc==SQLITE_OK && p->eStage==RBU_STAGE_CKPT ){ in sqlite3rbu_savestate()
4355 sqlite3_file *pDb = p->pTargetFd->pReal; in sqlite3rbu_savestate()
4359 p->rc = rc; in sqlite3rbu_savestate()
4360 rbuSaveState(p, p->eStage); in sqlite3rbu_savestate()
4361 rc = p->rc; in sqlite3rbu_savestate()
4363 if( p->eStage==RBU_STAGE_OAL ){ in sqlite3rbu_savestate()
4365 if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); in sqlite3rbu_savestate()
4367 const char *zBegin = rbuIsVacuum(p) ? "BEGIN" : "BEGIN IMMEDIATE"; in sqlite3rbu_savestate()
4368 rc = sqlite3_exec(p->dbRbu, zBegin, 0, 0, 0); in sqlite3rbu_savestate()
4370 if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "BEGIN IMMEDIATE", 0, 0,0); in sqlite3rbu_savestate()
4373 p->rc = rc; in sqlite3rbu_savestate()
4484 static void rbuUnlockShm(rbu_file *p){ in rbuUnlockShm() argument
4485 assert( p->openFlags & SQLITE_OPEN_MAIN_DB ); in rbuUnlockShm()
4486 if( p->pRbu ){ in rbuUnlockShm()
4487 int (*xShmLock)(sqlite3_file*,int,int,int) = p->pReal->pMethods->xShmLock; in rbuUnlockShm()
4490 if( (1<<i) & p->pRbu->mLock ){ in rbuUnlockShm()
4491 xShmLock(p->pReal, i, 1, SQLITE_SHM_UNLOCK|SQLITE_SHM_EXCLUSIVE); in rbuUnlockShm()
4494 p->pRbu->mLock = 0; in rbuUnlockShm()
4518 static void rbuMainlistAdd(rbu_file *p){ in rbuMainlistAdd() argument
4519 rbu_vfs *pRbuVfs = p->pRbuVfs; in rbuMainlistAdd()
4521 assert( (p->openFlags & SQLITE_OPEN_MAIN_DB) ); in rbuMainlistAdd()
4523 if( p->pRbu==0 ){ in rbuMainlistAdd()
4525 p->pMainNext = pRbuVfs->pMain; in rbuMainlistAdd()
4526 pRbuVfs->pMain = p; in rbuMainlistAdd()
4528 for(pIter=pRbuVfs->pMainRbu; pIter && pIter!=p; pIter=pIter->pMainRbuNext){} in rbuMainlistAdd()
4530 p->pMainRbuNext = pRbuVfs->pMainRbu; in rbuMainlistAdd()
4531 pRbuVfs->pMainRbu = p; in rbuMainlistAdd()
4540 static void rbuMainlistRemove(rbu_file *p){ in rbuMainlistRemove() argument
4542 sqlite3_mutex_enter(p->pRbuVfs->mutex); in rbuMainlistRemove()
4543 for(pp=&p->pRbuVfs->pMain; *pp && *pp!=p; pp=&((*pp)->pMainNext)){} in rbuMainlistRemove()
4544 if( *pp ) *pp = p->pMainNext; in rbuMainlistRemove()
4545 p->pMainNext = 0; in rbuMainlistRemove()
4546 for(pp=&p->pRbuVfs->pMainRbu; *pp && *pp!=p; pp=&((*pp)->pMainRbuNext)){} in rbuMainlistRemove()
4547 if( *pp ) *pp = p->pMainRbuNext; in rbuMainlistRemove()
4548 p->pMainRbuNext = 0; in rbuMainlistRemove()
4549 sqlite3_mutex_leave(p->pRbuVfs->mutex); in rbuMainlistRemove()
4577 rbu_file *p = (rbu_file*)pFile; in rbuVfsClose() local
4582 for(i=0; i<p->nShm; i++){ in rbuVfsClose()
4583 sqlite3_free(p->apShm[i]); in rbuVfsClose()
4585 sqlite3_free(p->apShm); in rbuVfsClose()
4586 p->apShm = 0; in rbuVfsClose()
4587 sqlite3_free(p->zDel); in rbuVfsClose()
4589 if( p->openFlags & SQLITE_OPEN_MAIN_DB ){ in rbuVfsClose()
4590 rbuMainlistRemove(p); in rbuVfsClose()
4591 rbuUnlockShm(p); in rbuVfsClose()
4592 p->pReal->pMethods->xShmUnmap(p->pReal, 0); in rbuVfsClose()
4594 else if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){ in rbuVfsClose()
4595 rbuUpdateTempSize(p, 0); in rbuVfsClose()
4597 assert( p->pMainNext==0 && p->pRbuVfs->pMain!=p ); in rbuVfsClose()
4600 rc = p->pReal->pMethods->xClose(p->pReal); in rbuVfsClose()
4641 rbu_file *p = (rbu_file*)pFile; in rbuVfsRead() local
4642 sqlite3rbu *pRbu = p->pRbu; in rbuVfsRead()
4646 assert( p->openFlags & SQLITE_OPEN_WAL ); in rbuVfsRead()
4647 rc = rbuCaptureWalRead(p->pRbu, iOfst, iAmt); in rbuVfsRead()
4650 && (p->openFlags & SQLITE_OPEN_WAL) in rbuVfsRead()
4656 rc = p->pReal->pMethods->xRead(p->pReal, zBuf, iAmt, iOfst); in rbuVfsRead()
4664 && (p->openFlags & SQLITE_OPEN_MAIN_DB) in rbuVfsRead()
4687 if( rc==SQLITE_OK && iOfst==0 && (p->openFlags & SQLITE_OPEN_MAIN_DB) ){ in rbuVfsRead()
4691 p->iCookie = rbuGetU32(&pBuf[24]); in rbuVfsRead()
4692 p->iWriteVer = pBuf[19]; in rbuVfsRead()
4707 rbu_file *p = (rbu_file*)pFile; in rbuVfsWrite() local
4708 sqlite3rbu *pRbu = p->pRbu; in rbuVfsWrite()
4712 assert( p->openFlags & SQLITE_OPEN_MAIN_DB ); in rbuVfsWrite()
4713 rc = rbuCaptureDbWrite(p->pRbu, iOfst); in rbuVfsWrite()
4717 && (p->openFlags & SQLITE_OPEN_WAL) in rbuVfsWrite()
4721 }else if( p->openFlags & SQLITE_OPEN_DELETEONCLOSE ){ in rbuVfsWrite()
4723 if( szNew>p->sz ){ in rbuVfsWrite()
4724 rc = rbuUpdateTempSize(p, szNew); in rbuVfsWrite()
4729 rc = p->pReal->pMethods->xWrite(p->pReal, zBuf, iAmt, iOfst); in rbuVfsWrite()
4730 if( rc==SQLITE_OK && iOfst==0 && (p->openFlags & SQLITE_OPEN_MAIN_DB) ){ in rbuVfsWrite()
4734 p->iCookie = rbuGetU32(&pBuf[24]); in rbuVfsWrite()
4735 p->iWriteVer = pBuf[19]; in rbuVfsWrite()
4745 rbu_file *p = (rbu_file*)pFile; in rbuVfsTruncate() local
4746 if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){ in rbuVfsTruncate()
4747 int rc = rbuUpdateTempSize(p, size); in rbuVfsTruncate()
4750 return p->pReal->pMethods->xTruncate(p->pReal, size); in rbuVfsTruncate()
4757 rbu_file *p = (rbu_file *)pFile; in rbuVfsSync() local
4758 if( p->pRbu && p->pRbu->eStage==RBU_STAGE_CAPTURE ){ in rbuVfsSync()
4759 if( p->openFlags & SQLITE_OPEN_MAIN_DB ){ in rbuVfsSync()
4764 return p->pReal->pMethods->xSync(p->pReal, flags); in rbuVfsSync()
4771 rbu_file *p = (rbu_file *)pFile; in rbuVfsFileSize() local
4773 rc = p->pReal->pMethods->xFileSize(p->pReal, pSize); in rbuVfsFileSize()
4780 && p->pRbu && rbuIsVacuum(p->pRbu) in rbuVfsFileSize()
4781 && (p->openFlags & SQLITE_OPEN_MAIN_DB) in rbuVfsFileSize()
4792 rbu_file *p = (rbu_file*)pFile; in rbuVfsLock() local
4793 sqlite3rbu *pRbu = p->pRbu; in rbuVfsLock()
4796 assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); in rbuVfsLock()
4798 && (p->bNolock || (pRbu && pRbu->eStage!=RBU_STAGE_DONE)) in rbuVfsLock()
4804 rc = p->pReal->pMethods->xLock(p->pReal, eLock); in rbuVfsLock()
4814 rbu_file *p = (rbu_file *)pFile; in rbuVfsUnlock() local
4815 return p->pReal->pMethods->xUnlock(p->pReal, eLock); in rbuVfsUnlock()
4822 rbu_file *p = (rbu_file *)pFile; in rbuVfsCheckReservedLock() local
4823 return p->pReal->pMethods->xCheckReservedLock(p->pReal, pResOut); in rbuVfsCheckReservedLock()
4830 rbu_file *p = (rbu_file *)pFile; in rbuVfsFileControl() local
4831 int (*xControl)(sqlite3_file*,int,void*) = p->pReal->pMethods->xFileControl; in rbuVfsFileControl()
4834 assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) in rbuVfsFileControl()
4835 || p->openFlags & (SQLITE_OPEN_TRANSIENT_DB|SQLITE_OPEN_TEMP_JOURNAL) in rbuVfsFileControl()
4843 rc = xControl(p->pReal, op, pArg); in rbuVfsFileControl()
4849 rc = xControl(p->pReal, SQLITE_FCNTL_ZIPVFS, &dummy); in rbuVfsFileControl()
4854 pRbu->pTargetFd = p; in rbuVfsFileControl()
4855 p->pRbu = pRbu; in rbuVfsFileControl()
4856 rbuMainlistAdd(p); in rbuVfsFileControl()
4857 if( p->pWalFd ) p->pWalFd->pRbu = pRbu; in rbuVfsFileControl()
4866 pRbu->pRbuFd = p; in rbuVfsFileControl()
4867 p->bNolock = 1; in rbuVfsFileControl()
4870 rc = xControl(p->pReal, op, pArg); in rbuVfsFileControl()
4872 rbu_vfs *pRbuVfs = p->pRbuVfs; in rbuVfsFileControl()
4886 rbu_file *p = (rbu_file *)pFile; in rbuVfsSectorSize() local
4887 return p->pReal->pMethods->xSectorSize(p->pReal); in rbuVfsSectorSize()
4894 rbu_file *p = (rbu_file *)pFile; in rbuVfsDeviceCharacteristics() local
4895 return p->pReal->pMethods->xDeviceCharacteristics(p->pReal); in rbuVfsDeviceCharacteristics()
4902 rbu_file *p = (rbu_file*)pFile; in rbuVfsShmLock() local
4903 sqlite3rbu *pRbu = p->pRbu; in rbuVfsShmLock()
4910 assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); in rbuVfsShmLock()
4926 rc = p->pReal->pMethods->xShmLock(p->pReal, ofst, n, flags); in rbuVfsShmLock()
4946 rbu_file *p = (rbu_file*)pFile; in rbuVfsShmMap() local
4948 int eStage = (p->pRbu ? p->pRbu->eStage : 0); in rbuVfsShmMap()
4953 assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); in rbuVfsShmMap()
4956 char **apNew = (char**)sqlite3_realloc64(p->apShm, nByte); in rbuVfsShmMap()
4962 assert( iRegion==p->nShm ); in rbuVfsShmMap()
4966 memset(&apNew[p->nShm], 0, sizeof(char*) * (1 + iRegion - p->nShm)); in rbuVfsShmMap()
4967 p->apShm = apNew; in rbuVfsShmMap()
4968 p->nShm = iRegion+1; in rbuVfsShmMap()
4977 p->apShm[iRegion] = pNew; in rbuVfsShmMap()
4982 *pp = p->apShm[iRegion]; in rbuVfsShmMap()
4987 assert( p->apShm==0 ); in rbuVfsShmMap()
4988 rc = p->pReal->pMethods->xShmMap(p->pReal, iRegion, szRegion, isWrite, pp); in rbuVfsShmMap()
4998 rbu_file *p = (rbu_file *)pFile; in rbuVfsShmBarrier() local
4999 p->pReal->pMethods->xShmBarrier(p->pReal); in rbuVfsShmBarrier()
5006 rbu_file *p = (rbu_file*)pFile; in rbuVfsShmUnmap() local
5008 int eStage = (p->pRbu ? p->pRbu->eStage : 0); in rbuVfsShmUnmap()
5010 assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); in rbuVfsShmUnmap()
5015 rbuUnlockShm(p); in rbuVfsShmUnmap()
5016 rc = p->pReal->pMethods->xShmUnmap(p->pReal, delFlag); in rbuVfsShmUnmap()