summaryrefslogtreecommitdiffstats
path: root/third_party/sqlite/patches/0005-Modify-default-VFS-to-support-WebDatabase.patch
blob: 45d6b25757c678de77d81cb8717a1d37384c7746 (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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
From 67024286d2719aec049605896ef0afec6932f184 Mon Sep 17 00:00:00 2001
From: dumi <dumi@chromium.org>
Date: Mon, 20 Jul 2009 23:40:51 +0000
Subject: [PATCH 05/16] Modify default VFS to support WebDatabase.

The renderer WebDatabase implementation needs to broker certain requests
to the browser.  This modifies SQLite to allow monkey-patching the VFS
to support this.

NOTE(shess): This patch relies on core SQLite implementation details
remaining unchanged.  When importing a new version of SQLite, pay very
close attention to whether the change is still doing what is intended.

Original review URLs:
https://codereview.chromium.org/159044
https://codereview.chromium.org/384075
https://codereview.chromium.org/377039
[Possibly not a complete list.]
---
 third_party/sqlite/src/src/os_unix.c | 95 ++++++++++++++++++++++++++++++------
 third_party/sqlite/src/src/os_win.c  |  7 +++
 2 files changed, 86 insertions(+), 16 deletions(-)

diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/os_unix.c
index a9344ee..1624f6a 100644
--- a/third_party/sqlite/src/src/os_unix.c
+++ b/third_party/sqlite/src/src/os_unix.c
@@ -1321,6 +1321,12 @@ static int fileHasMoved(unixFile *pFile){
   return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId;
 #else
   struct stat buf;
+
+  /* TODO(shess): This check doesn't work when the Chromium's WebDB code is
+  ** running in the sandbox.
+  */
+  return 0;
+
   return pFile->pInode!=0 &&
       (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino);
 #endif
@@ -5615,6 +5621,73 @@ static int findCreateFileMode(
 }
 
 /*
+** Initializes a unixFile structure with zeros.
+*/
+void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file) {
+  memset(file, 0, sizeof(unixFile));
+}
+
+int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs,
+                                               int fd,
+                                               int dirfd,
+                                               sqlite3_file* file,
+                                               const char* fileName,
+                                               int noLock) {
+  int ctrlFlags = (noLock ? UNIXFILE_NOLOCK : 0);
+  return fillInUnixFile(vfs, fd, file, fileName, ctrlFlags);
+}
+
+/*
+** Search for an unused file descriptor that was opened on the database file.
+** If a suitable file descriptor if found, then it is stored in *fd; otherwise,
+** *fd is not modified.
+**
+** If a reusable file descriptor is not found, and a new UnixUnusedFd cannot
+** be allocated, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK is returned.
+*/
+int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file,
+                                              const char* fileName,
+                                              int flags,
+                                              int* fd) {
+  unixFile* unixSQLite3File = (unixFile*)file;
+  int fileType = flags & 0xFFFFFF00;
+  if (fileType == SQLITE_OPEN_MAIN_DB) {
+    UnixUnusedFd *unusedFd = findReusableFd(fileName, flags);
+    if (unusedFd) {
+      *fd = unusedFd->fd;
+    } else {
+      unusedFd = sqlite3_malloc(sizeof(*unusedFd));
+      if (!unusedFd) {
+        return SQLITE_NOMEM;
+      }
+    }
+    unixSQLite3File->pUnused = unusedFd;
+  }
+  return SQLITE_OK;
+}
+
+/*
+** Marks 'fd' as the unused file descriptor for 'pFile'.
+*/
+void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file,
+                                                  int fd,
+                                                  int flags) {
+  unixFile* unixSQLite3File = (unixFile*)file;
+  if (unixSQLite3File->pUnused) {
+    unixSQLite3File->pUnused->fd = fd;
+    unixSQLite3File->pUnused->flags = flags;
+  }
+}
+
+/*
+** Destroys pFile's field that keeps track of the unused file descriptor.
+*/
+void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file) {
+  unixFile* unixSQLite3File = (unixFile*)file;
+  sqlite3_free(unixSQLite3File->pUnused);
+}
+
+/*
 ** Open the file zPath.
 ** 
 ** Previously, the SQLite OS layer used three functions in place of this
@@ -5715,20 +5788,13 @@ static int unixOpen(
     sqlite3_randomness(0,0);
   }
 
-  memset(p, 0, sizeof(unixFile));
+  chromium_sqlite3_initialize_unix_sqlite3_file(pFile);
 
   if( eType==SQLITE_OPEN_MAIN_DB ){
-    UnixUnusedFd *pUnused;
-    pUnused = findReusableFd(zName, flags);
-    if( pUnused ){
-      fd = pUnused->fd;
-    }else{
-      pUnused = sqlite3_malloc(sizeof(*pUnused));
-      if( !pUnused ){
-        return SQLITE_NOMEM;
-      }
+    rc = chromium_sqlite3_get_reusable_file_handle(pFile, zName, flags, &fd);
+    if( rc!=SQLITE_OK ){
+      return rc;
     }
-    p->pUnused = pUnused;
 
     /* Database filenames are double-zero terminated if they are not
     ** URIs with parameters.  Hence, they can always be passed into
@@ -5798,10 +5864,7 @@ static int unixOpen(
     *pOutFlags = flags;
   }
 
-  if( p->pUnused ){
-    p->pUnused->fd = fd;
-    p->pUnused->flags = flags;
-  }
+  chromium_sqlite3_update_reusable_file_handle(pFile, fd, flags);
 
   if( isDelete ){
 #if OS_VXWORKS
@@ -5893,7 +5956,7 @@ static int unixOpen(
 
 open_finished:
   if( rc!=SQLITE_OK ){
-    sqlite3_free(p->pUnused);
+    chromium_sqlite3_destroy_reusable_file_handle(pFile);
   }
   return rc;
 }
diff --git a/third_party/sqlite/src/src/os_win.c b/third_party/sqlite/src/src/os_win.c
index 8ca2107..5b0a296 100644
--- a/third_party/sqlite/src/src/os_win.c
+++ b/third_party/sqlite/src/src/os_win.c
@@ -5546,4 +5546,11 @@ int sqlite3_os_end(void){
   return SQLITE_OK;
 }
 
+void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE handle) {
+  winFile* winSQLite3File = (winFile*)file;
+  memset(file, 0, sizeof(*file));
+  winSQLite3File->pMethod = &winIoMethod;
+  winSQLite3File->h = handle;
+}
+
 #endif /* SQLITE_OS_WIN */
-- 
2.2.1