Lines Matching refs:p
82 static void scrubBackupErr(ScrubState *p, const char *zFormat, ...){ in scrubBackupErr() argument
84 sqlite3_free(p->zErr); in scrubBackupErr()
86 p->zErr = sqlite3_vmprintf(zFormat, ap); in scrubBackupErr()
88 if( p->rcErr==0 ) p->rcErr = SQLITE_ERROR; in scrubBackupErr()
92 static u8 *scrubBackupAllocPage(ScrubState *p){ in scrubBackupAllocPage() argument
94 if( p->rcErr ) return 0; in scrubBackupAllocPage()
95 pPage = sqlite3_malloc( p->szPage ); in scrubBackupAllocPage()
96 if( pPage==0 ) p->rcErr = SQLITE_NOMEM; in scrubBackupAllocPage()
103 static u8 *scrubBackupRead(ScrubState *p, int pgno, u8 *pBuf){ in scrubBackupRead() argument
107 if( p->rcErr ) return 0; in scrubBackupRead()
109 pOut = scrubBackupAllocPage(p); in scrubBackupRead()
112 iOff = (pgno-1)*(sqlite3_int64)p->szPage; in scrubBackupRead()
113 rc = p->pSrc->pMethods->xRead(p->pSrc, pOut, p->szPage, iOff); in scrubBackupRead()
117 scrubBackupErr(p, "read failed for page %d", pgno); in scrubBackupRead()
118 p->rcErr = SQLITE_IOERR; in scrubBackupRead()
124 static void scrubBackupWrite(ScrubState *p, int pgno, const u8 *pData){ in scrubBackupWrite() argument
127 if( p->rcErr ) return; in scrubBackupWrite()
128 iOff = (pgno-1)*(sqlite3_int64)p->szPage; in scrubBackupWrite()
129 rc = p->pDest->pMethods->xWrite(p->pDest, pData, p->szPage, iOff); in scrubBackupWrite()
131 scrubBackupErr(p, "write failed for page %d", pgno); in scrubBackupWrite()
132 p->rcErr = SQLITE_IOERR; in scrubBackupWrite()
134 if( (u32)pgno>p->iLastPage ) p->iLastPage = pgno; in scrubBackupWrite()
139 ScrubState *p, /* Backup context */ in scrubBackupPrepare() argument
144 if( p->rcErr ) return 0; in scrubBackupPrepare()
145 p->rcErr = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); in scrubBackupPrepare()
146 if( p->rcErr ){ in scrubBackupPrepare()
147 scrubBackupErr(p, "SQL error \"%s\" on \"%s\"", in scrubBackupPrepare()
157 static void scrubBackupOpenSrc(ScrubState *p){ in scrubBackupOpenSrc() argument
161 p->rcErr = sqlite3_open_v2(p->zSrcFile, &p->dbSrc, in scrubBackupOpenSrc()
164 if( p->rcErr ){ in scrubBackupOpenSrc()
165 scrubBackupErr(p, "cannot open source database: %s", in scrubBackupOpenSrc()
166 sqlite3_errmsg(p->dbSrc)); in scrubBackupOpenSrc()
169 p->rcErr = sqlite3_exec(p->dbSrc, "SELECT 1 FROM sqlite_schema; BEGIN;", in scrubBackupOpenSrc()
171 if( p->rcErr ){ in scrubBackupOpenSrc()
172 scrubBackupErr(p, in scrubBackupOpenSrc()
174 sqlite3_errmsg(p->dbSrc)); in scrubBackupOpenSrc()
177 rc = sqlite3_wal_checkpoint_v2(p->dbSrc, "main", SQLITE_CHECKPOINT_FULL, in scrubBackupOpenSrc()
180 scrubBackupErr(p, "cannot checkpoint the source database"); in scrubBackupOpenSrc()
183 pStmt = scrubBackupPrepare(p, p->dbSrc, "PRAGMA page_size"); in scrubBackupOpenSrc()
187 p->szPage = sqlite3_column_int(pStmt, 0); in scrubBackupOpenSrc()
189 scrubBackupErr(p, "unable to determine the page size"); in scrubBackupOpenSrc()
192 if( p->rcErr ) return; in scrubBackupOpenSrc()
193 pStmt = scrubBackupPrepare(p, p->dbSrc, "PRAGMA page_count"); in scrubBackupOpenSrc()
197 p->nPage = sqlite3_column_int(pStmt, 0); in scrubBackupOpenSrc()
199 scrubBackupErr(p, "unable to determine the size of the source database"); in scrubBackupOpenSrc()
202 sqlite3_file_control(p->dbSrc, "main", SQLITE_FCNTL_FILE_POINTER, &p->pSrc); in scrubBackupOpenSrc()
203 if( p->pSrc==0 || p->pSrc->pMethods==0 ){ in scrubBackupOpenSrc()
204 scrubBackupErr(p, "cannot get the source file handle"); in scrubBackupOpenSrc()
205 p->rcErr = SQLITE_ERROR; in scrubBackupOpenSrc()
210 static void scrubBackupOpenDest(ScrubState *p){ in scrubBackupOpenDest() argument
214 if( p->rcErr ) return; in scrubBackupOpenDest()
215 p->rcErr = sqlite3_open_v2(p->zDestFile, &p->dbDest, in scrubBackupOpenDest()
218 if( p->rcErr ){ in scrubBackupOpenDest()
219 scrubBackupErr(p, "cannot open destination database: %s", in scrubBackupOpenDest()
220 sqlite3_errmsg(p->dbDest)); in scrubBackupOpenDest()
223 zSql = sqlite3_mprintf("PRAGMA page_size(%u);", p->szPage); in scrubBackupOpenDest()
225 p->rcErr = SQLITE_NOMEM; in scrubBackupOpenDest()
228 p->rcErr = sqlite3_exec(p->dbDest, zSql, 0, 0, 0); in scrubBackupOpenDest()
230 if( p->rcErr ){ in scrubBackupOpenDest()
231 scrubBackupErr(p, in scrubBackupOpenDest()
233 sqlite3_errmsg(p->dbDest)); in scrubBackupOpenDest()
236 sqlite3_exec(p->dbDest, "PRAGMA journal_mode=OFF;", 0, 0, 0); in scrubBackupOpenDest()
237 p->rcErr = sqlite3_exec(p->dbDest, "BEGIN EXCLUSIVE;", 0, 0, 0); in scrubBackupOpenDest()
238 if( p->rcErr ){ in scrubBackupOpenDest()
239 scrubBackupErr(p, in scrubBackupOpenDest()
241 sqlite3_errmsg(p->dbDest)); in scrubBackupOpenDest()
244 pStmt = scrubBackupPrepare(p, p->dbDest, "PRAGMA page_count;"); in scrubBackupOpenDest()
248 scrubBackupErr(p, "cannot measure the size of the destination"); in scrubBackupOpenDest()
250 scrubBackupErr(p, "destination database is not empty - holds %d pages", in scrubBackupOpenDest()
254 sqlite3_file_control(p->dbDest, "main", SQLITE_FCNTL_FILE_POINTER, &p->pDest); in scrubBackupOpenDest()
255 if( p->pDest==0 || p->pDest->pMethods==0 ){ in scrubBackupOpenDest()
256 scrubBackupErr(p, "cannot get the destination file handle"); in scrubBackupOpenDest()
257 p->rcErr = SQLITE_ERROR; in scrubBackupOpenDest()
305 static void scrubBackupFreelist(ScrubState *p, int pgno, u32 nFree){ in scrubBackupFreelist() argument
309 if( p->rcErr ) return; in scrubBackupFreelist()
310 aBuf = scrubBackupAllocPage(p); in scrubBackupFreelist()
314 a = scrubBackupRead(p, pgno, aBuf); in scrubBackupFreelist()
317 mx = p->szUsable/4 - 2; in scrubBackupFreelist()
321 scrubBackupWrite(p, pgno, a); in scrubBackupFreelist()
331 aZero = scrubBackupAllocPage(p); in scrubBackupFreelist()
333 memset(aZero, 0, p->szPage); in scrubBackupFreelist()
335 scrubBackupWrite(p, iLeaf, aZero); in scrubBackupFreelist()
347 static void scrubBackupOverflow(ScrubState *p, int pgno, u32 nByte){ in scrubBackupOverflow() argument
350 aBuf = scrubBackupAllocPage(p); in scrubBackupOverflow()
353 a = scrubBackupRead(p, pgno, aBuf); in scrubBackupOverflow()
355 if( nByte >= (p->szUsable)-4 ){ in scrubBackupOverflow()
356 nByte -= (p->szUsable) - 4; in scrubBackupOverflow()
358 u32 x = (p->szUsable - 4) - nByte; in scrubBackupOverflow()
359 u32 i = p->szUsable - x; in scrubBackupOverflow()
363 scrubBackupWrite(p, pgno, a); in scrubBackupOverflow()
374 static void scrubBackupBtree(ScrubState *p, int pgno, int iDepth){ in scrubBackupBtree() argument
387 if( p->rcErr ) return; in scrubBackupBtree()
389 scrubBackupErr(p, "corrupt: b-tree too deep at page %d", pgno); in scrubBackupBtree()
393 a = p->page1; in scrubBackupBtree()
395 a = scrubBackupRead(p, pgno, 0); in scrubBackupBtree()
407 if( x>p->szUsable ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
416 if( pc>(p->szUsable)-4 ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
418 if( pc+n>(p->szUsable) ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
426 scrubBackupWrite(p, pgno, a); in scrubBackupBtree()
434 if( pc > p->szUsable-3 ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
436 if( pc+4 > p->szUsable ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
439 scrubBackupBtree(p, iChild, iDepth+1); in scrubBackupBtree()
443 if( pc >= p->szUsable ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
445 X = p->szUsable - 35; in scrubBackupBtree()
447 X = ((p->szUsable - 12)*64/255) - 23; in scrubBackupBtree()
453 M = ((p->szUsable - 12)*32/255)-23; in scrubBackupBtree()
454 K = M + ((P-M)%(p->szUsable-4)); in scrubBackupBtree()
457 if( pc > (p->szUsable-4) ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
460 if( pc+nLocal > p->szUsable-4 ){ ln=__LINE__; goto btree_corrupt; } in scrubBackupBtree()
462 scrubBackupOverflow(p, iChild, (u32)(P-nLocal)); in scrubBackupBtree()
468 scrubBackupBtree(p, iChild, iDepth+1); in scrubBackupBtree()
476 scrubBackupErr(p, "corruption on page %d of source database (errid=%d)", in scrubBackupBtree()
486 static void scrubBackupPtrmap(ScrubState *p){ in scrubBackupPtrmap() argument
488 u32 J = p->szUsable/5; in scrubBackupPtrmap()
489 u32 iLock = (1073742335/p->szPage)+1; in scrubBackupPtrmap()
491 if( p->rcErr ) return; in scrubBackupPtrmap()
492 pBuf = scrubBackupAllocPage(p); in scrubBackupPtrmap()
494 while( pgno<=p->nPage ){ in scrubBackupPtrmap()
495 a = scrubBackupRead(p, pgno, pBuf); in scrubBackupPtrmap()
497 scrubBackupWrite(p, pgno, a); in scrubBackupPtrmap()