blob: aa9ff32181f43dbb196a347c03064ac9dbbdb587 [file] [log] [blame]
danielk197704103022009-02-03 16:51:24 +00001/*
2** 2009 January 28
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains the implementation of the sqlite3_backup_XXX()
13** API functions and the related features.
14**
drh38aec8d2009-02-16 16:23:09 +000015** $Id: backup.c,v 1.11 2009/02/16 16:23:09 drh Exp $
danielk197704103022009-02-03 16:51:24 +000016*/
17#include "sqliteInt.h"
18#include "btreeInt.h"
19
20/* Macro to find the minimum of two numeric values.
21*/
22#ifndef MIN
23# define MIN(x,y) ((x)<(y)?(x):(y))
24#endif
25
26/*
27** Structure allocated for each backup operation.
28*/
29struct sqlite3_backup {
30 sqlite3* pDestDb; /* Destination database handle */
31 Btree *pDest; /* Destination b-tree file */
32 u32 iDestSchema; /* Original schema cookie in destination */
33 int bDestLocked; /* True once a write-transaction is open on pDest */
34
35 Pgno iNext; /* Page number of the next source page to copy */
36 sqlite3* pSrcDb; /* Source database handle */
37 Btree *pSrc; /* Source b-tree file */
38
39 int rc; /* Backup process error code */
40
41 /* These two variables are set by every call to backup_step(). They are
42 ** read by calls to backup_remaining() and backup_pagecount().
43 */
44 Pgno nRemaining; /* Number of pages left to copy */
45 Pgno nPagecount; /* Total number of pages to copy */
46
47 sqlite3_backup *pNext; /* Next backup associated with source pager */
48};
49
50/*
51** THREAD SAFETY NOTES:
52**
53** Once it has been created using backup_init(), a single sqlite3_backup
54** structure may be accessed via two groups of thread-safe entry points:
55**
56** * Via the sqlite3_backup_XXX() API function backup_step() and
57** backup_finish(). Both these functions obtain the source database
58** handle mutex and the mutex associated with the source BtShared
59** structure, in that order.
60**
61** * Via the BackupUpdate() and BackupRestart() functions, which are
62** invoked by the pager layer to report various state changes in
63** the page cache associated with the source database. The mutex
64** associated with the source database BtShared structure will always
65** be held when either of these functions are invoked.
66**
67** The other sqlite3_backup_XXX() API functions, backup_remaining() and
68** backup_pagecount() are not thread-safe functions. If they are called
69** while some other thread is calling backup_step() or backup_finish(),
70** the values returned may be invalid. There is no way for a call to
71** BackupUpdate() or BackupRestart() to interfere with backup_remaining()
72** or backup_pagecount().
73**
74** Depending on the SQLite configuration, the database handles and/or
75** the Btree objects may have their own mutexes that require locking.
76** Non-sharable Btrees (in-memory databases for example), do not have
77** associated mutexes.
78*/
79
80/*
81** Return a pointer corresponding to database zDb (i.e. "main", "temp")
82** in connection handle pDb. If such a database cannot be found, return
83** a NULL pointer and write an error message to pErrorDb.
84**
85** If the "temp" database is requested, it may need to be opened by this
86** function. If an error occurs while doing so, return 0 and write an
87** error message to pErrorDb.
88*/
89static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){
90 int i = sqlite3FindDbName(pDb, zDb);
91
92 if( i==1 ){
93 Parse sParse;
94 memset(&sParse, 0, sizeof(sParse));
95 sParse.db = pDb;
96 if( sqlite3OpenTempDatabase(&sParse) ){
97 sqlite3ErrorClear(&sParse);
98 sqlite3Error(pErrorDb, sParse.rc, "%s", sParse.zErrMsg);
99 return 0;
100 }
101 assert( sParse.zErrMsg==0 );
102 }
103
104 if( i<0 ){
105 sqlite3Error(pErrorDb, SQLITE_ERROR, "unknown database %s", zDb);
106 return 0;
107 }
108
109 return pDb->aDb[i].pBt;
110}
111
112/*
113** Create an sqlite3_backup process to copy the contents of zSrcDb from
114** connection handle pSrcDb to zDestDb in pDestDb. If successful, return
115** a pointer to the new sqlite3_backup object.
116**
117** If an error occurs, NULL is returned and an error code and error message
118** stored in database handle pDestDb.
119*/
120sqlite3_backup *sqlite3_backup_init(
121 sqlite3* pDestDb, /* Database to write to */
122 const char *zDestDb, /* Name of database within pDestDb */
123 sqlite3* pSrcDb, /* Database connection to read from */
124 const char *zSrcDb /* Name of database within pSrcDb */
125){
126 sqlite3_backup *p; /* Value to return */
127
128 /* Lock the source database handle. The destination database
drh662c58c2009-02-03 21:13:07 +0000129 ** handle is not locked in this routine, but it is locked in
130 ** sqlite3_backup_step(). The user is required to ensure that no
danielk197704103022009-02-03 16:51:24 +0000131 ** other thread accesses the destination handle for the duration
drh662c58c2009-02-03 21:13:07 +0000132 ** of the backup operation. Any attempt to use the destination
133 ** database connection while a backup is in progress may cause
134 ** a malfunction or a deadlock.
danielk197704103022009-02-03 16:51:24 +0000135 */
136 sqlite3_mutex_enter(pSrcDb->mutex);
drheef1eb02009-02-04 16:56:19 +0000137 sqlite3_mutex_enter(pDestDb->mutex);
danielk197704103022009-02-03 16:51:24 +0000138
139 if( pSrcDb==pDestDb ){
140 sqlite3Error(
drhb309bec2009-02-04 17:40:57 +0000141 pDestDb, SQLITE_ERROR, "source and destination must be distinct"
danielk197704103022009-02-03 16:51:24 +0000142 );
143 p = 0;
144 }else {
145 /* Allocate space for a new sqlite3_backup object */
146 p = (sqlite3_backup *)sqlite3_malloc(sizeof(sqlite3_backup));
147 if( !p ){
148 sqlite3Error(pDestDb, SQLITE_NOMEM, 0);
149 }
150 }
151
152 /* If the allocation succeeded, populate the new object. */
153 if( p ){
154 memset(p, 0, sizeof(sqlite3_backup));
155 p->pSrc = findBtree(pDestDb, pSrcDb, zSrcDb);
156 p->pDest = findBtree(pDestDb, pDestDb, zDestDb);
157 p->pDestDb = pDestDb;
158 p->pSrcDb = pSrcDb;
159 p->iNext = 1;
160
161 if( 0==p->pSrc || 0==p->pDest ){
162 /* One (or both) of the named databases did not exist. An error has
163 ** already been written into the pDestDb handle. All that is left
164 ** to do here is free the sqlite3_backup structure.
165 */
166 sqlite3_free(p);
167 p = 0;
168 }
169 }
170
171 /* If everything has gone as planned, attach the backup object to the
172 ** source pager. The source pager calls BackupUpdate() and BackupRestart()
173 ** to notify this module if the source file is modified mid-backup.
174 */
175 if( p ){
176 sqlite3_backup **pp; /* Pointer to head of pagers backup list */
177 sqlite3BtreeEnter(p->pSrc);
178 pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc));
179 p->pNext = *pp;
180 *pp = p;
181 sqlite3BtreeLeave(p->pSrc);
182 p->pSrc->nBackup++;
183 }
184
drheef1eb02009-02-04 16:56:19 +0000185 sqlite3_mutex_leave(pDestDb->mutex);
danielk197704103022009-02-03 16:51:24 +0000186 sqlite3_mutex_leave(pSrcDb->mutex);
187 return p;
188}
189
190/*
danielk197703ab0352009-02-06 05:59:44 +0000191** Argument rc is an SQLite error code. Return true if this error is
192** considered fatal if encountered during a backup operation. All errors
193** are considered fatal except for SQLITE_BUSY and SQLITE_LOCKED.
194*/
195static int isFatalError(int rc){
196 return (rc!=SQLITE_OK && rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED);
197}
198
199/*
danielk197704103022009-02-03 16:51:24 +0000200** Parameter zSrcData points to a buffer containing the data for
201** page iSrcPg from the source database. Copy this data into the
202** destination database.
203*/
204static int backupOnePage(sqlite3_backup *p, Pgno iSrcPg, const u8 *zSrcData){
205 Pager * const pDestPager = sqlite3BtreePager(p->pDest);
206 const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc);
207 int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest);
208 const int nCopy = MIN(nSrcPgsz, nDestPgsz);
209 const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz;
210
211 int rc = SQLITE_OK;
212 i64 iOff;
213
214 assert( p->bDestLocked );
danielk197703ab0352009-02-06 05:59:44 +0000215 assert( !isFatalError(p->rc) );
danielk197704103022009-02-03 16:51:24 +0000216 assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) );
217 assert( zSrcData );
218
219 /* Catch the case where the destination is an in-memory database and the
220 ** page sizes of the source and destination differ.
221 */
222 if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(sqlite3BtreePager(p->pDest)) ){
223 rc = SQLITE_READONLY;
224 }
225
226 /* This loop runs once for each destination page spanned by the source
227 ** page. For each iteration, variable iOff is set to the byte offset
228 ** of the destination page.
229 */
230 for(iOff=iEnd-(i64)nSrcPgsz; rc==SQLITE_OK && iOff<iEnd; iOff+=nDestPgsz){
231 DbPage *pDestPg = 0;
232 Pgno iDest = (Pgno)(iOff/nDestPgsz)+1;
233 if( iDest==PENDING_BYTE_PAGE(p->pDest->pBt) ) continue;
234 if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg))
235 && SQLITE_OK==(rc = sqlite3PagerWrite(pDestPg))
236 ){
237 const u8 *zIn = &zSrcData[iOff%nSrcPgsz];
238 u8 *zDestData = sqlite3PagerGetData(pDestPg);
239 u8 *zOut = &zDestData[iOff%nDestPgsz];
240
241 /* Copy the data from the source page into the destination page.
242 ** Then clear the Btree layer MemPage.isInit flag. Both this module
243 ** and the pager code use this trick (clearing the first byte
244 ** of the page 'extra' space to invalidate the Btree layers
245 ** cached parse of the page). MemPage.isInit is marked
246 ** "MUST BE FIRST" for this purpose.
247 */
248 memcpy(zOut, zIn, nCopy);
249 ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0;
250 }
251 sqlite3PagerUnref(pDestPg);
252 }
253
254 return rc;
255}
256
257/*
danielk19773d0cbc32009-02-09 18:55:45 +0000258** If pFile is currently larger than iSize bytes, then truncate it to
259** exactly iSize bytes. If pFile is not larger than iSize bytes, then
260** this function is a no-op.
261**
262** Return SQLITE_OK if everything is successful, or an SQLite error
263** code if an error occurs.
264*/
265static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){
266 i64 iCurrent;
267 int rc = sqlite3OsFileSize(pFile, &iCurrent);
268 if( rc==SQLITE_OK && iCurrent>iSize ){
269 rc = sqlite3OsTruncate(pFile, iSize);
270 }
271 return rc;
272}
273
274/*
danielk197704103022009-02-03 16:51:24 +0000275** Copy nPage pages from the source b-tree to the destination.
276*/
277int sqlite3_backup_step(sqlite3_backup *p, int nPage){
278 int rc;
279
280 sqlite3_mutex_enter(p->pSrcDb->mutex);
281 sqlite3BtreeEnter(p->pSrc);
drhd3a5c502009-02-03 22:51:06 +0000282 if( p->pDestDb ){
283 sqlite3_mutex_enter(p->pDestDb->mutex);
284 }
danielk197704103022009-02-03 16:51:24 +0000285
286 rc = p->rc;
danielk197703ab0352009-02-06 05:59:44 +0000287 if( !isFatalError(rc) ){
danielk197704103022009-02-03 16:51:24 +0000288 Pager * const pSrcPager = sqlite3BtreePager(p->pSrc); /* Source pager */
289 Pager * const pDestPager = sqlite3BtreePager(p->pDest); /* Dest pager */
290 int ii; /* Iterator variable */
shane63207ab2009-02-04 01:49:30 +0000291 int nSrcPage = -1; /* Size of source db in pages */
danielk197704103022009-02-03 16:51:24 +0000292 int bCloseTrans = 0; /* True if src db requires unlocking */
293
294 /* If the source pager is currently in a write-transaction, return
295 ** SQLITE_LOCKED immediately.
296 */
297 if( p->pDestDb && p->pSrc->pBt->inTransaction==TRANS_WRITE ){
298 rc = SQLITE_LOCKED;
danielk197703ab0352009-02-06 05:59:44 +0000299 }else{
300 rc = SQLITE_OK;
danielk197704103022009-02-03 16:51:24 +0000301 }
302
303 /* Lock the destination database, if it is not locked already. */
304 if( SQLITE_OK==rc && p->bDestLocked==0
305 && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2))
306 ){
307 p->bDestLocked = 1;
308 rc = sqlite3BtreeGetMeta(p->pDest, 1, &p->iDestSchema);
309 }
310
311 /* If there is no open read-transaction on the source database, open
312 ** one now. If a transaction is opened here, then it will be closed
313 ** before this function exits.
314 */
315 if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){
316 rc = sqlite3BtreeBeginTrans(p->pSrc, 0);
317 bCloseTrans = 1;
318 }
319
320 /* Now that there is a read-lock on the source database, query the
321 ** source pager for the number of pages in the database.
322 */
323 if( rc==SQLITE_OK ){
324 rc = sqlite3PagerPagecount(pSrcPager, &nSrcPage);
325 }
danielk197703ab0352009-02-06 05:59:44 +0000326 for(ii=0; (nPage<0 || ii<nPage) && p->iNext<=(Pgno)nSrcPage && !rc; ii++){
danielk197704103022009-02-03 16:51:24 +0000327 const Pgno iSrcPg = p->iNext; /* Source page number */
328 if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){
329 DbPage *pSrcPg; /* Source page object */
330 rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
331 if( rc==SQLITE_OK ){
332 rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg));
333 sqlite3PagerUnref(pSrcPg);
334 }
335 }
336 p->iNext++;
337 }
338 if( rc==SQLITE_OK ){
339 p->nPagecount = nSrcPage;
340 p->nRemaining = nSrcPage+1-p->iNext;
shane63207ab2009-02-04 01:49:30 +0000341 if( p->iNext>(Pgno)nSrcPage ){
danielk197704103022009-02-03 16:51:24 +0000342 rc = SQLITE_DONE;
343 }
344 }
345
346 if( rc==SQLITE_DONE ){
347 const int nSrcPagesize = sqlite3BtreeGetPageSize(p->pSrc);
348 const int nDestPagesize = sqlite3BtreeGetPageSize(p->pDest);
349 int nDestTruncate;
danielk197704103022009-02-03 16:51:24 +0000350
351 /* Update the schema version field in the destination database. This
352 ** is to make sure that the schema-version really does change in
353 ** the case where the source and destination databases have the
354 ** same schema version.
355 */
356 sqlite3BtreeUpdateMeta(p->pDest, 1, p->iDestSchema+1);
drhd3a5c502009-02-03 22:51:06 +0000357 if( p->pDestDb ){
358 sqlite3ResetInternalSchema(p->pDestDb, 0);
359 }
danielk197704103022009-02-03 16:51:24 +0000360
361 /* Set nDestTruncate to the final number of pages in the destination
362 ** database. The complication here is that the destination page
363 ** size may be different to the source page size.
364 **
365 ** If the source page size is smaller than the destination page size,
366 ** round up. In this case the call to sqlite3OsTruncate() below will
367 ** fix the size of the file. However it is important to call
368 ** sqlite3PagerTruncateImage() here so that any pages in the
369 ** destination file that lie beyond the nDestTruncate page mark are
370 ** journalled by PagerCommitPhaseOne() before they are destroyed
371 ** by the file truncation.
372 */
373 if( nSrcPagesize<nDestPagesize ){
374 int ratio = nDestPagesize/nSrcPagesize;
375 nDestTruncate = (nSrcPage+ratio-1)/ratio;
drh38aec8d2009-02-16 16:23:09 +0000376 if( nDestTruncate==(int)PENDING_BYTE_PAGE(p->pDest->pBt) ){
danielk1977f2a79f22009-02-12 17:01:49 +0000377 nDestTruncate--;
378 }
danielk197704103022009-02-03 16:51:24 +0000379 }else{
380 nDestTruncate = nSrcPage * (nSrcPagesize/nDestPagesize);
381 }
382 sqlite3PagerTruncateImage(pDestPager, nDestTruncate);
383
384 if( nSrcPagesize<nDestPagesize ){
385 /* If the source page-size is smaller than the destination page-size,
386 ** two extra things may need to happen:
387 **
388 ** * The destination may need to be truncated, and
389 **
390 ** * Data stored on the pages immediately following the
391 ** pending-byte page in the source database may need to be
392 ** copied into the destination database.
393 */
danielk19773d0cbc32009-02-09 18:55:45 +0000394 const i64 iSize = (i64)nSrcPagesize * (i64)nSrcPage;
395 sqlite3_file * const pFile = sqlite3PagerFile(pDestPager);
396
danielk197704103022009-02-03 16:51:24 +0000397 assert( pFile );
danielk1977f2a79f22009-02-12 17:01:49 +0000398 assert( (i64)nDestTruncate*(i64)nDestPagesize >= iSize || (
399 nDestTruncate==(PENDING_BYTE_PAGE(p->pDest->pBt)-1)
400 && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+nDestPagesize
401 ));
danielk197704103022009-02-03 16:51:24 +0000402 if( SQLITE_OK==(rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1))
danielk19773d0cbc32009-02-09 18:55:45 +0000403 && SQLITE_OK==(rc = backupTruncateFile(pFile, iSize))
danielk197704103022009-02-03 16:51:24 +0000404 && SQLITE_OK==(rc = sqlite3PagerSync(pDestPager))
405 ){
406 i64 iOff;
407 i64 iEnd = MIN(PENDING_BYTE + nDestPagesize, iSize);
408 for(
409 iOff=PENDING_BYTE+nSrcPagesize;
410 rc==SQLITE_OK && iOff<iEnd;
411 iOff+=nSrcPagesize
412 ){
413 PgHdr *pSrcPg = 0;
shane63207ab2009-02-04 01:49:30 +0000414 const Pgno iSrcPg = (Pgno)((iOff/nSrcPagesize)+1);
danielk197704103022009-02-03 16:51:24 +0000415 rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
416 if( rc==SQLITE_OK ){
417 u8 *zData = sqlite3PagerGetData(pSrcPg);
418 rc = sqlite3OsWrite(pFile, zData, nSrcPagesize, iOff);
419 }
420 sqlite3PagerUnref(pSrcPg);
421 }
422 }
423 }else{
424 rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 0);
425 }
426
427 /* Finish committing the transaction to the destination database. */
428 if( SQLITE_OK==rc
429 && SQLITE_OK==(rc = sqlite3BtreeCommitPhaseTwo(p->pDest))
430 ){
431 rc = SQLITE_DONE;
432 }
433 }
434
435 /* If bCloseTrans is true, then this function opened a read transaction
436 ** on the source database. Close the read transaction here. There is
437 ** no need to check the return values of the btree methods here, as
438 ** "committing" a read-only transaction cannot fail.
439 */
440 if( bCloseTrans ){
441 TESTONLY( int rc2 );
442 TESTONLY( rc2 = ) sqlite3BtreeCommitPhaseOne(p->pSrc, 0);
443 TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc);
444 assert( rc2==SQLITE_OK );
445 }
446
danielk197703ab0352009-02-06 05:59:44 +0000447 p->rc = rc;
danielk197704103022009-02-03 16:51:24 +0000448 }
drhd3a5c502009-02-03 22:51:06 +0000449 if( p->pDestDb ){
450 sqlite3_mutex_leave(p->pDestDb->mutex);
451 }
danielk197704103022009-02-03 16:51:24 +0000452 sqlite3BtreeLeave(p->pSrc);
453 sqlite3_mutex_leave(p->pSrcDb->mutex);
454 return rc;
455}
456
457/*
458** Release all resources associated with an sqlite3_backup* handle.
459*/
460int sqlite3_backup_finish(sqlite3_backup *p){
461 sqlite3_backup **pp; /* Ptr to head of pagers backup list */
462 sqlite3_mutex *mutex; /* Mutex to protect source database */
463 int rc; /* Value to return */
464
465 /* Enter the mutexes */
466 sqlite3_mutex_enter(p->pSrcDb->mutex);
467 sqlite3BtreeEnter(p->pSrc);
468 mutex = p->pSrcDb->mutex;
drhd3a5c502009-02-03 22:51:06 +0000469 if( p->pDestDb ){
470 sqlite3_mutex_enter(p->pDestDb->mutex);
471 }
danielk197704103022009-02-03 16:51:24 +0000472
473 /* Detach this backup from the source pager. */
474 if( p->pDestDb ){
475 pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc));
476 while( *pp!=p ){
477 pp = &(*pp)->pNext;
478 }
479 *pp = p->pNext;
480 p->pSrc->nBackup--;
481 }
482
483 /* If a transaction is still open on the Btree, roll it back. */
484 sqlite3BtreeRollback(p->pDest);
485
486 /* Set the error code of the destination database handle. */
487 rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc;
488 sqlite3Error(p->pDestDb, rc, 0);
489
490 /* Exit the mutexes and free the backup context structure. */
drhd3a5c502009-02-03 22:51:06 +0000491 if( p->pDestDb ){
492 sqlite3_mutex_leave(p->pDestDb->mutex);
493 }
danielk197704103022009-02-03 16:51:24 +0000494 sqlite3BtreeLeave(p->pSrc);
495 if( p->pDestDb ){
496 sqlite3_free(p);
497 }
498 sqlite3_mutex_leave(mutex);
499 return rc;
500}
501
502/*
503** Return the number of pages still to be backed up as of the most recent
504** call to sqlite3_backup_step().
505*/
506int sqlite3_backup_remaining(sqlite3_backup *p){
507 return p->nRemaining;
508}
509
510/*
511** Return the total number of pages in the source database as of the most
512** recent call to sqlite3_backup_step().
513*/
514int sqlite3_backup_pagecount(sqlite3_backup *p){
515 return p->nPagecount;
516}
517
518/*
519** This function is called after the contents of page iPage of the
520** source database have been modified. If page iPage has already been
521** copied into the destination database, then the data written to the
522** destination is now invalidated. The destination copy of iPage needs
523** to be updated with the new data before the backup operation is
524** complete.
525**
526** It is assumed that the mutex associated with the BtShared object
527** corresponding to the source database is held when this function is
528** called.
529*/
530void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){
531 sqlite3_backup *p; /* Iterator variable */
532 for(p=pBackup; p; p=p->pNext){
533 assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) );
danielk197703ab0352009-02-06 05:59:44 +0000534 if( !isFatalError(p->rc) && iPage<p->iNext ){
danielk197704103022009-02-03 16:51:24 +0000535 /* The backup process p has already copied page iPage. But now it
536 ** has been modified by a transaction on the source pager. Copy
537 ** the new data into the backup.
538 */
539 int rc = backupOnePage(p, iPage, aData);
danielk197703ab0352009-02-06 05:59:44 +0000540 assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED );
danielk197704103022009-02-03 16:51:24 +0000541 if( rc!=SQLITE_OK ){
542 p->rc = rc;
543 }
544 }
545 }
546}
547
548/*
549** Restart the backup process. This is called when the pager layer
550** detects that the database has been modified by an external database
551** connection. In this case there is no way of knowing which of the
552** pages that have been copied into the destination database are still
553** valid and which are not, so the entire process needs to be restarted.
554**
555** It is assumed that the mutex associated with the BtShared object
556** corresponding to the source database is held when this function is
557** called.
558*/
559void sqlite3BackupRestart(sqlite3_backup *pBackup){
560 sqlite3_backup *p; /* Iterator variable */
561 for(p=pBackup; p; p=p->pNext){
562 assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) );
563 p->iNext = 1;
564 }
565}
566
567#ifndef SQLITE_OMIT_VACUUM
568/*
569** Copy the complete content of pBtFrom into pBtTo. A transaction
570** must be active for both files.
571**
572** The size of file pTo may be reduced by this operation. If anything
573** goes wrong, the transaction on pTo is rolled back. If successful, the
574** transaction is committed before returning.
575*/
576int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){
577 int rc;
578 sqlite3_backup b;
579 sqlite3BtreeEnter(pTo);
580 sqlite3BtreeEnter(pFrom);
581
582 /* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set
583 ** to 0. This is used by the implementations of sqlite3_backup_step()
584 ** and sqlite3_backup_finish() to detect that they are being called
585 ** from this function, not directly by the user.
586 */
587 memset(&b, 0, sizeof(b));
588 b.pSrcDb = pFrom->db;
589 b.pSrc = pFrom;
590 b.pDest = pTo;
591 b.iNext = 1;
592
593 /* 0x7FFFFFFF is the hard limit for the number of pages in a database
594 ** file. By passing this as the number of pages to copy to
595 ** sqlite3_backup_step(), we can guarantee that the copy finishes
596 ** within a single call (unless an error occurs). The assert() statement
597 ** checks this assumption - (p->rc) should be set to either SQLITE_DONE
598 ** or an error code.
599 */
600 sqlite3_backup_step(&b, 0x7FFFFFFF);
601 assert( b.rc!=SQLITE_OK );
602 rc = sqlite3_backup_finish(&b);
603 if( rc==SQLITE_OK ){
604 pTo->pBt->pageSizeFixed = 0;
605 }
606
607 sqlite3BtreeLeave(pFrom);
608 sqlite3BtreeLeave(pTo);
609 return rc;
610}
611#endif /* SQLITE_OMIT_VACUUM */