blob: 905609e010508b8b98506f3851eaece2dce0acd9 [file] [log] [blame]
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
+ && memcmp(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);
}