Index: third_party/sqlite/mac_time_machine.patch |
diff --git a/third_party/sqlite/mac_time_machine.patch b/third_party/sqlite/mac_time_machine.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bfd113b6d1c52642908412cecbfdc75a86a3c310 |
--- /dev/null |
+++ b/third_party/sqlite/mac_time_machine.patch |
@@ -0,0 +1,103 @@ |
+Index: src/sqliteInt.h |
+=================================================================== |
+--- src/sqliteInt.h (revision 87306) |
++++ src/sqliteInt.h (working copy) |
+@@ -2522,6 +2522,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. |
+Index: src/pager.c |
+=================================================================== |
+--- src/pager.c (revision 87306) |
++++ src/pager.c (working copy) |
+@@ -5130,7 +5130,21 @@ |
+ } |
+ } |
+ |
++#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* filePath){ |
++ CFStringRef urlString = CFStringCreateWithFileSystemRepresentation( |
++ kCFAllocatorDefault, filePath); |
++ CFURLRef urlRef = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, |
++ urlString, kCFURLPOSIXPathStyle, FALSE); |
++ CFRelease(urlString); |
++ return urlRef; |
++} |
++#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. |
+@@ -5189,6 +5203,24 @@ |
+ #else |
+ rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); |
+ #endif |
++#if defined(__APPLE__) |
++ /* Set the TimeMachine exclusion metadata for the journal if it has |
++ ** been set for the database. Only do this for unix-type vfs |
++ ** implementations. */ |
++ if( rc==SQLITE_OK && pPager->zFilename!=NULL |
++ && strlen(pPager->zFilename)>0 |
++ && strncmp(pVfs->zName, "unix", 4)==0 |
++ && ( pVfs->zName[4]=='-' || pVfs->zName[4]=='\0' ) ){ |
++ CFURLRef database = create_cfurl_from_cstring(pPager->zFilename); |
++ if( CSBackupIsItemExcluded(database, NULL) ){ |
++ CFURLRef journal = create_cfurl_from_cstring(pPager->zJournal); |
++ /* Ignore errors from the following exclusion call. */ |
++ CSBackupSetItemExcluded(journal, TRUE, FALSE); |
++ CFRelease(journal); |
++ } |
++ CFRelease(database); |
++ } |
++#endif |
+ } |
+ assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); |
+ } |
+Index: ext/fts3/fts3_porter.c |
+=================================================================== |
+--- ext/fts3/fts3_porter.c (revision 87306) |
++++ ext/fts3/fts3_porter.c (working copy) |
+@@ -129,7 +129,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 |
+ }; |
+@@ -153,7 +153,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); |
+ } |
+@@ -162,7 +162,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); |
+ } |