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 bacae540479e7dc84bfbd059a20afa2ef00e8cdb Mon Sep 17 00:00:00 2001
From: mrossetti <mrossetti@chromium.org>
Date: Tue, 31 May 2011 23:12:11 +0000
Subject: [PATCH 03/10] 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 a1dec21..952e8d1 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 8fb4c25d..b180ee2 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 fcc0270..6ff3bd4 100644
--- a/third_party/sqlite/src/main.mk
+++ b/third_party/sqlite/src/main.mk
@@ -724,7 +724,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 2c904d2..74c76f37 100644
--- a/third_party/sqlite/src/src/pager.c
+++ b/third_party/sqlite/src/src/pager.c
@@ -5497,6 +5497,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
@@ -5561,6 +5575,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 c01bbc7..745b910 100644
--- a/third_party/sqlite/src/src/sqliteInt.h
+++ b/third_party/sqlite/src/src/sqliteInt.h
@@ -3168,6 +3168,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.7.0
|