OLD | NEW |
1 /* | 1 /* |
2 ** 2007 September 14 | 2 ** 2007 September 14 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 ** Write data to a tmp-file. | 281 ** Write data to a tmp-file. |
282 */ | 282 */ |
283 static int tmpWrite( | 283 static int tmpWrite( |
284 sqlite3_file *pFile, | 284 sqlite3_file *pFile, |
285 const void *zBuf, | 285 const void *zBuf, |
286 int iAmt, | 286 int iAmt, |
287 sqlite_int64 iOfst | 287 sqlite_int64 iOfst |
288 ){ | 288 ){ |
289 tmp_file *pTmp = (tmp_file *)pFile; | 289 tmp_file *pTmp = (tmp_file *)pFile; |
290 if( (iAmt+iOfst)>pTmp->nAlloc ){ | 290 if( (iAmt+iOfst)>pTmp->nAlloc ){ |
291 int nNew = 2*(iAmt+iOfst+pTmp->nAlloc); | 291 int nNew = (int)(2*(iAmt+iOfst+pTmp->nAlloc)); |
292 char *zNew = sqlite3_realloc(pTmp->zAlloc, nNew); | 292 char *zNew = sqlite3_realloc(pTmp->zAlloc, nNew); |
293 if( !zNew ){ | 293 if( !zNew ){ |
294 return SQLITE_NOMEM; | 294 return SQLITE_NOMEM; |
295 } | 295 } |
296 pTmp->zAlloc = zNew; | 296 pTmp->zAlloc = zNew; |
297 pTmp->nAlloc = nNew; | 297 pTmp->nAlloc = nNew; |
298 } | 298 } |
299 memcpy(&pTmp->zAlloc[iOfst], zBuf, iAmt); | 299 memcpy(&pTmp->zAlloc[iOfst], zBuf, iAmt); |
300 pTmp->nSize = MAX(pTmp->nSize, iOfst+iAmt); | 300 pTmp->nSize = (int)MAX(pTmp->nSize, iOfst+iAmt); |
301 return SQLITE_OK; | 301 return SQLITE_OK; |
302 } | 302 } |
303 | 303 |
304 /* | 304 /* |
305 ** Truncate a tmp-file. | 305 ** Truncate a tmp-file. |
306 */ | 306 */ |
307 static int tmpTruncate(sqlite3_file *pFile, sqlite_int64 size){ | 307 static int tmpTruncate(sqlite3_file *pFile, sqlite_int64 size){ |
308 tmp_file *pTmp = (tmp_file *)pFile; | 308 tmp_file *pTmp = (tmp_file *)pFile; |
309 pTmp->nSize = MIN(pTmp->nSize, size); | 309 pTmp->nSize = (int)MIN(pTmp->nSize, size); |
310 return SQLITE_OK; | 310 return SQLITE_OK; |
311 } | 311 } |
312 | 312 |
313 /* | 313 /* |
314 ** Sync a tmp-file. | 314 ** Sync a tmp-file. |
315 */ | 315 */ |
316 static int tmpSync(sqlite3_file *pFile, int flags){ | 316 static int tmpSync(sqlite3_file *pFile, int flags){ |
317 return SQLITE_OK; | 317 return SQLITE_OK; |
318 } | 318 } |
319 | 319 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 if( (p->eType==DATABASE_FILE && (iAmt+iOfst)>pReal->nDatabase) | 411 if( (p->eType==DATABASE_FILE && (iAmt+iOfst)>pReal->nDatabase) |
412 || (p->eType==JOURNAL_FILE && (iAmt+iOfst)>pReal->nJournal) | 412 || (p->eType==JOURNAL_FILE && (iAmt+iOfst)>pReal->nJournal) |
413 ){ | 413 ){ |
414 rc = SQLITE_IOERR_SHORT_READ; | 414 rc = SQLITE_IOERR_SHORT_READ; |
415 }else if( p->eType==DATABASE_FILE ){ | 415 }else if( p->eType==DATABASE_FILE ){ |
416 rc = pF->pMethods->xRead(pF, zBuf, iAmt, iOfst+BLOCKSIZE); | 416 rc = pF->pMethods->xRead(pF, zBuf, iAmt, iOfst+BLOCKSIZE); |
417 }else{ | 417 }else{ |
418 /* Journal file. */ | 418 /* Journal file. */ |
419 int iRem = iAmt; | 419 int iRem = iAmt; |
420 int iBuf = 0; | 420 int iBuf = 0; |
421 int ii = iOfst; | 421 int ii = (int)iOfst; |
422 while( iRem>0 && rc==SQLITE_OK ){ | 422 while( iRem>0 && rc==SQLITE_OK ){ |
423 int iRealOff = pReal->nBlob - BLOCKSIZE*((ii/BLOCKSIZE)+1) + ii%BLOCKSIZE; | 423 int iRealOff = pReal->nBlob - BLOCKSIZE*((ii/BLOCKSIZE)+1) + ii%BLOCKSIZE; |
424 int iRealAmt = MIN(iRem, BLOCKSIZE - (iRealOff%BLOCKSIZE)); | 424 int iRealAmt = MIN(iRem, BLOCKSIZE - (iRealOff%BLOCKSIZE)); |
425 | 425 |
426 rc = pF->pMethods->xRead(pF, &((char *)zBuf)[iBuf], iRealAmt, iRealOff); | 426 rc = pF->pMethods->xRead(pF, &((char *)zBuf)[iBuf], iRealAmt, iRealOff); |
427 ii += iRealAmt; | 427 ii += iRealAmt; |
428 iBuf += iRealAmt; | 428 iBuf += iRealAmt; |
429 iRem -= iRealAmt; | 429 iRem -= iRealAmt; |
430 } | 430 } |
431 } | 431 } |
(...skipping 14 matching lines...) Expand all Loading... |
446 fs_file *p = (fs_file *)pFile; | 446 fs_file *p = (fs_file *)pFile; |
447 fs_real_file *pReal = p->pReal; | 447 fs_real_file *pReal = p->pReal; |
448 sqlite3_file *pF = pReal->pFile; | 448 sqlite3_file *pF = pReal->pFile; |
449 | 449 |
450 if( p->eType==DATABASE_FILE ){ | 450 if( p->eType==DATABASE_FILE ){ |
451 if( (iAmt+iOfst+BLOCKSIZE)>(pReal->nBlob-pReal->nJournal) ){ | 451 if( (iAmt+iOfst+BLOCKSIZE)>(pReal->nBlob-pReal->nJournal) ){ |
452 rc = SQLITE_FULL; | 452 rc = SQLITE_FULL; |
453 }else{ | 453 }else{ |
454 rc = pF->pMethods->xWrite(pF, zBuf, iAmt, iOfst+BLOCKSIZE); | 454 rc = pF->pMethods->xWrite(pF, zBuf, iAmt, iOfst+BLOCKSIZE); |
455 if( rc==SQLITE_OK ){ | 455 if( rc==SQLITE_OK ){ |
456 pReal->nDatabase = MAX(pReal->nDatabase, iAmt+iOfst); | 456 pReal->nDatabase = (int)MAX(pReal->nDatabase, iAmt+iOfst); |
457 } | 457 } |
458 } | 458 } |
459 }else{ | 459 }else{ |
460 /* Journal file. */ | 460 /* Journal file. */ |
461 int iRem = iAmt; | 461 int iRem = iAmt; |
462 int iBuf = 0; | 462 int iBuf = 0; |
463 int ii = iOfst; | 463 int ii = (int)iOfst; |
464 while( iRem>0 && rc==SQLITE_OK ){ | 464 while( iRem>0 && rc==SQLITE_OK ){ |
465 int iRealOff = pReal->nBlob - BLOCKSIZE*((ii/BLOCKSIZE)+1) + ii%BLOCKSIZE; | 465 int iRealOff = pReal->nBlob - BLOCKSIZE*((ii/BLOCKSIZE)+1) + ii%BLOCKSIZE; |
466 int iRealAmt = MIN(iRem, BLOCKSIZE - (iRealOff%BLOCKSIZE)); | 466 int iRealAmt = MIN(iRem, BLOCKSIZE - (iRealOff%BLOCKSIZE)); |
467 | 467 |
468 if( iRealOff<(pReal->nDatabase+BLOCKSIZE) ){ | 468 if( iRealOff<(pReal->nDatabase+BLOCKSIZE) ){ |
469 rc = SQLITE_FULL; | 469 rc = SQLITE_FULL; |
470 }else{ | 470 }else{ |
471 rc = pF->pMethods->xWrite(pF, &((char *)zBuf)[iBuf], iRealAmt,iRealOff); | 471 rc = pF->pMethods->xWrite(pF, &((char *)zBuf)[iBuf], iRealAmt,iRealOff); |
472 ii += iRealAmt; | 472 ii += iRealAmt; |
473 iBuf += iRealAmt; | 473 iBuf += iRealAmt; |
474 iRem -= iRealAmt; | 474 iRem -= iRealAmt; |
475 } | 475 } |
476 } | 476 } |
477 if( rc==SQLITE_OK ){ | 477 if( rc==SQLITE_OK ){ |
478 pReal->nJournal = MAX(pReal->nJournal, iAmt+iOfst); | 478 pReal->nJournal = (int)MAX(pReal->nJournal, iAmt+iOfst); |
479 } | 479 } |
480 } | 480 } |
481 | 481 |
482 return rc; | 482 return rc; |
483 } | 483 } |
484 | 484 |
485 /* | 485 /* |
486 ** Truncate an fs-file. | 486 ** Truncate an fs-file. |
487 */ | 487 */ |
488 static int fsTruncate(sqlite3_file *pFile, sqlite_int64 size){ | 488 static int fsTruncate(sqlite3_file *pFile, sqlite_int64 size){ |
489 fs_file *p = (fs_file *)pFile; | 489 fs_file *p = (fs_file *)pFile; |
490 fs_real_file *pReal = p->pReal; | 490 fs_real_file *pReal = p->pReal; |
491 if( p->eType==DATABASE_FILE ){ | 491 if( p->eType==DATABASE_FILE ){ |
492 pReal->nDatabase = MIN(pReal->nDatabase, size); | 492 pReal->nDatabase = (int)MIN(pReal->nDatabase, size); |
493 }else{ | 493 }else{ |
494 pReal->nJournal = MIN(pReal->nJournal, size); | 494 pReal->nJournal = (int)MIN(pReal->nJournal, size); |
495 } | 495 } |
496 return SQLITE_OK; | 496 return SQLITE_OK; |
497 } | 497 } |
498 | 498 |
499 /* | 499 /* |
500 ** Sync an fs-file. | 500 ** Sync an fs-file. |
501 */ | 501 */ |
502 static int fsSync(sqlite3_file *pFile, int flags){ | 502 static int fsSync(sqlite3_file *pFile, int flags){ |
503 fs_file *p = (fs_file *)pFile; | 503 fs_file *p = (fs_file *)pFile; |
504 fs_real_file *pReal = p->pReal; | 504 fs_real_file *pReal = p->pReal; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 memset(p, 0, sizeof(*p)); | 599 memset(p, 0, sizeof(*p)); |
600 p->base.pMethods = &tmp_io_methods; | 600 p->base.pMethods = &tmp_io_methods; |
601 return SQLITE_OK; | 601 return SQLITE_OK; |
602 } | 602 } |
603 | 603 |
604 eType = ((flags&(SQLITE_OPEN_MAIN_DB))?DATABASE_FILE:JOURNAL_FILE); | 604 eType = ((flags&(SQLITE_OPEN_MAIN_DB))?DATABASE_FILE:JOURNAL_FILE); |
605 p->base.pMethods = &fs_io_methods; | 605 p->base.pMethods = &fs_io_methods; |
606 p->eType = eType; | 606 p->eType = eType; |
607 | 607 |
608 assert(strlen("-journal")==8); | 608 assert(strlen("-journal")==8); |
609 nName = strlen(zName)-((eType==JOURNAL_FILE)?8:0); | 609 nName = (int)strlen(zName)-((eType==JOURNAL_FILE)?8:0); |
610 pReal=pFsVfs->pFileList; | 610 pReal=pFsVfs->pFileList; |
611 for(; pReal && strncmp(pReal->zName, zName, nName); pReal=pReal->pNext); | 611 for(; pReal && strncmp(pReal->zName, zName, nName); pReal=pReal->pNext); |
612 | 612 |
613 if( !pReal ){ | 613 if( !pReal ){ |
614 int real_flags = (flags&~(SQLITE_OPEN_MAIN_DB))|SQLITE_OPEN_TEMP_DB; | 614 int real_flags = (flags&~(SQLITE_OPEN_MAIN_DB))|SQLITE_OPEN_TEMP_DB; |
615 sqlite3_int64 size; | 615 sqlite3_int64 size; |
616 sqlite3_file *pRealFile; | 616 sqlite3_file *pRealFile; |
617 sqlite3_vfs *pParent = pFsVfs->pParent; | 617 sqlite3_vfs *pParent = pFsVfs->pParent; |
618 assert(eType==DATABASE_FILE); | 618 assert(eType==DATABASE_FILE); |
619 | 619 |
(...skipping 14 matching lines...) Expand all Loading... |
634 | 634 |
635 rc = pRealFile->pMethods->xFileSize(pRealFile, &size); | 635 rc = pRealFile->pMethods->xFileSize(pRealFile, &size); |
636 if( rc!=SQLITE_OK ){ | 636 if( rc!=SQLITE_OK ){ |
637 goto open_out; | 637 goto open_out; |
638 } | 638 } |
639 if( size==0 ){ | 639 if( size==0 ){ |
640 rc = pRealFile->pMethods->xWrite(pRealFile, "\0", 1, BLOBSIZE-1); | 640 rc = pRealFile->pMethods->xWrite(pRealFile, "\0", 1, BLOBSIZE-1); |
641 pReal->nBlob = BLOBSIZE; | 641 pReal->nBlob = BLOBSIZE; |
642 }else{ | 642 }else{ |
643 unsigned char zS[4]; | 643 unsigned char zS[4]; |
644 pReal->nBlob = size; | 644 pReal->nBlob = (int)size; |
645 rc = pRealFile->pMethods->xRead(pRealFile, zS, 4, 0); | 645 rc = pRealFile->pMethods->xRead(pRealFile, zS, 4, 0); |
646 pReal->nDatabase = (zS[0]<<24)+(zS[1]<<16)+(zS[2]<<8)+zS[3]; | 646 pReal->nDatabase = (zS[0]<<24)+(zS[1]<<16)+(zS[2]<<8)+zS[3]; |
647 if( rc==SQLITE_OK ){ | 647 if( rc==SQLITE_OK ){ |
648 rc = pRealFile->pMethods->xRead(pRealFile, zS, 4, pReal->nBlob-4); | 648 rc = pRealFile->pMethods->xRead(pRealFile, zS, 4, pReal->nBlob-4); |
649 if( zS[0] || zS[1] || zS[2] || zS[3] ){ | 649 if( zS[0] || zS[1] || zS[2] || zS[3] ){ |
650 pReal->nJournal = pReal->nBlob; | 650 pReal->nJournal = pReal->nBlob; |
651 } | 651 } |
652 } | 652 } |
653 } | 653 } |
654 | 654 |
(...skipping 25 matching lines...) Expand all Loading... |
680 /* | 680 /* |
681 ** Delete the file located at zPath. If the dirSync argument is true, | 681 ** Delete the file located at zPath. If the dirSync argument is true, |
682 ** ensure the file-system modifications are synced to disk before | 682 ** ensure the file-system modifications are synced to disk before |
683 ** returning. | 683 ** returning. |
684 */ | 684 */ |
685 static int fsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ | 685 static int fsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ |
686 int rc = SQLITE_OK; | 686 int rc = SQLITE_OK; |
687 fs_vfs_t *pFsVfs = (fs_vfs_t *)pVfs; | 687 fs_vfs_t *pFsVfs = (fs_vfs_t *)pVfs; |
688 fs_real_file *pReal; | 688 fs_real_file *pReal; |
689 sqlite3_file *pF; | 689 sqlite3_file *pF; |
690 int nName = strlen(zPath) - 8; | 690 int nName = (int)strlen(zPath) - 8; |
691 | 691 |
692 assert(strlen("-journal")==8); | 692 assert(strlen("-journal")==8); |
693 assert(strcmp("-journal", &zPath[nName])==0); | 693 assert(strcmp("-journal", &zPath[nName])==0); |
694 | 694 |
695 pReal = pFsVfs->pFileList; | 695 pReal = pFsVfs->pFileList; |
696 for(; pReal && strncmp(pReal->zName, zPath, nName); pReal=pReal->pNext); | 696 for(; pReal && strncmp(pReal->zName, zPath, nName); pReal=pReal->pNext); |
697 if( pReal ){ | 697 if( pReal ){ |
698 pF = pReal->pFile; | 698 pF = pReal->pFile; |
699 rc = pF->pMethods->xWrite(pF, "\0\0\0\0", 4, pReal->nBlob-BLOCKSIZE); | 699 rc = pF->pMethods->xWrite(pF, "\0\0\0\0", 4, pReal->nBlob-BLOCKSIZE); |
700 if( rc==SQLITE_OK ){ | 700 if( rc==SQLITE_OK ){ |
701 pReal->nJournal = 0; | 701 pReal->nJournal = 0; |
702 } | 702 } |
703 } | 703 } |
704 return rc; | 704 return rc; |
705 } | 705 } |
706 | 706 |
707 /* | 707 /* |
708 ** Test for access permissions. Return true if the requested permission | 708 ** Test for access permissions. Return true if the requested permission |
709 ** is available, or false otherwise. | 709 ** is available, or false otherwise. |
710 */ | 710 */ |
711 static int fsAccess( | 711 static int fsAccess( |
712 sqlite3_vfs *pVfs, | 712 sqlite3_vfs *pVfs, |
713 const char *zPath, | 713 const char *zPath, |
714 int flags, | 714 int flags, |
715 int *pResOut | 715 int *pResOut |
716 ){ | 716 ){ |
717 fs_vfs_t *pFsVfs = (fs_vfs_t *)pVfs; | 717 fs_vfs_t *pFsVfs = (fs_vfs_t *)pVfs; |
718 fs_real_file *pReal; | 718 fs_real_file *pReal; |
719 int isJournal = 0; | 719 int isJournal = 0; |
720 int nName = strlen(zPath); | 720 int nName = (int)strlen(zPath); |
721 | 721 |
722 if( flags!=SQLITE_ACCESS_EXISTS ){ | 722 if( flags!=SQLITE_ACCESS_EXISTS ){ |
723 sqlite3_vfs *pParent = ((fs_vfs_t *)pVfs)->pParent; | 723 sqlite3_vfs *pParent = ((fs_vfs_t *)pVfs)->pParent; |
724 return pParent->xAccess(pParent, zPath, flags, pResOut); | 724 return pParent->xAccess(pParent, zPath, flags, pResOut); |
725 } | 725 } |
726 | 726 |
727 assert(strlen("-journal")==8); | 727 assert(strlen("-journal")==8); |
728 if( nName>8 && strcmp("-journal", &zPath[nName-8])==0 ){ | 728 if( nName>8 && strcmp("-journal", &zPath[nName-8])==0 ){ |
729 nName -= 8; | 729 nName -= 8; |
730 isJournal = 1; | 730 isJournal = 1; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 if( fs_vfs.pParent ) return SQLITE_OK; | 821 if( fs_vfs.pParent ) return SQLITE_OK; |
822 fs_vfs.pParent = sqlite3_vfs_find(0); | 822 fs_vfs.pParent = sqlite3_vfs_find(0); |
823 fs_vfs.base.mxPathname = fs_vfs.pParent->mxPathname; | 823 fs_vfs.base.mxPathname = fs_vfs.pParent->mxPathname; |
824 fs_vfs.base.szOsFile = MAX(sizeof(tmp_file), sizeof(fs_file)); | 824 fs_vfs.base.szOsFile = MAX(sizeof(tmp_file), sizeof(fs_file)); |
825 return sqlite3_vfs_register(&fs_vfs.base, 0); | 825 return sqlite3_vfs_register(&fs_vfs.base, 0); |
826 } | 826 } |
827 | 827 |
828 #ifdef SQLITE_TEST | 828 #ifdef SQLITE_TEST |
829 int SqlitetestOnefile_Init() {return fs_register();} | 829 int SqlitetestOnefile_Init() {return fs_register();} |
830 #endif | 830 #endif |
OLD | NEW |