Home | History | Annotate | Download | only in sqlite
      1 Index: src/sqliteInt.h
      2 ===================================================================
      3 --- src/sqliteInt.h	(revision 87306)
      4 +++ src/sqliteInt.h	(working copy)
      5 @@ -2522,6 +2522,16 @@
      6  #endif
      7  
      8  /*
      9 +** The CoreServices.h and CoreFoundation.h headers are needed for excluding a
     10 +** -journal file from Time Machine backups when its associated database has
     11 +** previously been excluded by the client code.
     12 +*/
     13 +#if defined(__APPLE__)
     14 +#include <CoreServices/CoreServices.h>
     15 +#include <CoreFoundation/CoreFoundation.h>
     16 +#endif
     17 +
     18 +/*
     19  ** The following macros mimic the standard library functions toupper(),
     20  ** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The
     21  ** sqlite versions only work for ASCII characters, regardless of locale.
     22 Index: src/pager.c
     23 ===================================================================
     24 --- src/pager.c	(revision 87306)
     25 +++ src/pager.c	(working copy)
     26 @@ -5130,7 +5130,21 @@
     27    }
     28  }
     29  
     30 +#if defined(__APPLE__)
     31  /*
     32 +** Create and return a CFURLRef given a cstring containing the path to a file.
     33 +*/
     34 +static CFURLRef create_cfurl_from_cstring(const char* filePath){
     35 +  CFStringRef urlString = CFStringCreateWithFileSystemRepresentation(
     36 +      kCFAllocatorDefault, filePath);
     37 +  CFURLRef urlRef = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
     38 +      urlString, kCFURLPOSIXPathStyle, FALSE);
     39 +  CFRelease(urlString);
     40 +  return urlRef;
     41 +}
     42 +#endif
     43 +
     44 +/*
     45  ** This function is called at the start of every write transaction.
     46  ** There must already be a RESERVED or EXCLUSIVE lock on the database 
     47  ** file when this routine is called.
     48 @@ -5189,6 +5203,24 @@
     49    #else
     50          rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
     51    #endif
     52 +#if defined(__APPLE__)
     53 +        /* Set the TimeMachine exclusion metadata for the journal if it has
     54 +        ** been set for the database. Only do this for unix-type vfs
     55 +        ** implementations. */
     56 +        if( rc==SQLITE_OK && pPager->zFilename!=NULL
     57 +         && strlen(pPager->zFilename)>0
     58 +         && strncmp(pVfs->zName, "unix", 4)==0
     59 +         && ( pVfs->zName[4]=='-' || pVfs->zName[4]=='\0' ) ){
     60 +          CFURLRef database = create_cfurl_from_cstring(pPager->zFilename);
     61 +          if( CSBackupIsItemExcluded(database, NULL) ){
     62 +            CFURLRef journal = create_cfurl_from_cstring(pPager->zJournal);
     63 +            /* Ignore errors from the following exclusion call. */
     64 +            CSBackupSetItemExcluded(journal, TRUE, FALSE);
     65 +            CFRelease(journal);
     66 +          }
     67 +          CFRelease(database);
     68 +        }
     69 +#endif
     70        }
     71        assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
     72      }
     73 Index: ext/fts3/fts3_porter.c
     74 ===================================================================
     75 --- ext/fts3/fts3_porter.c	(revision 87306)
     76 +++ ext/fts3/fts3_porter.c	(working copy)
     77 @@ -129,7 +129,7 @@
     78  /*
     79  ** Vowel or consonant
     80  */
     81 -static const char cType[] = {
     82 +static const char vOrCType[] = {
     83     0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
     84     1, 1, 1, 2, 1
     85  };
     86 @@ -153,7 +153,7 @@
     87    char x = *z;
     88    if( x==0 ) return 0;
     89    assert( x>='a' && x<='z' );
     90 -  j = cType[x-'a'];
     91 +  j = vOrCType[x-'a'];
     92    if( j<2 ) return j;
     93    return z[1]==0 || isVowel(z + 1);
     94  }
     95 @@ -162,7 +162,7 @@
     96    char x = *z;
     97    if( x==0 ) return 0;
     98    assert( x>='a' && x<='z' );
     99 -  j = cType[x-'a'];
    100 +  j = vOrCType[x-'a'];
    101    if( j<2 ) return 1-j;
    102    return isConsonant(z + 1);
    103  }
    104