summaryrefslogtreecommitdiffstats
path: root/third_party/sqlite/patches/0004-Exclude-journal-file-from-Time-Machine-if-database-i.patch
blob: b9cf9d517401bc0428cdc2a2620a62461c8f691f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
From edfff157e1d9292bfcce6553b76ee913b53b1aa1 Mon Sep 17 00:00:00 2001
From: mrossetti <mrossetti@chromium.org>
Date: Tue, 31 May 2011 23:12:11 +0000
Subject: [PATCH 04/16] Exclude journal file from Time Machine if database is
 excluded.

BUG=74053

Original review URL: http://codereview.chromium.org/6990066

TODO(shess): The fts3_porter.c change is due to a conflict with an included
Apple library.  Perhaps move the operative code to a .c file, and firewall
SQLite from that include.

TODO(shess): Revisit this for -wal mode.  http://crbug.com/78507
---
 third_party/sqlite/src/Makefile.linux-gcc     |  4 ++++
 third_party/sqlite/src/ext/fts3/fts3_porter.c |  6 ++---
 third_party/sqlite/src/main.mk                |  2 +-
 third_party/sqlite/src/src/pager.c            | 32 +++++++++++++++++++++++++++
 third_party/sqlite/src/src/sqliteInt.h        | 10 +++++++++
 5 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/third_party/sqlite/src/Makefile.linux-gcc b/third_party/sqlite/src/Makefile.linux-gcc
index 6d67ba7..554bf56 100644
--- a/third_party/sqlite/src/Makefile.linux-gcc
+++ b/third_party/sqlite/src/Makefile.linux-gcc
@@ -44,7 +44,11 @@ THREADLIB = -lpthread
 #### Specify any extra libraries needed to access required functions.
 #
 #TLIBS = -lrt    # fdatasync on Solaris 8
+ifeq ($(shell uname -s),Darwin)
+TLIBS = -framework CoreServices
+else
 TLIBS = -ldl
+endif
 
 #### Leave SQLITE_DEBUG undefined for maximum speed.  Use SQLITE_DEBUG=1
 #    to check for memory leaks.  Use SQLITE_DEBUG=2 to print a log of all
diff --git a/third_party/sqlite/src/ext/fts3/fts3_porter.c b/third_party/sqlite/src/ext/fts3/fts3_porter.c
index db175ac..933602a 100644
--- a/third_party/sqlite/src/ext/fts3/fts3_porter.c
+++ b/third_party/sqlite/src/ext/fts3/fts3_porter.c
@@ -128,7 +128,7 @@ static int porterClose(sqlite3_tokenizer_cursor *pCursor){
 /*
 ** 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
 };
@@ -152,7 +152,7 @@ static int isConsonant(const char *z){
   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);
 }
@@ -161,7 +161,7 @@ static int isVowel(const char *z){
   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);
 }
diff --git a/third_party/sqlite/src/main.mk b/third_party/sqlite/src/main.mk
index 4a7ac02..dc56b0d 100644
--- a/third_party/sqlite/src/main.mk
+++ b/third_party/sqlite/src/main.mk
@@ -591,7 +591,7 @@ TESTFIXTURE_FLAGS += -DSQLITE_SERVER=1 -DSQLITE_PRIVATE="" -DSQLITE_CORE
 testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c
 	$(TCCX) $(TCL_FLAGS) -DTCLSH=1 $(TESTFIXTURE_FLAGS)                  \
 		$(TESTSRC) $(TESTSRC2) $(TOP)/src/tclsqlite.c                \
-		-o testfixture$(EXE) $(LIBTCL) libsqlite3.a $(THREADLIB)
+		-o testfixture$(EXE) $(LIBTCL) libsqlite3.a $(THREADLIB) $(TLIBS)
 
 amalgamation-testfixture$(EXE): sqlite3.c $(TESTSRC) $(TOP)/src/tclsqlite.c
 	$(TCCX) $(TCL_FLAGS) -DTCLSH=1 $(TESTFIXTURE_FLAGS)                  \
diff --git a/third_party/sqlite/src/src/pager.c b/third_party/sqlite/src/src/pager.c
index d840a39..34fa50f 100644
--- a/third_party/sqlite/src/src/pager.c
+++ b/third_party/sqlite/src/src/pager.c
@@ -5467,6 +5467,20 @@ void sqlite3PagerUnref(DbPage *pPg){
   if( pPg ) sqlite3PagerUnrefNotNull(pPg);
 }
 
+#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 
@@ -5531,6 +5545,24 @@ static int pager_open_journal(Pager *pPager){
 #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) );
diff --git a/third_party/sqlite/src/src/sqliteInt.h b/third_party/sqlite/src/src/sqliteInt.h
index 63036c5..9d6a7d8 100644
--- a/third_party/sqlite/src/src/sqliteInt.h
+++ b/third_party/sqlite/src/src/sqliteInt.h
@@ -2985,6 +2985,16 @@ int sqlite3CantopenError(int);
 #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.
-- 
2.2.1