| Index: third_party/sqlite/amalgamation/sqlite3.c
|
| ===================================================================
|
| --- third_party/sqlite/amalgamation/sqlite3.c (revision 86831)
|
| +++ third_party/sqlite/amalgamation/sqlite3.c (working copy)
|
| @@ -10871,6 +10871,16 @@
|
| #endif
|
|
|
| /*
|
| +** The CoreServices.h and CoreFoundation.h headers are needed for excluding a
|
| +** -journal file from Time Machine backups when its associated database has
|
| +** previously been excluded by the client code.
|
| +*/
|
| +#if defined(__APPLE__)
|
| +#include <CoreServices/CoreServices.h>
|
| +#include <CoreFoundation/CoreFoundation.h>
|
| +#endif
|
| +
|
| +/*
|
| ** The following macros mimic the standard library functions toupper(),
|
| ** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The
|
| ** sqlite versions only work for ASCII characters, regardless of locale.
|
| @@ -36850,6 +36860,11 @@
|
| #define MAX_SECTOR_SIZE 0x10000
|
|
|
| /*
|
| +** The string appended to the database file name giving the journal file name.
|
| +*/
|
| +static const char kPagerJournalSuffix[] = "-journal";
|
| +
|
| +/*
|
| ** An instance of the following structure is allocated for each active
|
| ** savepoint and statement transaction in the system. All such structures
|
| ** are stored in the Pager.aSavepoint[] array, which is allocated and
|
| @@ -40825,9 +40840,10 @@
|
| pPager->zJournal = (char*)(pPtr += nPathname + 1);
|
| memcpy(pPager->zFilename, zPathname, nPathname);
|
| memcpy(pPager->zJournal, zPathname, nPathname);
|
| - memcpy(&pPager->zJournal[nPathname], "-journal", 8);
|
| + memcpy(&pPager->zJournal[nPathname], kPagerJournalSuffix,
|
| + strlen(kPagerJournalSuffix));
|
| #ifndef SQLITE_OMIT_WAL
|
| - pPager->zWal = &pPager->zJournal[nPathname+8+1];
|
| + pPager->zWal = &pPager->zJournal[nPathname+strlen(kPagerJournalSuffix)+1];
|
| memcpy(pPager->zWal, zPathname, nPathname);
|
| memcpy(&pPager->zWal[nPathname], "-wal", 4);
|
| #endif
|
| @@ -41551,7 +41567,20 @@
|
| }
|
| }
|
|
|
| +#if defined(__APPLE__)
|
| /*
|
| +** Create and return a CFURLRef given a cstring containing the path to a file.
|
| +*/
|
| +static CFURLRef create_cfurl_from_cstring(const char* file_path){
|
| + CFURLRef url_ref = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
|
| + CFStringCreateWithFileSystemRepresentation(
|
| + kCFAllocatorDefault, file_path),
|
| + kCFURLPOSIXPathStyle, FALSE);
|
| + return url_ref;
|
| +}
|
| +#endif
|
| +
|
| +/*
|
| ** This function is called at the start of every write transaction.
|
| ** There must already be a RESERVED or EXCLUSIVE lock on the database
|
| ** file when this routine is called.
|
| @@ -41612,6 +41641,28 @@
|
| #endif
|
| }
|
| assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
|
| +#if defined(__APPLE__)
|
| + if( rc == SQLITE_OK && pPager->zJournal ){
|
| + // Set the TimeMachine exclusion metadata for the journal if it has
|
| + // been set for the database.
|
| + int database_path_size = strlen(pPager->zJournal)
|
| + - strlen(kPagerJournalSuffix) + 1;
|
| + char *database_path = sqlite3Malloc(database_path_size);
|
| + CFURLRef database_url = NULL;
|
| + strlcpy(database_path, pPager->zJournal, database_path_size);
|
| + database_url = create_cfurl_from_cstring(database_path);
|
| + sqlite3_free(database_path);
|
| + Boolean exclude_by_path;
|
| + if( CSBackupIsItemExcluded(database_url, &exclude_by_path)
|
| + && !exclude_by_path){
|
| + CFURLRef journal_url = create_cfurl_from_cstring(pPager->zJournal);
|
| + // Ignore errors from the following exclusion call.
|
| + CSBackupSetItemExcluded(journal_url, TRUE, FALSE);
|
| + CFRelease(journal_url);
|
| + }
|
| + CFRelease(database_url);
|
| + }
|
| +#endif
|
| }
|
|
|
|
|
| @@ -112248,7 +112299,7 @@
|
| ** the prefix is longer than the previous term, or if the suffix
|
| ** causes overflow.
|
| */
|
| - if( nPrefix<0 || nSuffix<0 || nPrefix>nBuffer
|
| + if( nPrefix<0 || nSuffix<0 /* || nPrefix>nBuffer */
|
| || &zCsr[nSuffix]<zCsr || &zCsr[nSuffix]>zEnd ){
|
| rc = SQLITE_CORRUPT;
|
| goto finish_scan;
|
| @@ -116631,7 +116682,7 @@
|
| /*
|
| ** Vowel or consonant
|
| */
|
| -static const char cType[] = {
|
| +static const char vOrCType[] = {
|
| 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
|
| 1, 1, 1, 2, 1
|
| };
|
| @@ -116655,7 +116706,7 @@
|
| char x = *z;
|
| if( x==0 ) return 0;
|
| assert( x>='a' && x<='z' );
|
| - j = cType[x-'a'];
|
| + j = vOrCType[x-'a'];
|
| if( j<2 ) return j;
|
| return z[1]==0 || isVowel(z + 1);
|
| }
|
| @@ -116664,7 +116715,7 @@
|
| char x = *z;
|
| if( x==0 ) return 0;
|
| assert( x>='a' && x<='z' );
|
| - j = cType[x-'a'];
|
| + j = vOrCType[x-'a'];
|
| if( j<2 ) return 1-j;
|
| return isConsonant(z + 1);
|
| }
|
|
|