OLD | NEW |
1 /* | 1 /* |
2 ** 2004 May 22 | 2 ** 2004 May 22 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 */ | 77 */ |
78 #ifndef OS_VXWORKS | 78 #ifndef OS_VXWORKS |
79 # if defined(__RTP__) || defined(_WRS_KERNEL) | 79 # if defined(__RTP__) || defined(_WRS_KERNEL) |
80 # define OS_VXWORKS 1 | 80 # define OS_VXWORKS 1 |
81 # else | 81 # else |
82 # define OS_VXWORKS 0 | 82 # define OS_VXWORKS 0 |
83 # endif | 83 # endif |
84 #endif | 84 #endif |
85 | 85 |
86 /* | 86 /* |
87 ** These #defines should enable >2GB file support on Posix if the | |
88 ** underlying operating system supports it. If the OS lacks | |
89 ** large file support, these should be no-ops. | |
90 ** | |
91 ** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch | |
92 ** on the compiler command line. This is necessary if you are compiling | |
93 ** on a recent machine (ex: RedHat 7.2) but you want your code to work | |
94 ** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2 | |
95 ** without this option, LFS is enable. But LFS does not exist in the kernel | |
96 ** in RedHat 6.0, so the code won't work. Hence, for maximum binary | |
97 ** portability you should omit LFS. | |
98 ** | |
99 ** The previous paragraph was written in 2005. (This paragraph is written | |
100 ** on 2008-11-28.) These days, all Linux kernels support large files, so | |
101 ** you should probably leave LFS enabled. But some embedded platforms might | |
102 ** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful. | |
103 */ | |
104 #ifndef SQLITE_DISABLE_LFS | |
105 # define _LARGE_FILE 1 | |
106 # ifndef _FILE_OFFSET_BITS | |
107 # define _FILE_OFFSET_BITS 64 | |
108 # endif | |
109 # define _LARGEFILE_SOURCE 1 | |
110 #endif | |
111 | |
112 /* | |
113 ** standard include files. | 87 ** standard include files. |
114 */ | 88 */ |
115 #include <sys/types.h> | 89 #include <sys/types.h> |
116 #include <sys/stat.h> | 90 #include <sys/stat.h> |
117 #include <fcntl.h> | 91 #include <fcntl.h> |
118 #include <unistd.h> | 92 #include <unistd.h> |
119 #include <time.h> | 93 #include <time.h> |
120 #include <sys/time.h> | 94 #include <sys/time.h> |
121 #include <errno.h> | 95 #include <errno.h> |
122 #ifndef SQLITE_OMIT_WAL | 96 #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 |
123 #include <sys/mman.h> | 97 # include <sys/mman.h> |
124 #endif | 98 #endif |
125 | 99 |
126 #if SQLITE_ENABLE_LOCKING_STYLE | 100 #if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS |
127 # include <sys/ioctl.h> | 101 # include <sys/ioctl.h> |
128 # if OS_VXWORKS | 102 # if OS_VXWORKS |
129 # include <semaphore.h> | 103 # include <semaphore.h> |
130 # include <limits.h> | 104 # include <limits.h> |
131 # else | 105 # else |
132 # include <sys/file.h> | 106 # include <sys/file.h> |
133 # include <sys/param.h> | 107 # include <sys/param.h> |
134 # endif | 108 # endif |
135 #endif /* SQLITE_ENABLE_LOCKING_STYLE */ | 109 #endif /* SQLITE_ENABLE_LOCKING_STYLE */ |
136 | 110 |
137 #if defined(__APPLE__) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) | 111 #if defined(__APPLE__) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) |
138 # include <sys/mount.h> | 112 # include <sys/mount.h> |
139 #endif | 113 #endif |
140 | 114 |
| 115 #ifdef HAVE_UTIME |
| 116 # include <utime.h> |
| 117 #endif |
| 118 |
141 /* | 119 /* |
142 ** Allowed values of unixFile.fsFlags | 120 ** Allowed values of unixFile.fsFlags |
143 */ | 121 */ |
144 #define SQLITE_FSFLAGS_IS_MSDOS 0x1 | 122 #define SQLITE_FSFLAGS_IS_MSDOS 0x1 |
145 | 123 |
146 /* | 124 /* |
147 ** If we are to be thread-safe, include the pthreads header and define | 125 ** If we are to be thread-safe, include the pthreads header and define |
148 ** the SQLITE_UNIX_THREADS macro. | 126 ** the SQLITE_UNIX_THREADS macro. |
149 */ | 127 */ |
150 #if SQLITE_THREADSAFE | 128 #if SQLITE_THREADSAFE |
151 # include <pthread.h> | 129 # include <pthread.h> |
152 # define SQLITE_UNIX_THREADS 1 | 130 # define SQLITE_UNIX_THREADS 1 |
153 #endif | 131 #endif |
154 | 132 |
155 /* | 133 /* |
156 ** Default permissions when creating a new file | 134 ** Default permissions when creating a new file |
157 */ | 135 */ |
158 #ifndef SQLITE_DEFAULT_FILE_PERMISSIONS | 136 #ifndef SQLITE_DEFAULT_FILE_PERMISSIONS |
159 # define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 | 137 # define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 |
160 #endif | 138 #endif |
161 | 139 |
162 /* | 140 /* |
163 ** Default permissions when creating auto proxy dir | 141 ** Default permissions when creating auto proxy dir |
164 */ | 142 */ |
165 #ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS | 143 #ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS |
166 # define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 | 144 # define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 |
167 #endif | 145 #endif |
168 | 146 |
169 /* | 147 /* |
170 ** Maximum supported path-length. | 148 ** Maximum supported path-length. |
171 */ | 149 */ |
172 #define MAX_PATHNAME 512 | 150 #define MAX_PATHNAME 512 |
173 | 151 |
174 /* | 152 /* |
(...skipping 20 matching lines...) Expand all Loading... |
195 UnixUnusedFd *pNext; /* Next unused file descriptor on same file */ | 173 UnixUnusedFd *pNext; /* Next unused file descriptor on same file */ |
196 }; | 174 }; |
197 | 175 |
198 /* | 176 /* |
199 ** The unixFile structure is subclass of sqlite3_file specific to the unix | 177 ** The unixFile structure is subclass of sqlite3_file specific to the unix |
200 ** VFS implementations. | 178 ** VFS implementations. |
201 */ | 179 */ |
202 typedef struct unixFile unixFile; | 180 typedef struct unixFile unixFile; |
203 struct unixFile { | 181 struct unixFile { |
204 sqlite3_io_methods const *pMethod; /* Always the first entry */ | 182 sqlite3_io_methods const *pMethod; /* Always the first entry */ |
| 183 sqlite3_vfs *pVfs; /* The VFS that created this unixFile */ |
205 unixInodeInfo *pInode; /* Info about locks on this inode */ | 184 unixInodeInfo *pInode; /* Info about locks on this inode */ |
206 int h; /* The file descriptor */ | 185 int h; /* The file descriptor */ |
207 unsigned char eFileLock; /* The type of lock held on this fd */ | 186 unsigned char eFileLock; /* The type of lock held on this fd */ |
208 unsigned char ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ | 187 unsigned short int ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ |
209 int lastErrno; /* The unix errno from last I/O error */ | 188 int lastErrno; /* The unix errno from last I/O error */ |
210 void *lockingContext; /* Locking style specific state */ | 189 void *lockingContext; /* Locking style specific state */ |
211 UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */ | 190 UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */ |
212 const char *zPath; /* Name of the file */ | 191 const char *zPath; /* Name of the file */ |
213 unixShm *pShm; /* Shared memory segment information */ | 192 unixShm *pShm; /* Shared memory segment information */ |
214 int szChunk; /* Configured by FCNTL_CHUNK_SIZE */ | 193 int szChunk; /* Configured by FCNTL_CHUNK_SIZE */ |
| 194 #if SQLITE_MAX_MMAP_SIZE>0 |
| 195 int nFetchOut; /* Number of outstanding xFetch refs */ |
| 196 sqlite3_int64 mmapSize; /* Usable size of mapping at pMapRegion */ |
| 197 sqlite3_int64 mmapSizeActual; /* Actual size of mapping at pMapRegion */ |
| 198 sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ |
| 199 void *pMapRegion; /* Memory mapped region */ |
| 200 #endif |
| 201 #ifdef __QNXNTO__ |
| 202 int sectorSize; /* Device sector size */ |
| 203 int deviceCharacteristics; /* Precomputed device characteristics */ |
| 204 #endif |
215 #if SQLITE_ENABLE_LOCKING_STYLE | 205 #if SQLITE_ENABLE_LOCKING_STYLE |
216 int openFlags; /* The flags specified at open() */ | 206 int openFlags; /* The flags specified at open() */ |
217 #endif | 207 #endif |
218 #if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) | 208 #if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) |
219 unsigned fsFlags; /* cached details from statfs() */ | 209 unsigned fsFlags; /* cached details from statfs() */ |
220 #endif | 210 #endif |
221 #if OS_VXWORKS | 211 #if OS_VXWORKS |
222 int isDelete; /* Delete on close if true */ | |
223 struct vxworksFileId *pId; /* Unique file ID */ | 212 struct vxworksFileId *pId; /* Unique file ID */ |
224 #endif | 213 #endif |
225 #ifndef NDEBUG | 214 #ifdef SQLITE_DEBUG |
226 /* The next group of variables are used to track whether or not the | 215 /* The next group of variables are used to track whether or not the |
227 ** transaction counter in bytes 24-27 of database files are updated | 216 ** transaction counter in bytes 24-27 of database files are updated |
228 ** whenever any part of the database changes. An assertion fault will | 217 ** whenever any part of the database changes. An assertion fault will |
229 ** occur if a file is updated without also updating the transaction | 218 ** occur if a file is updated without also updating the transaction |
230 ** counter. This test is made to avoid new problems similar to the | 219 ** counter. This test is made to avoid new problems similar to the |
231 ** one described by ticket #3584. | 220 ** one described by ticket #3584. |
232 */ | 221 */ |
233 unsigned char transCntrChng; /* True if the transaction counter changed */ | 222 unsigned char transCntrChng; /* True if the transaction counter changed */ |
234 unsigned char dbUpdate; /* True if any part of database file changed */ | 223 unsigned char dbUpdate; /* True if any part of database file changed */ |
235 unsigned char inNormalWrite; /* True if in a normal write operation */ | 224 unsigned char inNormalWrite; /* True if in a normal write operation */ |
| 225 |
236 #endif | 226 #endif |
| 227 |
237 #ifdef SQLITE_TEST | 228 #ifdef SQLITE_TEST |
238 /* In test mode, increase the size of this structure a bit so that | 229 /* In test mode, increase the size of this structure a bit so that |
239 ** it is larger than the struct CrashFile defined in test6.c. | 230 ** it is larger than the struct CrashFile defined in test6.c. |
240 */ | 231 */ |
241 char aPadding[32]; | 232 char aPadding[32]; |
242 #endif | 233 #endif |
243 }; | 234 }; |
244 | 235 |
| 236 /* This variable holds the process id (pid) from when the xRandomness() |
| 237 ** method was called. If xOpen() is called from a different process id, |
| 238 ** indicating that a fork() has occurred, the PRNG will be reset. |
| 239 */ |
| 240 static int randomnessPid = 0; |
| 241 |
245 /* | 242 /* |
246 ** Allowed values for the unixFile.ctrlFlags bitmask: | 243 ** Allowed values for the unixFile.ctrlFlags bitmask: |
247 */ | 244 */ |
248 #define UNIXFILE_EXCL 0x01 /* Connections from one process only */ | 245 #define UNIXFILE_EXCL 0x01 /* Connections from one process only */ |
249 #define UNIXFILE_RDONLY 0x02 /* Connection is read only */ | 246 #define UNIXFILE_RDONLY 0x02 /* Connection is read only */ |
250 #define UNIXFILE_DIRSYNC 0x04 /* Directory sync needed */ | 247 #define UNIXFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ |
| 248 #ifndef SQLITE_DISABLE_DIRSYNC |
| 249 # define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */ |
| 250 #else |
| 251 # define UNIXFILE_DIRSYNC 0x00 |
| 252 #endif |
| 253 #define UNIXFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ |
| 254 #define UNIXFILE_DELETE 0x20 /* Delete on close */ |
| 255 #define UNIXFILE_URI 0x40 /* Filename might have query parameters */ |
| 256 #define UNIXFILE_NOLOCK 0x80 /* Do no file locking */ |
| 257 #define UNIXFILE_WARNED 0x0100 /* verifyDbFile() warnings have been issue
d */ |
251 | 258 |
252 /* | 259 /* |
253 ** Include code that is common to all os_*.c files | 260 ** Include code that is common to all os_*.c files |
254 */ | 261 */ |
255 #include "os_common.h" | 262 #include "os_common.h" |
256 | 263 |
257 /* | 264 /* |
258 ** Define various macros that are missing from some systems. | 265 ** Define various macros that are missing from some systems. |
259 */ | 266 */ |
260 #ifndef O_LARGEFILE | 267 #ifndef O_LARGEFILE |
(...skipping 13 matching lines...) Expand all Loading... |
274 /* | 281 /* |
275 ** The threadid macro resolves to the thread-id or to 0. Used for | 282 ** The threadid macro resolves to the thread-id or to 0. Used for |
276 ** testing and debugging only. | 283 ** testing and debugging only. |
277 */ | 284 */ |
278 #if SQLITE_THREADSAFE | 285 #if SQLITE_THREADSAFE |
279 #define threadid pthread_self() | 286 #define threadid pthread_self() |
280 #else | 287 #else |
281 #define threadid 0 | 288 #define threadid 0 |
282 #endif | 289 #endif |
283 | 290 |
| 291 /* |
| 292 ** HAVE_MREMAP defaults to true on Linux and false everywhere else. |
| 293 */ |
| 294 #if !defined(HAVE_MREMAP) |
| 295 # if defined(__linux__) && defined(_GNU_SOURCE) |
| 296 # define HAVE_MREMAP 1 |
| 297 # else |
| 298 # define HAVE_MREMAP 0 |
| 299 # endif |
| 300 #endif |
| 301 |
| 302 /* |
| 303 ** Explicitly call the 64-bit version of lseek() on Android. Otherwise, lseek() |
| 304 ** is the 32-bit version, even if _FILE_OFFSET_BITS=64 is defined. |
| 305 */ |
| 306 #ifdef __ANDROID__ |
| 307 # define lseek lseek64 |
| 308 #endif |
| 309 |
| 310 /* |
| 311 ** Different Unix systems declare open() in different ways. Same use |
| 312 ** open(const char*,int,mode_t). Others use open(const char*,int,...). |
| 313 ** The difference is important when using a pointer to the function. |
| 314 ** |
| 315 ** The safest way to deal with the problem is to always use this wrapper |
| 316 ** which always has the same well-defined interface. |
| 317 */ |
| 318 static int posixOpen(const char *zFile, int flags, int mode){ |
| 319 return open(zFile, flags, mode); |
| 320 } |
| 321 |
| 322 /* |
| 323 ** On some systems, calls to fchown() will trigger a message in a security |
| 324 ** log if they come from non-root processes. So avoid calling fchown() if |
| 325 ** we are not running as root. |
| 326 */ |
| 327 static int posixFchown(int fd, uid_t uid, gid_t gid){ |
| 328 #if OS_VXWORKS |
| 329 return 0; |
| 330 #else |
| 331 return geteuid() ? 0 : fchown(fd,uid,gid); |
| 332 #endif |
| 333 } |
| 334 |
284 /* Forward reference */ | 335 /* Forward reference */ |
285 static int openDirectory(const char*, int*); | 336 static int openDirectory(const char*, int*); |
| 337 static int unixGetpagesize(void); |
286 | 338 |
287 /* | 339 /* |
288 ** Many system calls are accessed through pointer-to-functions so that | 340 ** Many system calls are accessed through pointer-to-functions so that |
289 ** they may be overridden at runtime to facilitate fault injection during | 341 ** they may be overridden at runtime to facilitate fault injection during |
290 ** testing and sandboxing. The following array holds the names and pointers | 342 ** testing and sandboxing. The following array holds the names and pointers |
291 ** to all overrideable system calls. | 343 ** to all overrideable system calls. |
292 */ | 344 */ |
293 static struct unix_syscall { | 345 static struct unix_syscall { |
294 const char *zName; /* Name of the sytem call */ | 346 const char *zName; /* Name of the system call */ |
295 sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ | 347 sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ |
296 sqlite3_syscall_ptr pDefault; /* Default value */ | 348 sqlite3_syscall_ptr pDefault; /* Default value */ |
297 } aSyscall[] = { | 349 } aSyscall[] = { |
298 { "open", (sqlite3_syscall_ptr)open, 0 }, | 350 { "open", (sqlite3_syscall_ptr)posixOpen, 0 }, |
299 #define osOpen ((int(*)(const char*,int,...))aSyscall[0].pCurrent) | 351 #define osOpen ((int(*)(const char*,int,int))aSyscall[0].pCurrent) |
300 | 352 |
301 { "close", (sqlite3_syscall_ptr)close, 0 }, | 353 { "close", (sqlite3_syscall_ptr)close, 0 }, |
302 #define osClose ((int(*)(int))aSyscall[1].pCurrent) | 354 #define osClose ((int(*)(int))aSyscall[1].pCurrent) |
303 | 355 |
304 { "access", (sqlite3_syscall_ptr)access, 0 }, | 356 { "access", (sqlite3_syscall_ptr)access, 0 }, |
305 #define osAccess ((int(*)(const char*,int))aSyscall[2].pCurrent) | 357 #define osAccess ((int(*)(const char*,int))aSyscall[2].pCurrent) |
306 | 358 |
307 { "getcwd", (sqlite3_syscall_ptr)getcwd, 0 }, | 359 { "getcwd", (sqlite3_syscall_ptr)getcwd, 0 }, |
308 #define osGetcwd ((char*(*)(char*,size_t))aSyscall[3].pCurrent) | 360 #define osGetcwd ((char*(*)(char*,size_t))aSyscall[3].pCurrent) |
309 | 361 |
(...skipping 16 matching lines...) Expand all Loading... |
326 | 378 |
327 { "ftruncate", (sqlite3_syscall_ptr)ftruncate, 0 }, | 379 { "ftruncate", (sqlite3_syscall_ptr)ftruncate, 0 }, |
328 #define osFtruncate ((int(*)(int,off_t))aSyscall[6].pCurrent) | 380 #define osFtruncate ((int(*)(int,off_t))aSyscall[6].pCurrent) |
329 | 381 |
330 { "fcntl", (sqlite3_syscall_ptr)fcntl, 0 }, | 382 { "fcntl", (sqlite3_syscall_ptr)fcntl, 0 }, |
331 #define osFcntl ((int(*)(int,int,...))aSyscall[7].pCurrent) | 383 #define osFcntl ((int(*)(int,int,...))aSyscall[7].pCurrent) |
332 | 384 |
333 { "read", (sqlite3_syscall_ptr)read, 0 }, | 385 { "read", (sqlite3_syscall_ptr)read, 0 }, |
334 #define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent) | 386 #define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent) |
335 | 387 |
336 #if defined(USE_PREAD) || defined(SQLITE_ENABLE_LOCKING_STYLE) | 388 #if defined(USE_PREAD) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) |
337 { "pread", (sqlite3_syscall_ptr)pread, 0 }, | 389 { "pread", (sqlite3_syscall_ptr)pread, 0 }, |
338 #else | 390 #else |
339 { "pread", (sqlite3_syscall_ptr)0, 0 }, | 391 { "pread", (sqlite3_syscall_ptr)0, 0 }, |
340 #endif | 392 #endif |
341 #define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) | 393 #define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) |
342 | 394 |
343 #if defined(USE_PREAD64) | 395 #if defined(USE_PREAD64) |
344 { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, | 396 { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, |
345 #else | 397 #else |
346 { "pread64", (sqlite3_syscall_ptr)0, 0 }, | 398 { "pread64", (sqlite3_syscall_ptr)0, 0 }, |
347 #endif | 399 #endif |
348 #define osPread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].pCurrent) | 400 #define osPread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].pCurrent) |
349 | 401 |
350 { "write", (sqlite3_syscall_ptr)write, 0 }, | 402 { "write", (sqlite3_syscall_ptr)write, 0 }, |
351 #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) | 403 #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) |
352 | 404 |
353 #if defined(USE_PREAD) || defined(SQLITE_ENABLE_LOCKING_STYLE) | 405 #if defined(USE_PREAD) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) |
354 { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, | 406 { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, |
355 #else | 407 #else |
356 { "pwrite", (sqlite3_syscall_ptr)0, 0 }, | 408 { "pwrite", (sqlite3_syscall_ptr)0, 0 }, |
357 #endif | 409 #endif |
358 #define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ | 410 #define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ |
359 aSyscall[12].pCurrent) | 411 aSyscall[12].pCurrent) |
360 | 412 |
361 #if defined(USE_PREAD64) | 413 #if defined(USE_PREAD64) |
362 { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, | 414 { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, |
363 #else | 415 #else |
364 { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, | 416 { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, |
365 #endif | 417 #endif |
366 #define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\ | 418 #define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\ |
367 aSyscall[13].pCurrent) | 419 aSyscall[13].pCurrent) |
368 | 420 |
369 #if SQLITE_ENABLE_LOCKING_STYLE | |
370 { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, | 421 { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, |
371 #else | |
372 { "fchmod", (sqlite3_syscall_ptr)0, 0 }, | |
373 #endif | |
374 #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) | 422 #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) |
375 | 423 |
376 #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE | 424 #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE |
377 { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, | 425 { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, |
378 #else | 426 #else |
379 { "fallocate", (sqlite3_syscall_ptr)0, 0 }, | 427 { "fallocate", (sqlite3_syscall_ptr)0, 0 }, |
380 #endif | 428 #endif |
381 #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) | 429 #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) |
382 | 430 |
383 { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, | 431 { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, |
384 #define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) | 432 #define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) |
385 | 433 |
386 { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, | 434 { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, |
387 #define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) | 435 #define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) |
388 | 436 |
| 437 { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 }, |
| 438 #define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent) |
| 439 |
| 440 { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, |
| 441 #define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) |
| 442 |
| 443 { "fchown", (sqlite3_syscall_ptr)posixFchown, 0 }, |
| 444 #define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) |
| 445 |
| 446 #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 |
| 447 { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, |
| 448 #define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[21].pCurrent) |
| 449 |
| 450 { "munmap", (sqlite3_syscall_ptr)munmap, 0 }, |
| 451 #define osMunmap ((void*(*)(void*,size_t))aSyscall[22].pCurrent) |
| 452 |
| 453 #if HAVE_MREMAP |
| 454 { "mremap", (sqlite3_syscall_ptr)mremap, 0 }, |
| 455 #else |
| 456 { "mremap", (sqlite3_syscall_ptr)0, 0 }, |
| 457 #endif |
| 458 #define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[23].pCurrent) |
| 459 { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, |
| 460 #define osGetpagesize ((int(*)(void))aSyscall[24].pCurrent) |
| 461 |
| 462 #endif |
| 463 |
389 }; /* End of the overrideable system calls */ | 464 }; /* End of the overrideable system calls */ |
390 | 465 |
391 /* | 466 /* |
392 ** This is the xSetSystemCall() method of sqlite3_vfs for all of the | 467 ** This is the xSetSystemCall() method of sqlite3_vfs for all of the |
393 ** "unix" VFSes. Return SQLITE_OK opon successfully updating the | 468 ** "unix" VFSes. Return SQLITE_OK opon successfully updating the |
394 ** system call pointer, or SQLITE_NOTFOUND if there is no configurable | 469 ** system call pointer, or SQLITE_NOTFOUND if there is no configurable |
395 ** system call named zName. | 470 ** system call named zName. |
396 */ | 471 */ |
397 static int unixSetSystemCall( | 472 static int unixSetSystemCall( |
398 sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ | 473 sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 if( strcmp(zName, aSyscall[i].zName)==0 ) break; | 540 if( strcmp(zName, aSyscall[i].zName)==0 ) break; |
466 } | 541 } |
467 } | 542 } |
468 for(i++; i<ArraySize(aSyscall); i++){ | 543 for(i++; i<ArraySize(aSyscall); i++){ |
469 if( aSyscall[i].pCurrent!=0 ) return aSyscall[i].zName; | 544 if( aSyscall[i].pCurrent!=0 ) return aSyscall[i].zName; |
470 } | 545 } |
471 return 0; | 546 return 0; |
472 } | 547 } |
473 | 548 |
474 /* | 549 /* |
475 ** Retry open() calls that fail due to EINTR | 550 ** Do not accept any file descriptor less than this value, in order to avoid |
| 551 ** opening database file using file descriptors that are commonly used for |
| 552 ** standard input, output, and error. |
476 */ | 553 */ |
477 static int robust_open(const char *z, int f, int m){ | 554 #ifndef SQLITE_MINIMUM_FILE_DESCRIPTOR |
478 int rc; | 555 # define SQLITE_MINIMUM_FILE_DESCRIPTOR 3 |
479 do{ rc = osOpen(z,f,m); }while( rc<0 && errno==EINTR ); | 556 #endif |
480 return rc; | 557 |
| 558 /* |
| 559 ** Invoke open(). Do so multiple times, until it either succeeds or |
| 560 ** fails for some reason other than EINTR. |
| 561 ** |
| 562 ** If the file creation mode "m" is 0 then set it to the default for |
| 563 ** SQLite. The default is SQLITE_DEFAULT_FILE_PERMISSIONS (normally |
| 564 ** 0644) as modified by the system umask. If m is not 0, then |
| 565 ** make the file creation mode be exactly m ignoring the umask. |
| 566 ** |
| 567 ** The m parameter will be non-zero only when creating -wal, -journal, |
| 568 ** and -shm files. We want those files to have *exactly* the same |
| 569 ** permissions as their original database, unadulterated by the umask. |
| 570 ** In that way, if a database file is -rw-rw-rw or -rw-rw-r-, and a |
| 571 ** transaction crashes and leaves behind hot journals, then any |
| 572 ** process that is able to write to the database will also be able to |
| 573 ** recover the hot journals. |
| 574 */ |
| 575 static int robust_open(const char *z, int f, mode_t m){ |
| 576 int fd; |
| 577 mode_t m2 = m ? m : SQLITE_DEFAULT_FILE_PERMISSIONS; |
| 578 while(1){ |
| 579 #if defined(O_CLOEXEC) |
| 580 fd = osOpen(z,f|O_CLOEXEC,m2); |
| 581 #else |
| 582 fd = osOpen(z,f,m2); |
| 583 #endif |
| 584 if( fd<0 ){ |
| 585 if( errno==EINTR ) continue; |
| 586 break; |
| 587 } |
| 588 if( fd>=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break; |
| 589 osClose(fd); |
| 590 sqlite3_log(SQLITE_WARNING, |
| 591 "attempt to open \"%s\" as file descriptor %d", z, fd); |
| 592 fd = -1; |
| 593 if( osOpen("/dev/null", f, m)<0 ) break; |
| 594 } |
| 595 if( fd>=0 ){ |
| 596 if( m!=0 ){ |
| 597 struct stat statbuf; |
| 598 if( osFstat(fd, &statbuf)==0 |
| 599 && statbuf.st_size==0 |
| 600 && (statbuf.st_mode&0777)!=m |
| 601 ){ |
| 602 osFchmod(fd, m); |
| 603 } |
| 604 } |
| 605 #if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC==0) |
| 606 osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| 607 #endif |
| 608 } |
| 609 return fd; |
481 } | 610 } |
482 | 611 |
483 /* | 612 /* |
484 ** Helper functions to obtain and relinquish the global mutex. The | 613 ** Helper functions to obtain and relinquish the global mutex. The |
485 ** global mutex is used to protect the unixInodeInfo and | 614 ** global mutex is used to protect the unixInodeInfo and |
486 ** vxworksFileId objects used by this file, all of which may be | 615 ** vxworksFileId objects used by this file, all of which may be |
487 ** shared by multiple threads. | 616 ** shared by multiple threads. |
488 ** | 617 ** |
489 ** Function unixMutexHeld() is used to assert() that the global mutex | 618 ** Function unixMutexHeld() is used to assert() that the global mutex |
490 ** is held when required. This function is only used as part of assert() | 619 ** is held when required. This function is only used as part of assert() |
491 ** statements. e.g. | 620 ** statements. e.g. |
492 ** | 621 ** |
493 ** unixEnterMutex() | 622 ** unixEnterMutex() |
494 ** assert( unixMutexHeld() ); | 623 ** assert( unixMutexHeld() ); |
495 ** unixEnterLeave() | 624 ** unixEnterLeave() |
496 */ | 625 */ |
497 static void unixEnterMutex(void){ | 626 static void unixEnterMutex(void){ |
498 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); | 627 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); |
499 } | 628 } |
500 static void unixLeaveMutex(void){ | 629 static void unixLeaveMutex(void){ |
501 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); | 630 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); |
502 } | 631 } |
503 #ifdef SQLITE_DEBUG | 632 #ifdef SQLITE_DEBUG |
504 static int unixMutexHeld(void) { | 633 static int unixMutexHeld(void) { |
505 return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); | 634 return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); |
506 } | 635 } |
507 #endif | 636 #endif |
508 | 637 |
509 | 638 |
510 #ifdef SQLITE_DEBUG | 639 #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) |
511 /* | 640 /* |
512 ** Helper function for printing out trace information from debugging | 641 ** Helper function for printing out trace information from debugging |
513 ** binaries. This returns the string represetation of the supplied | 642 ** binaries. This returns the string representation of the supplied |
514 ** integer lock-type. | 643 ** integer lock-type. |
515 */ | 644 */ |
516 static const char *azFileLock(int eFileLock){ | 645 static const char *azFileLock(int eFileLock){ |
517 switch( eFileLock ){ | 646 switch( eFileLock ){ |
518 case NO_LOCK: return "NONE"; | 647 case NO_LOCK: return "NONE"; |
519 case SHARED_LOCK: return "SHARED"; | 648 case SHARED_LOCK: return "SHARED"; |
520 case RESERVED_LOCK: return "RESERVED"; | 649 case RESERVED_LOCK: return "RESERVED"; |
521 case PENDING_LOCK: return "PENDING"; | 650 case PENDING_LOCK: return "PENDING"; |
522 case EXCLUSIVE_LOCK: return "EXCLUSIVE"; | 651 case EXCLUSIVE_LOCK: return "EXCLUSIVE"; |
523 } | 652 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 } | 709 } |
581 errno = savedErrno; | 710 errno = savedErrno; |
582 return s; | 711 return s; |
583 } | 712 } |
584 #undef osFcntl | 713 #undef osFcntl |
585 #define osFcntl lockTrace | 714 #define osFcntl lockTrace |
586 #endif /* SQLITE_LOCK_TRACE */ | 715 #endif /* SQLITE_LOCK_TRACE */ |
587 | 716 |
588 /* | 717 /* |
589 ** Retry ftruncate() calls that fail due to EINTR | 718 ** Retry ftruncate() calls that fail due to EINTR |
| 719 ** |
| 720 ** All calls to ftruncate() within this file should be made through this wrapper
. |
| 721 ** On the Android platform, bypassing the logic below could lead to a corrupt |
| 722 ** database. |
590 */ | 723 */ |
591 static int robust_ftruncate(int h, sqlite3_int64 sz){ | 724 static int robust_ftruncate(int h, sqlite3_int64 sz){ |
592 int rc; | 725 int rc; |
| 726 #ifdef __ANDROID__ |
| 727 /* On Android, ftruncate() always uses 32-bit offsets, even if |
| 728 ** _FILE_OFFSET_BITS=64 is defined. This means it is unsafe to attempt to |
| 729 ** truncate a file to any size larger than 2GiB. Silently ignore any |
| 730 ** such attempts. */ |
| 731 if( sz>(sqlite3_int64)0x7FFFFFFF ){ |
| 732 rc = SQLITE_OK; |
| 733 }else |
| 734 #endif |
593 do{ rc = osFtruncate(h,sz); }while( rc<0 && errno==EINTR ); | 735 do{ rc = osFtruncate(h,sz); }while( rc<0 && errno==EINTR ); |
594 return rc; | 736 return rc; |
595 } | 737 } |
596 | 738 |
597 /* | 739 /* |
598 ** This routine translates a standard POSIX errno code into something | 740 ** This routine translates a standard POSIX errno code into something |
599 ** useful to the clients of the sqlite3 functions. Specifically, it is | 741 ** useful to the clients of the sqlite3 functions. Specifically, it is |
600 ** intended to translate a variety of "try again" errors into SQLITE_BUSY | 742 ** intended to translate a variety of "try again" errors into SQLITE_BUSY |
601 ** and a variety of "please close the file descriptor NOW" errors into | 743 ** and a variety of "please close the file descriptor NOW" errors into |
602 ** SQLITE_IOERR | 744 ** SQLITE_IOERR |
(...skipping 24 matching lines...) Expand all Loading... |
627 case EBUSY: | 769 case EBUSY: |
628 case EINTR: | 770 case EINTR: |
629 case ENOLCK: | 771 case ENOLCK: |
630 /* random NFS retry error, unless during file system support | 772 /* random NFS retry error, unless during file system support |
631 * introspection, in which it actually means what it says */ | 773 * introspection, in which it actually means what it says */ |
632 return SQLITE_BUSY; | 774 return SQLITE_BUSY; |
633 | 775 |
634 case EACCES: | 776 case EACCES: |
635 /* EACCES is like EAGAIN during locking operations, but not any other time*/ | 777 /* EACCES is like EAGAIN during locking operations, but not any other time*/ |
636 if( (sqliteIOErr == SQLITE_IOERR_LOCK) || | 778 if( (sqliteIOErr == SQLITE_IOERR_LOCK) || |
637 » (sqliteIOErr == SQLITE_IOERR_UNLOCK) || | 779 (sqliteIOErr == SQLITE_IOERR_UNLOCK) || |
638 » (sqliteIOErr == SQLITE_IOERR_RDLOCK) || | 780 (sqliteIOErr == SQLITE_IOERR_RDLOCK) || |
639 » (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ){ | 781 (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ){ |
640 return SQLITE_BUSY; | 782 return SQLITE_BUSY; |
641 } | 783 } |
642 /* else fall through */ | 784 /* else fall through */ |
643 case EPERM: | 785 case EPERM: |
644 return SQLITE_PERM; | 786 return SQLITE_PERM; |
645 | 787 |
646 /* EDEADLK is only possible if a call to fcntl(F_SETLKW) is made. And | |
647 ** this module never makes such a call. And the code in SQLite itself | |
648 ** asserts that SQLITE_IOERR_BLOCKED is never returned. For these reasons | |
649 ** this case is also commented out. If the system does set errno to EDEADLK, | |
650 ** the default SQLITE_IOERR_XXX code will be returned. */ | |
651 #if 0 | |
652 case EDEADLK: | |
653 return SQLITE_IOERR_BLOCKED; | |
654 #endif | |
655 | |
656 #if EOPNOTSUPP!=ENOTSUP | 788 #if EOPNOTSUPP!=ENOTSUP |
657 case EOPNOTSUPP: | 789 case EOPNOTSUPP: |
658 /* something went terribly awry, unless during file system support | 790 /* something went terribly awry, unless during file system support |
659 * introspection, in which it actually means what it says */ | 791 * introspection, in which it actually means what it says */ |
660 #endif | 792 #endif |
661 #ifdef ENOTSUP | 793 #ifdef ENOTSUP |
662 case ENOTSUP: | 794 case ENOTSUP: |
663 /* invalid fd, unless during file system support introspection, in which | 795 /* invalid fd, unless during file system support introspection, in which |
664 * it actually means what it says */ | 796 * it actually means what it says */ |
665 #endif | 797 #endif |
666 case EIO: | 798 case EIO: |
667 case EBADF: | 799 case EBADF: |
668 case EINVAL: | 800 case EINVAL: |
669 case ENOTCONN: | 801 case ENOTCONN: |
670 case ENODEV: | 802 case ENODEV: |
671 case ENXIO: | 803 case ENXIO: |
672 case ENOENT: | 804 case ENOENT: |
| 805 #ifdef ESTALE /* ESTALE is not defined on Interix systems */ |
673 case ESTALE: | 806 case ESTALE: |
| 807 #endif |
674 case ENOSYS: | 808 case ENOSYS: |
675 /* these should force the client to close the file and reconnect */ | 809 /* these should force the client to close the file and reconnect */ |
676 | 810 |
677 default: | 811 default: |
678 return sqliteIOErr; | 812 return sqliteIOErr; |
679 } | 813 } |
680 } | 814 } |
681 | 815 |
682 | 816 |
683 | |
684 /****************************************************************************** | 817 /****************************************************************************** |
685 ****************** Begin Unique File ID Utility Used By VxWorks *************** | 818 ****************** Begin Unique File ID Utility Used By VxWorks *************** |
686 ** | 819 ** |
687 ** On most versions of unix, we can get a unique ID for a file by concatenating | 820 ** On most versions of unix, we can get a unique ID for a file by concatenating |
688 ** the device number and the inode number. But this does not work on VxWorks. | 821 ** the device number and the inode number. But this does not work on VxWorks. |
689 ** On VxWorks, a unique file id must be based on the canonical filename. | 822 ** On VxWorks, a unique file id must be based on the canonical filename. |
690 ** | 823 ** |
691 ** A pointer to an instance of the following structure can be used as a | 824 ** A pointer to an instance of the following structure can be used as a |
692 ** unique file ID in VxWorks. Each instance of this structure contains | 825 ** unique file ID in VxWorks. Each instance of this structure contains |
693 ** a copy of the canonical filename. There is also a reference count. | 826 ** a copy of the canonical filename. There is also a reference count. |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 struct unixFileId fileId; /* The lookup key */ | 1068 struct unixFileId fileId; /* The lookup key */ |
936 int nShared; /* Number of SHARED locks held */ | 1069 int nShared; /* Number of SHARED locks held */ |
937 unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */ | 1070 unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */ |
938 unsigned char bProcessLock; /* An exclusive process lock is held */ | 1071 unsigned char bProcessLock; /* An exclusive process lock is held */ |
939 int nRef; /* Number of pointers to this structure */ | 1072 int nRef; /* Number of pointers to this structure */ |
940 unixShmNode *pShmNode; /* Shared memory associated with this inode */ | 1073 unixShmNode *pShmNode; /* Shared memory associated with this inode */ |
941 int nLock; /* Number of outstanding file locks */ | 1074 int nLock; /* Number of outstanding file locks */ |
942 UnixUnusedFd *pUnused; /* Unused file descriptors to close */ | 1075 UnixUnusedFd *pUnused; /* Unused file descriptors to close */ |
943 unixInodeInfo *pNext; /* List of all unixInodeInfo objects */ | 1076 unixInodeInfo *pNext; /* List of all unixInodeInfo objects */ |
944 unixInodeInfo *pPrev; /* .... doubly linked */ | 1077 unixInodeInfo *pPrev; /* .... doubly linked */ |
945 #if defined(SQLITE_ENABLE_LOCKING_STYLE) | 1078 #if SQLITE_ENABLE_LOCKING_STYLE |
946 unsigned long long sharedByte; /* for AFP simulated shared lock */ | 1079 unsigned long long sharedByte; /* for AFP simulated shared lock */ |
947 #endif | 1080 #endif |
948 #if OS_VXWORKS | 1081 #if OS_VXWORKS |
949 sem_t *pSem; /* Named POSIX semaphore */ | 1082 sem_t *pSem; /* Named POSIX semaphore */ |
950 char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */ | 1083 char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */ |
951 #endif | 1084 #endif |
952 }; | 1085 }; |
953 | 1086 |
954 /* | 1087 /* |
955 ** A lists of all unixInodeInfo objects. | 1088 ** A lists of all unixInodeInfo objects. |
956 */ | 1089 */ |
957 static unixInodeInfo *inodeList = 0; | 1090 static unixInodeInfo *inodeList = 0; |
958 | 1091 |
959 /* | 1092 /* |
960 ** | 1093 ** |
961 ** This function - unixLogError_x(), is only ever called via the macro | 1094 ** This function - unixLogError_x(), is only ever called via the macro |
962 ** unixLogError(). | 1095 ** unixLogError(). |
963 ** | 1096 ** |
964 ** It is invoked after an error occurs in an OS function and errno has been | 1097 ** It is invoked after an error occurs in an OS function and errno has been |
965 ** set. It logs a message using sqlite3_log() containing the current value of | 1098 ** set. It logs a message using sqlite3_log() containing the current value of |
966 ** errno and, if possible, the human-readable equivalent from strerror() or | 1099 ** errno and, if possible, the human-readable equivalent from strerror() or |
967 ** strerror_r(). | 1100 ** strerror_r(). |
968 ** | 1101 ** |
969 ** The first argument passed to the macro should be the error code that | 1102 ** The first argument passed to the macro should be the error code that |
970 ** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). | 1103 ** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). |
971 ** The two subsequent arguments should be the name of the OS function that | 1104 ** The two subsequent arguments should be the name of the OS function that |
972 ** failed (e.g. "unlink", "open") and the the associated file-system path, | 1105 ** failed (e.g. "unlink", "open") and the associated file-system path, |
973 ** if any. | 1106 ** if any. |
974 */ | 1107 */ |
975 #define unixLogError(a,b,c) unixLogErrorAtLine(a,b,c,__LINE__) | 1108 #define unixLogError(a,b,c) unixLogErrorAtLine(a,b,c,__LINE__) |
976 static int unixLogErrorAtLine( | 1109 static int unixLogErrorAtLine( |
977 int errcode, /* SQLite error code */ | 1110 int errcode, /* SQLite error code */ |
978 const char *zFunc, /* Name of OS function that failed */ | 1111 const char *zFunc, /* Name of OS function that failed */ |
979 const char *zPath, /* File path associated with error */ | 1112 const char *zPath, /* File path associated with error */ |
980 int iLine /* Source line number where error occurred */ | 1113 int iLine /* Source line number where error occurred */ |
981 ){ | 1114 ){ |
982 char *zErr; /* Message from strerror() or equivalent */ | 1115 char *zErr; /* Message from strerror() or equivalent */ |
983 int iErrno = errno; /* Saved syscall error number */ | 1116 int iErrno = errno; /* Saved syscall error number */ |
984 | 1117 |
985 /* If this is not a threadsafe build (SQLITE_THREADSAFE==0), then use | 1118 /* If this is not a threadsafe build (SQLITE_THREADSAFE==0), then use |
986 ** the strerror() function to obtain the human-readable error message | 1119 ** the strerror() function to obtain the human-readable error message |
987 ** equivalent to errno. Otherwise, use strerror_r(). | 1120 ** equivalent to errno. Otherwise, use strerror_r(). |
988 */ | 1121 */ |
989 #if SQLITE_THREADSAFE && defined(HAVE_STRERROR_R) | 1122 #if SQLITE_THREADSAFE && defined(HAVE_STRERROR_R) |
990 char aErr[80]; | 1123 char aErr[80]; |
991 memset(aErr, 0, sizeof(aErr)); | 1124 memset(aErr, 0, sizeof(aErr)); |
992 zErr = aErr; | 1125 zErr = aErr; |
993 | 1126 |
994 /* If STRERROR_R_CHAR_P (set by autoconf scripts) or __USE_GNU is defined, | 1127 /* If STRERROR_R_CHAR_P (set by autoconf scripts) or __USE_GNU is defined, |
995 ** assume that the system provides the the GNU version of strerror_r() that | 1128 ** assume that the system provides the GNU version of strerror_r() that |
996 ** returns a pointer to a buffer containing the error message. That pointer | 1129 ** returns a pointer to a buffer containing the error message. That pointer |
997 ** may point to aErr[], or it may point to some static storage somewhere. | 1130 ** may point to aErr[], or it may point to some static storage somewhere. |
998 ** Otherwise, assume that the system provides the POSIX version of | 1131 ** Otherwise, assume that the system provides the POSIX version of |
999 ** strerror_r(), which always writes an error message into aErr[]. | 1132 ** strerror_r(), which always writes an error message into aErr[]. |
1000 ** | 1133 ** |
1001 ** If the code incorrectly assumes that it is the POSIX version that is | 1134 ** If the code incorrectly assumes that it is the POSIX version that is |
1002 ** available, the error message will often be an empty string. Not a | 1135 ** available, the error message will often be an empty string. Not a |
1003 ** huge problem. Incorrectly concluding that the GNU version is available | 1136 ** huge problem. Incorrectly concluding that the GNU version is available |
1004 ** could lead to a segfault though. | 1137 ** could lead to a segfault though. |
1005 */ | 1138 */ |
1006 #if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) | 1139 #if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) |
1007 zErr = | 1140 zErr = |
1008 # endif | 1141 # endif |
1009 strerror_r(iErrno, aErr, sizeof(aErr)-1); | 1142 strerror_r(iErrno, aErr, sizeof(aErr)-1); |
1010 | 1143 |
1011 #elif SQLITE_THREADSAFE | 1144 #elif SQLITE_THREADSAFE |
1012 /* This is a threadsafe build, but strerror_r() is not available. */ | 1145 /* This is a threadsafe build, but strerror_r() is not available. */ |
1013 zErr = ""; | 1146 zErr = ""; |
1014 #else | 1147 #else |
1015 /* Non-threadsafe build, use strerror(). */ | 1148 /* Non-threadsafe build, use strerror(). */ |
1016 zErr = strerror(iErrno); | 1149 zErr = strerror(iErrno); |
1017 #endif | 1150 #endif |
1018 | 1151 |
1019 assert( errcode!=SQLITE_OK ); | |
1020 if( zPath==0 ) zPath = ""; | 1152 if( zPath==0 ) zPath = ""; |
1021 sqlite3_log(errcode, | 1153 sqlite3_log(errcode, |
1022 "os_unix.c:%d: (%d) %s(%s) - %s", | 1154 "os_unix.c:%d: (%d) %s(%s) - %s", |
1023 iLine, iErrno, zFunc, zPath, zErr | 1155 iLine, iErrno, zFunc, zPath, zErr |
1024 ); | 1156 ); |
1025 | 1157 |
1026 return errcode; | 1158 return errcode; |
1027 } | 1159 } |
1028 | 1160 |
1029 /* | 1161 /* |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1174 pInode->pPrev = 0; | 1306 pInode->pPrev = 0; |
1175 if( inodeList ) inodeList->pPrev = pInode; | 1307 if( inodeList ) inodeList->pPrev = pInode; |
1176 inodeList = pInode; | 1308 inodeList = pInode; |
1177 }else{ | 1309 }else{ |
1178 pInode->nRef++; | 1310 pInode->nRef++; |
1179 } | 1311 } |
1180 *ppInode = pInode; | 1312 *ppInode = pInode; |
1181 return SQLITE_OK; | 1313 return SQLITE_OK; |
1182 } | 1314 } |
1183 | 1315 |
| 1316 /* |
| 1317 ** Return TRUE if pFile has been renamed or unlinked since it was first opened. |
| 1318 */ |
| 1319 static int fileHasMoved(unixFile *pFile){ |
| 1320 #if OS_VXWORKS |
| 1321 return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; |
| 1322 #else |
| 1323 struct stat buf; |
| 1324 return pFile->pInode!=0 && |
| 1325 (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); |
| 1326 #endif |
| 1327 } |
| 1328 |
| 1329 |
| 1330 /* |
| 1331 ** Check a unixFile that is a database. Verify the following: |
| 1332 ** |
| 1333 ** (1) There is exactly one hard link on the file |
| 1334 ** (2) The file is not a symbolic link |
| 1335 ** (3) The file has not been renamed or unlinked |
| 1336 ** |
| 1337 ** Issue sqlite3_log(SQLITE_WARNING,...) messages if anything is not right. |
| 1338 */ |
| 1339 static void verifyDbFile(unixFile *pFile){ |
| 1340 struct stat buf; |
| 1341 int rc; |
| 1342 if( pFile->ctrlFlags & UNIXFILE_WARNED ){ |
| 1343 /* One or more of the following warnings have already been issued. Do not |
| 1344 ** repeat them so as not to clutter the error log */ |
| 1345 return; |
| 1346 } |
| 1347 rc = osFstat(pFile->h, &buf); |
| 1348 if( rc!=0 ){ |
| 1349 sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); |
| 1350 pFile->ctrlFlags |= UNIXFILE_WARNED; |
| 1351 return; |
| 1352 } |
| 1353 if( buf.st_nlink==0 && (pFile->ctrlFlags & UNIXFILE_DELETE)==0 ){ |
| 1354 sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); |
| 1355 pFile->ctrlFlags |= UNIXFILE_WARNED; |
| 1356 return; |
| 1357 } |
| 1358 if( buf.st_nlink>1 ){ |
| 1359 sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); |
| 1360 pFile->ctrlFlags |= UNIXFILE_WARNED; |
| 1361 return; |
| 1362 } |
| 1363 if( fileHasMoved(pFile) ){ |
| 1364 sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); |
| 1365 pFile->ctrlFlags |= UNIXFILE_WARNED; |
| 1366 return; |
| 1367 } |
| 1368 } |
| 1369 |
1184 | 1370 |
1185 /* | 1371 /* |
1186 ** This routine checks if there is a RESERVED lock held on the specified | 1372 ** This routine checks if there is a RESERVED lock held on the specified |
1187 ** file by this or any other process. If such a lock is held, set *pResOut | 1373 ** file by this or any other process. If such a lock is held, set *pResOut |
1188 ** to a non-zero value otherwise *pResOut is set to zero. The return value | 1374 ** to a non-zero value otherwise *pResOut is set to zero. The return value |
1189 ** is set to SQLITE_OK unless an I/O error occurs during lock checking. | 1375 ** is set to SQLITE_OK unless an I/O error occurs during lock checking. |
1190 */ | 1376 */ |
1191 static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ | 1377 static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ |
1192 int rc = SQLITE_OK; | 1378 int rc = SQLITE_OK; |
1193 int reserved = 0; | 1379 int reserved = 0; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 ** within this range, this ensures that no other locks are held on the | 1519 ** within this range, this ensures that no other locks are held on the |
1334 ** database. | 1520 ** database. |
1335 ** | 1521 ** |
1336 ** The reason a single byte cannot be used instead of the 'shared byte | 1522 ** The reason a single byte cannot be used instead of the 'shared byte |
1337 ** range' is that some versions of windows do not support read-locks. By | 1523 ** range' is that some versions of windows do not support read-locks. By |
1338 ** locking a random byte from a range, concurrent SHARED locks may exist | 1524 ** locking a random byte from a range, concurrent SHARED locks may exist |
1339 ** even if the locking primitive used is always a write-lock. | 1525 ** even if the locking primitive used is always a write-lock. |
1340 */ | 1526 */ |
1341 int rc = SQLITE_OK; | 1527 int rc = SQLITE_OK; |
1342 unixFile *pFile = (unixFile*)id; | 1528 unixFile *pFile = (unixFile*)id; |
1343 unixInodeInfo *pInode = pFile->pInode; | 1529 unixInodeInfo *pInode; |
1344 struct flock lock; | 1530 struct flock lock; |
1345 int tErrno = 0; | 1531 int tErrno = 0; |
1346 | 1532 |
1347 assert( pFile ); | 1533 assert( pFile ); |
1348 OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, | 1534 OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, |
1349 azFileLock(eFileLock), azFileLock(pFile->eFileLock), | 1535 azFileLock(eFileLock), azFileLock(pFile->eFileLock), |
1350 azFileLock(pInode->eFileLock), pInode->nShared , getpid())); | 1536 azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared , getpid())); |
1351 | 1537 |
1352 /* If there is already a lock of this type or more restrictive on the | 1538 /* If there is already a lock of this type or more restrictive on the |
1353 ** unixFile, do nothing. Don't use the end_lock: exit path, as | 1539 ** unixFile, do nothing. Don't use the end_lock: exit path, as |
1354 ** unixEnterMutex() hasn't been called yet. | 1540 ** unixEnterMutex() hasn't been called yet. |
1355 */ | 1541 */ |
1356 if( pFile->eFileLock>=eFileLock ){ | 1542 if( pFile->eFileLock>=eFileLock ){ |
1357 OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h, | 1543 OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h, |
1358 azFileLock(eFileLock))); | 1544 azFileLock(eFileLock))); |
1359 return SQLITE_OK; | 1545 return SQLITE_OK; |
1360 } | 1546 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 if( unixFileLock(pFile, &lock) ){ | 1667 if( unixFileLock(pFile, &lock) ){ |
1482 tErrno = errno; | 1668 tErrno = errno; |
1483 rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); | 1669 rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); |
1484 if( rc!=SQLITE_BUSY ){ | 1670 if( rc!=SQLITE_BUSY ){ |
1485 pFile->lastErrno = tErrno; | 1671 pFile->lastErrno = tErrno; |
1486 } | 1672 } |
1487 } | 1673 } |
1488 } | 1674 } |
1489 | 1675 |
1490 | 1676 |
1491 #ifndef NDEBUG | 1677 #ifdef SQLITE_DEBUG |
1492 /* Set up the transaction-counter change checking flags when | 1678 /* Set up the transaction-counter change checking flags when |
1493 ** transitioning from a SHARED to a RESERVED lock. The change | 1679 ** transitioning from a SHARED to a RESERVED lock. The change |
1494 ** from SHARED to RESERVED marks the beginning of a normal | 1680 ** from SHARED to RESERVED marks the beginning of a normal |
1495 ** write operation (not a hot journal rollback). | 1681 ** write operation (not a hot journal rollback). |
1496 */ | 1682 */ |
1497 if( rc==SQLITE_OK | 1683 if( rc==SQLITE_OK |
1498 && pFile->eFileLock<=SHARED_LOCK | 1684 && pFile->eFileLock<=SHARED_LOCK |
1499 && eFileLock==RESERVED_LOCK | 1685 && eFileLock==RESERVED_LOCK |
1500 ){ | 1686 ){ |
1501 pFile->transCntrChng = 0; | 1687 pFile->transCntrChng = 0; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1544 ** the byte range is divided into 2 parts and the first part is unlocked then | 1730 ** the byte range is divided into 2 parts and the first part is unlocked then |
1545 ** set to a read lock, then the other part is simply unlocked. This works | 1731 ** set to a read lock, then the other part is simply unlocked. This works |
1546 ** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to | 1732 ** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to |
1547 ** remove the write lock on a region when a read lock is set. | 1733 ** remove the write lock on a region when a read lock is set. |
1548 */ | 1734 */ |
1549 static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ | 1735 static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ |
1550 unixFile *pFile = (unixFile*)id; | 1736 unixFile *pFile = (unixFile*)id; |
1551 unixInodeInfo *pInode; | 1737 unixInodeInfo *pInode; |
1552 struct flock lock; | 1738 struct flock lock; |
1553 int rc = SQLITE_OK; | 1739 int rc = SQLITE_OK; |
1554 int h; | |
1555 | 1740 |
1556 assert( pFile ); | 1741 assert( pFile ); |
1557 OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock, | 1742 OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock, |
1558 pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, | 1743 pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, |
1559 getpid())); | 1744 getpid())); |
1560 | 1745 |
1561 assert( eFileLock<=SHARED_LOCK ); | 1746 assert( eFileLock<=SHARED_LOCK ); |
1562 if( pFile->eFileLock<=eFileLock ){ | 1747 if( pFile->eFileLock<=eFileLock ){ |
1563 return SQLITE_OK; | 1748 return SQLITE_OK; |
1564 } | 1749 } |
1565 unixEnterMutex(); | 1750 unixEnterMutex(); |
1566 h = pFile->h; | |
1567 pInode = pFile->pInode; | 1751 pInode = pFile->pInode; |
1568 assert( pInode->nShared!=0 ); | 1752 assert( pInode->nShared!=0 ); |
1569 if( pFile->eFileLock>SHARED_LOCK ){ | 1753 if( pFile->eFileLock>SHARED_LOCK ){ |
1570 assert( pInode->eFileLock==pFile->eFileLock ); | 1754 assert( pInode->eFileLock==pFile->eFileLock ); |
1571 SimulateIOErrorBenign(1); | |
1572 SimulateIOError( h=(-1) ) | |
1573 SimulateIOErrorBenign(0); | |
1574 | 1755 |
1575 #ifndef NDEBUG | 1756 #ifdef SQLITE_DEBUG |
1576 /* When reducing a lock such that other processes can start | 1757 /* When reducing a lock such that other processes can start |
1577 ** reading the database file again, make sure that the | 1758 ** reading the database file again, make sure that the |
1578 ** transaction counter was updated if any part of the database | 1759 ** transaction counter was updated if any part of the database |
1579 ** file changed. If the transaction counter is not updated, | 1760 ** file changed. If the transaction counter is not updated, |
1580 ** other connections to the same file might not realize that | 1761 ** other connections to the same file might not realize that |
1581 ** the file has changed and hence might not know to flush their | 1762 ** the file has changed and hence might not know to flush their |
1582 ** cache. The use of a stale cache can lead to database corruption. | 1763 ** cache. The use of a stale cache can lead to database corruption. |
1583 */ | 1764 */ |
1584 #if 0 | |
1585 assert( pFile->inNormalWrite==0 | |
1586 || pFile->dbUpdate==0 | |
1587 || pFile->transCntrChng==1 ); | |
1588 #endif | |
1589 pFile->inNormalWrite = 0; | 1765 pFile->inNormalWrite = 0; |
1590 #endif | 1766 #endif |
1591 | 1767 |
1592 /* downgrading to a shared lock on NFS involves clearing the write lock | 1768 /* downgrading to a shared lock on NFS involves clearing the write lock |
1593 ** before establishing the readlock - to avoid a race condition we downgrade | 1769 ** before establishing the readlock - to avoid a race condition we downgrade |
1594 ** the lock in 2 blocks, so that part of the range will be covered by a | 1770 ** the lock in 2 blocks, so that part of the range will be covered by a |
1595 ** write lock until the rest is covered by a read lock: | 1771 ** write lock until the rest is covered by a read lock: |
1596 ** 1: [WWWWW] | 1772 ** 1: [WWWWW] |
1597 ** 2: [....W] | 1773 ** 2: [....W] |
1598 ** 3: [RRRRW] | 1774 ** 3: [RRRRW] |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1680 if( eFileLock==NO_LOCK ){ | 1856 if( eFileLock==NO_LOCK ){ |
1681 /* Decrement the shared lock counter. Release the lock using an | 1857 /* Decrement the shared lock counter. Release the lock using an |
1682 ** OS call only when all threads in this same process have released | 1858 ** OS call only when all threads in this same process have released |
1683 ** the lock. | 1859 ** the lock. |
1684 */ | 1860 */ |
1685 pInode->nShared--; | 1861 pInode->nShared--; |
1686 if( pInode->nShared==0 ){ | 1862 if( pInode->nShared==0 ){ |
1687 lock.l_type = F_UNLCK; | 1863 lock.l_type = F_UNLCK; |
1688 lock.l_whence = SEEK_SET; | 1864 lock.l_whence = SEEK_SET; |
1689 lock.l_start = lock.l_len = 0L; | 1865 lock.l_start = lock.l_len = 0L; |
1690 SimulateIOErrorBenign(1); | |
1691 SimulateIOError( h=(-1) ) | |
1692 SimulateIOErrorBenign(0); | |
1693 if( unixFileLock(pFile, &lock)==0 ){ | 1866 if( unixFileLock(pFile, &lock)==0 ){ |
1694 pInode->eFileLock = NO_LOCK; | 1867 pInode->eFileLock = NO_LOCK; |
1695 }else{ | 1868 }else{ |
1696 rc = SQLITE_IOERR_UNLOCK; | 1869 rc = SQLITE_IOERR_UNLOCK; |
1697 » pFile->lastErrno = errno; | 1870 pFile->lastErrno = errno; |
1698 pInode->eFileLock = NO_LOCK; | 1871 pInode->eFileLock = NO_LOCK; |
1699 pFile->eFileLock = NO_LOCK; | 1872 pFile->eFileLock = NO_LOCK; |
1700 } | 1873 } |
1701 } | 1874 } |
1702 | 1875 |
1703 /* Decrement the count of locks against this same file. When the | 1876 /* Decrement the count of locks against this same file. When the |
1704 ** count reaches zero, close any other file descriptors whose close | 1877 ** count reaches zero, close any other file descriptors whose close |
1705 ** was deferred because of outstanding locks. | 1878 ** was deferred because of outstanding locks. |
1706 */ | 1879 */ |
1707 pInode->nLock--; | 1880 pInode->nLock--; |
1708 assert( pInode->nLock>=0 ); | 1881 assert( pInode->nLock>=0 ); |
1709 if( pInode->nLock==0 ){ | 1882 if( pInode->nLock==0 ){ |
1710 closePendingFds(pFile); | 1883 closePendingFds(pFile); |
1711 } | 1884 } |
1712 } | 1885 } |
1713 » | 1886 |
1714 end_unlock: | 1887 end_unlock: |
1715 unixLeaveMutex(); | 1888 unixLeaveMutex(); |
1716 if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock; | 1889 if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock; |
1717 return rc; | 1890 return rc; |
1718 } | 1891 } |
1719 | 1892 |
1720 /* | 1893 /* |
1721 ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock | 1894 ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock |
1722 ** must be either NO_LOCK or SHARED_LOCK. | 1895 ** must be either NO_LOCK or SHARED_LOCK. |
1723 ** | 1896 ** |
1724 ** If the locking level of the file descriptor is already at or below | 1897 ** If the locking level of the file descriptor is already at or below |
1725 ** the requested locking level, this routine is a no-op. | 1898 ** the requested locking level, this routine is a no-op. |
1726 */ | 1899 */ |
1727 static int unixUnlock(sqlite3_file *id, int eFileLock){ | 1900 static int unixUnlock(sqlite3_file *id, int eFileLock){ |
| 1901 #if SQLITE_MAX_MMAP_SIZE>0 |
| 1902 assert( eFileLock==SHARED_LOCK || ((unixFile *)id)->nFetchOut==0 ); |
| 1903 #endif |
1728 return posixUnlock(id, eFileLock, 0); | 1904 return posixUnlock(id, eFileLock, 0); |
1729 } | 1905 } |
1730 | 1906 |
| 1907 #if SQLITE_MAX_MMAP_SIZE>0 |
| 1908 static int unixMapfile(unixFile *pFd, i64 nByte); |
| 1909 static void unixUnmapfile(unixFile *pFd); |
| 1910 #endif |
| 1911 |
1731 /* | 1912 /* |
1732 ** This function performs the parts of the "close file" operation | 1913 ** This function performs the parts of the "close file" operation |
1733 ** common to all locking schemes. It closes the directory and file | 1914 ** common to all locking schemes. It closes the directory and file |
1734 ** handles, if they are valid, and sets all fields of the unixFile | 1915 ** handles, if they are valid, and sets all fields of the unixFile |
1735 ** structure to 0. | 1916 ** structure to 0. |
1736 ** | 1917 ** |
1737 ** It is *not* necessary to hold the mutex when this routine is called, | 1918 ** It is *not* necessary to hold the mutex when this routine is called, |
1738 ** even on VxWorks. A mutex will be acquired on VxWorks by the | 1919 ** even on VxWorks. A mutex will be acquired on VxWorks by the |
1739 ** vxworksReleaseFileId() routine. | 1920 ** vxworksReleaseFileId() routine. |
1740 */ | 1921 */ |
1741 static int closeUnixFile(sqlite3_file *id){ | 1922 static int closeUnixFile(sqlite3_file *id){ |
1742 unixFile *pFile = (unixFile*)id; | 1923 unixFile *pFile = (unixFile*)id; |
| 1924 #if SQLITE_MAX_MMAP_SIZE>0 |
| 1925 unixUnmapfile(pFile); |
| 1926 #endif |
1743 if( pFile->h>=0 ){ | 1927 if( pFile->h>=0 ){ |
1744 robust_close(pFile, pFile->h, __LINE__); | 1928 robust_close(pFile, pFile->h, __LINE__); |
1745 pFile->h = -1; | 1929 pFile->h = -1; |
1746 } | 1930 } |
1747 #if OS_VXWORKS | 1931 #if OS_VXWORKS |
1748 if( pFile->pId ){ | 1932 if( pFile->pId ){ |
1749 if( pFile->isDelete ){ | 1933 if( pFile->ctrlFlags & UNIXFILE_DELETE ){ |
1750 osUnlink(pFile->pId->zCanonicalName); | 1934 osUnlink(pFile->pId->zCanonicalName); |
1751 } | 1935 } |
1752 vxworksReleaseFileId(pFile->pId); | 1936 vxworksReleaseFileId(pFile->pId); |
1753 pFile->pId = 0; | 1937 pFile->pId = 0; |
1754 } | 1938 } |
1755 #endif | 1939 #endif |
| 1940 #ifdef SQLITE_UNLINK_AFTER_CLOSE |
| 1941 if( pFile->ctrlFlags & UNIXFILE_DELETE ){ |
| 1942 osUnlink(pFile->zPath); |
| 1943 sqlite3_free(*(char**)&pFile->zPath); |
| 1944 pFile->zPath = 0; |
| 1945 } |
| 1946 #endif |
1756 OSTRACE(("CLOSE %-3d\n", pFile->h)); | 1947 OSTRACE(("CLOSE %-3d\n", pFile->h)); |
1757 OpenCounter(-1); | 1948 OpenCounter(-1); |
1758 sqlite3_free(pFile->pUnused); | 1949 sqlite3_free(pFile->pUnused); |
1759 memset(pFile, 0, sizeof(unixFile)); | 1950 memset(pFile, 0, sizeof(unixFile)); |
1760 return SQLITE_OK; | 1951 return SQLITE_OK; |
1761 } | 1952 } |
1762 | 1953 |
1763 /* | 1954 /* |
1764 ** Close a file. | 1955 ** Close a file. |
1765 */ | 1956 */ |
1766 static int unixClose(sqlite3_file *id){ | 1957 static int unixClose(sqlite3_file *id){ |
1767 int rc = SQLITE_OK; | 1958 int rc = SQLITE_OK; |
1768 unixFile *pFile = (unixFile *)id; | 1959 unixFile *pFile = (unixFile *)id; |
| 1960 verifyDbFile(pFile); |
1769 unixUnlock(id, NO_LOCK); | 1961 unixUnlock(id, NO_LOCK); |
1770 unixEnterMutex(); | 1962 unixEnterMutex(); |
1771 | 1963 |
1772 /* unixFile.pInode is always valid here. Otherwise, a different close | 1964 /* unixFile.pInode is always valid here. Otherwise, a different close |
1773 ** routine (e.g. nolockClose()) would be called instead. | 1965 ** routine (e.g. nolockClose()) would be called instead. |
1774 */ | 1966 */ |
1775 assert( pFile->pInode->nLock>0 || pFile->pInode->bProcessLock==0 ); | 1967 assert( pFile->pInode->nLock>0 || pFile->pInode->bProcessLock==0 ); |
1776 if( ALWAYS(pFile->pInode) && pFile->pInode->nLock ){ | 1968 if( ALWAYS(pFile->pInode) && pFile->pInode->nLock ){ |
1777 /* If there are outstanding locks, do not actually close the file just | 1969 /* If there are outstanding locks, do not actually close the file just |
1778 ** yet because that would clear those locks. Instead, add the file | 1970 ** yet because that would clear those locks. Instead, add the file |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1827 static int nolockClose(sqlite3_file *id) { | 2019 static int nolockClose(sqlite3_file *id) { |
1828 return closeUnixFile(id); | 2020 return closeUnixFile(id); |
1829 } | 2021 } |
1830 | 2022 |
1831 /******************* End of the no-op lock implementation ********************* | 2023 /******************* End of the no-op lock implementation ********************* |
1832 ******************************************************************************/ | 2024 ******************************************************************************/ |
1833 | 2025 |
1834 /****************************************************************************** | 2026 /****************************************************************************** |
1835 ************************* Begin dot-file Locking ****************************** | 2027 ************************* Begin dot-file Locking ****************************** |
1836 ** | 2028 ** |
1837 ** The dotfile locking implementation uses the existance of separate lock | 2029 ** The dotfile locking implementation uses the existence of separate lock |
1838 ** files in order to control access to the database. This works on just | 2030 ** files (really a directory) to control access to the database. This works |
1839 ** about every filesystem imaginable. But there are serious downsides: | 2031 ** on just about every filesystem imaginable. But there are serious downsides: |
1840 ** | 2032 ** |
1841 ** (1) There is zero concurrency. A single reader blocks all other | 2033 ** (1) There is zero concurrency. A single reader blocks all other |
1842 ** connections from reading or writing the database. | 2034 ** connections from reading or writing the database. |
1843 ** | 2035 ** |
1844 ** (2) An application crash or power loss can leave stale lock files | 2036 ** (2) An application crash or power loss can leave stale lock files |
1845 ** sitting around that need to be cleared manually. | 2037 ** sitting around that need to be cleared manually. |
1846 ** | 2038 ** |
1847 ** Nevertheless, a dotlock is an appropriate locking mode for use if no | 2039 ** Nevertheless, a dotlock is an appropriate locking mode for use if no |
1848 ** other locking strategy is available. | 2040 ** other locking strategy is available. |
1849 ** | 2041 ** |
1850 ** Dotfile locking works by creating a file in the same directory as the | 2042 ** Dotfile locking works by creating a subdirectory in the same directory as |
1851 ** database and with the same name but with a ".lock" extension added. | 2043 ** the database and with the same name but with a ".lock" extension added. |
1852 ** The existance of a lock file implies an EXCLUSIVE lock. All other lock | 2044 ** The existence of a lock directory implies an EXCLUSIVE lock. All other |
1853 ** types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE. | 2045 ** lock types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE. |
1854 */ | 2046 */ |
1855 | 2047 |
1856 /* | 2048 /* |
1857 ** The file suffix added to the data base filename in order to create the | 2049 ** The file suffix added to the data base filename in order to create the |
1858 ** lock file. | 2050 ** lock directory. |
1859 */ | 2051 */ |
1860 #define DOTLOCK_SUFFIX ".lock" | 2052 #define DOTLOCK_SUFFIX ".lock" |
1861 | 2053 |
1862 /* | 2054 /* |
1863 ** This routine checks if there is a RESERVED lock held on the specified | 2055 ** This routine checks if there is a RESERVED lock held on the specified |
1864 ** file by this or any other process. If such a lock is held, set *pResOut | 2056 ** file by this or any other process. If such a lock is held, set *pResOut |
1865 ** to a non-zero value otherwise *pResOut is set to zero. The return value | 2057 ** to a non-zero value otherwise *pResOut is set to zero. The return value |
1866 ** is set to SQLITE_OK unless an I/O error occurs during lock checking. | 2058 ** is set to SQLITE_OK unless an I/O error occurs during lock checking. |
1867 ** | 2059 ** |
1868 ** In dotfile locking, either a lock exists or it does not. So in this | 2060 ** In dotfile locking, either a lock exists or it does not. So in this |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1915 ** PENDING -> EXCLUSIVE | 2107 ** PENDING -> EXCLUSIVE |
1916 ** | 2108 ** |
1917 ** This routine will only increase a lock. Use the sqlite3OsUnlock() | 2109 ** This routine will only increase a lock. Use the sqlite3OsUnlock() |
1918 ** routine to lower a locking level. | 2110 ** routine to lower a locking level. |
1919 ** | 2111 ** |
1920 ** With dotfile locking, we really only support state (4): EXCLUSIVE. | 2112 ** With dotfile locking, we really only support state (4): EXCLUSIVE. |
1921 ** But we track the other locking levels internally. | 2113 ** But we track the other locking levels internally. |
1922 */ | 2114 */ |
1923 static int dotlockLock(sqlite3_file *id, int eFileLock) { | 2115 static int dotlockLock(sqlite3_file *id, int eFileLock) { |
1924 unixFile *pFile = (unixFile*)id; | 2116 unixFile *pFile = (unixFile*)id; |
1925 int fd; | |
1926 char *zLockFile = (char *)pFile->lockingContext; | 2117 char *zLockFile = (char *)pFile->lockingContext; |
1927 int rc = SQLITE_OK; | 2118 int rc = SQLITE_OK; |
1928 | 2119 |
1929 | 2120 |
1930 /* If we have any lock, then the lock file already exists. All we have | 2121 /* If we have any lock, then the lock file already exists. All we have |
1931 ** to do is adjust our internal record of the lock level. | 2122 ** to do is adjust our internal record of the lock level. |
1932 */ | 2123 */ |
1933 if( pFile->eFileLock > NO_LOCK ){ | 2124 if( pFile->eFileLock > NO_LOCK ){ |
1934 pFile->eFileLock = eFileLock; | 2125 pFile->eFileLock = eFileLock; |
1935 #if !OS_VXWORKS | |
1936 /* Always update the timestamp on the old file */ | 2126 /* Always update the timestamp on the old file */ |
| 2127 #ifdef HAVE_UTIME |
| 2128 utime(zLockFile, NULL); |
| 2129 #else |
1937 utimes(zLockFile, NULL); | 2130 utimes(zLockFile, NULL); |
1938 #endif | 2131 #endif |
1939 return SQLITE_OK; | 2132 return SQLITE_OK; |
1940 } | 2133 } |
1941 | 2134 |
1942 /* grab an exclusive lock */ | 2135 /* grab an exclusive lock */ |
1943 fd = robust_open(zLockFile,O_RDONLY|O_CREAT|O_EXCL,0600); | 2136 rc = osMkdir(zLockFile, 0777); |
1944 if( fd<0 ){ | 2137 if( rc<0 ){ |
1945 /* failed to open/create the file, someone else may have stolen the lock */ | 2138 /* failed to open/create the lock directory */ |
1946 int tErrno = errno; | 2139 int tErrno = errno; |
1947 if( EEXIST == tErrno ){ | 2140 if( EEXIST == tErrno ){ |
1948 rc = SQLITE_BUSY; | 2141 rc = SQLITE_BUSY; |
1949 } else { | 2142 } else { |
1950 rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); | 2143 rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); |
1951 if( IS_LOCK_ERROR(rc) ){ | 2144 if( IS_LOCK_ERROR(rc) ){ |
1952 pFile->lastErrno = tErrno; | 2145 pFile->lastErrno = tErrno; |
1953 } | 2146 } |
1954 } | 2147 } |
1955 return rc; | 2148 return rc; |
1956 } | 2149 } |
1957 robust_close(pFile, fd, __LINE__); | |
1958 | 2150 |
1959 /* got it, set the type and return ok */ | 2151 /* got it, set the type and return ok */ |
1960 pFile->eFileLock = eFileLock; | 2152 pFile->eFileLock = eFileLock; |
1961 return rc; | 2153 return rc; |
1962 } | 2154 } |
1963 | 2155 |
1964 /* | 2156 /* |
1965 ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock | 2157 ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock |
1966 ** must be either NO_LOCK or SHARED_LOCK. | 2158 ** must be either NO_LOCK or SHARED_LOCK. |
1967 ** | 2159 ** |
1968 ** If the locking level of the file descriptor is already at or below | 2160 ** If the locking level of the file descriptor is already at or below |
1969 ** the requested locking level, this routine is a no-op. | 2161 ** the requested locking level, this routine is a no-op. |
1970 ** | 2162 ** |
1971 ** When the locking level reaches NO_LOCK, delete the lock file. | 2163 ** When the locking level reaches NO_LOCK, delete the lock file. |
1972 */ | 2164 */ |
1973 static int dotlockUnlock(sqlite3_file *id, int eFileLock) { | 2165 static int dotlockUnlock(sqlite3_file *id, int eFileLock) { |
1974 unixFile *pFile = (unixFile*)id; | 2166 unixFile *pFile = (unixFile*)id; |
1975 char *zLockFile = (char *)pFile->lockingContext; | 2167 char *zLockFile = (char *)pFile->lockingContext; |
| 2168 int rc; |
1976 | 2169 |
1977 assert( pFile ); | 2170 assert( pFile ); |
1978 OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, | 2171 OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, |
1979 » pFile->eFileLock, getpid())); | 2172 pFile->eFileLock, getpid())); |
1980 assert( eFileLock<=SHARED_LOCK ); | 2173 assert( eFileLock<=SHARED_LOCK ); |
1981 | 2174 |
1982 /* no-op if possible */ | 2175 /* no-op if possible */ |
1983 if( pFile->eFileLock==eFileLock ){ | 2176 if( pFile->eFileLock==eFileLock ){ |
1984 return SQLITE_OK; | 2177 return SQLITE_OK; |
1985 } | 2178 } |
1986 | 2179 |
1987 /* To downgrade to shared, simply update our internal notion of the | 2180 /* To downgrade to shared, simply update our internal notion of the |
1988 ** lock state. No need to mess with the file on disk. | 2181 ** lock state. No need to mess with the file on disk. |
1989 */ | 2182 */ |
1990 if( eFileLock==SHARED_LOCK ){ | 2183 if( eFileLock==SHARED_LOCK ){ |
1991 pFile->eFileLock = SHARED_LOCK; | 2184 pFile->eFileLock = SHARED_LOCK; |
1992 return SQLITE_OK; | 2185 return SQLITE_OK; |
1993 } | 2186 } |
1994 | 2187 |
1995 /* To fully unlock the database, delete the lock file */ | 2188 /* To fully unlock the database, delete the lock file */ |
1996 assert( eFileLock==NO_LOCK ); | 2189 assert( eFileLock==NO_LOCK ); |
1997 if( osUnlink(zLockFile) ){ | 2190 rc = osRmdir(zLockFile); |
1998 int rc = 0; | 2191 if( rc<0 && errno==ENOTDIR ) rc = osUnlink(zLockFile); |
| 2192 if( rc<0 ){ |
1999 int tErrno = errno; | 2193 int tErrno = errno; |
| 2194 rc = 0; |
2000 if( ENOENT != tErrno ){ | 2195 if( ENOENT != tErrno ){ |
2001 rc = SQLITE_IOERR_UNLOCK; | 2196 rc = SQLITE_IOERR_UNLOCK; |
2002 } | 2197 } |
2003 if( IS_LOCK_ERROR(rc) ){ | 2198 if( IS_LOCK_ERROR(rc) ){ |
2004 pFile->lastErrno = tErrno; | 2199 pFile->lastErrno = tErrno; |
2005 } | 2200 } |
2006 return rc; | 2201 return rc; |
2007 } | 2202 } |
2008 pFile->eFileLock = NO_LOCK; | 2203 pFile->eFileLock = NO_LOCK; |
2009 return SQLITE_OK; | 2204 return SQLITE_OK; |
2010 } | 2205 } |
2011 | 2206 |
2012 /* | 2207 /* |
2013 ** Close a file. Make sure the lock has been released before closing. | 2208 ** Close a file. Make sure the lock has been released before closing. |
2014 */ | 2209 */ |
2015 static int dotlockClose(sqlite3_file *id) { | 2210 static int dotlockClose(sqlite3_file *id) { |
2016 int rc; | 2211 int rc = SQLITE_OK; |
2017 if( id ){ | 2212 if( id ){ |
2018 unixFile *pFile = (unixFile*)id; | 2213 unixFile *pFile = (unixFile*)id; |
2019 dotlockUnlock(id, NO_LOCK); | 2214 dotlockUnlock(id, NO_LOCK); |
2020 sqlite3_free(pFile->lockingContext); | 2215 sqlite3_free(pFile->lockingContext); |
| 2216 rc = closeUnixFile(id); |
2021 } | 2217 } |
2022 rc = closeUnixFile(id); | |
2023 return rc; | 2218 return rc; |
2024 } | 2219 } |
2025 /****************** End of the dot-file lock implementation ******************* | 2220 /****************** End of the dot-file lock implementation ******************* |
2026 ******************************************************************************/ | 2221 ******************************************************************************/ |
2027 | 2222 |
2028 /****************************************************************************** | 2223 /****************************************************************************** |
2029 ************************** Begin flock Locking ******************************** | 2224 ************************** Begin flock Locking ******************************** |
2030 ** | 2225 ** |
2031 ** Use the flock() system call to do file locking. | 2226 ** Use the flock() system call to do file locking. |
2032 ** | 2227 ** |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2216 }else{ | 2411 }else{ |
2217 pFile->eFileLock = NO_LOCK; | 2412 pFile->eFileLock = NO_LOCK; |
2218 return SQLITE_OK; | 2413 return SQLITE_OK; |
2219 } | 2414 } |
2220 } | 2415 } |
2221 | 2416 |
2222 /* | 2417 /* |
2223 ** Close a file. | 2418 ** Close a file. |
2224 */ | 2419 */ |
2225 static int flockClose(sqlite3_file *id) { | 2420 static int flockClose(sqlite3_file *id) { |
| 2421 int rc = SQLITE_OK; |
2226 if( id ){ | 2422 if( id ){ |
2227 flockUnlock(id, NO_LOCK); | 2423 flockUnlock(id, NO_LOCK); |
| 2424 rc = closeUnixFile(id); |
2228 } | 2425 } |
2229 return closeUnixFile(id); | 2426 return rc; |
2230 } | 2427 } |
2231 | 2428 |
2232 #endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */ | 2429 #endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */ |
2233 | 2430 |
2234 /******************* End of the flock lock implementation ********************* | 2431 /******************* End of the flock lock implementation ********************* |
2235 ******************************************************************************/ | 2432 ******************************************************************************/ |
2236 | 2433 |
2237 /****************************************************************************** | 2434 /****************************************************************************** |
2238 ************************ Begin Named Semaphore Locking ************************ | 2435 ************************ Begin Named Semaphore Locking ************************ |
2239 ** | 2436 ** |
(...skipping 22 matching lines...) Expand all Loading... |
2262 assert( pFile ); | 2459 assert( pFile ); |
2263 | 2460 |
2264 /* Check if a thread in this process holds such a lock */ | 2461 /* Check if a thread in this process holds such a lock */ |
2265 if( pFile->eFileLock>SHARED_LOCK ){ | 2462 if( pFile->eFileLock>SHARED_LOCK ){ |
2266 reserved = 1; | 2463 reserved = 1; |
2267 } | 2464 } |
2268 | 2465 |
2269 /* Otherwise see if some other process holds it. */ | 2466 /* Otherwise see if some other process holds it. */ |
2270 if( !reserved ){ | 2467 if( !reserved ){ |
2271 sem_t *pSem = pFile->pInode->pSem; | 2468 sem_t *pSem = pFile->pInode->pSem; |
2272 struct stat statBuf; | |
2273 | 2469 |
2274 if( sem_trywait(pSem)==-1 ){ | 2470 if( sem_trywait(pSem)==-1 ){ |
2275 int tErrno = errno; | 2471 int tErrno = errno; |
2276 if( EAGAIN != tErrno ){ | 2472 if( EAGAIN != tErrno ){ |
2277 rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK); | 2473 rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK); |
2278 pFile->lastErrno = tErrno; | 2474 pFile->lastErrno = tErrno; |
2279 } else { | 2475 } else { |
2280 /* someone else has the lock when we are in NO_LOCK */ | 2476 /* someone else has the lock when we are in NO_LOCK */ |
2281 reserved = (pFile->eFileLock < SHARED_LOCK); | 2477 reserved = (pFile->eFileLock < SHARED_LOCK); |
2282 } | 2478 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2315 ** Semaphore locks only really support EXCLUSIVE locks. We track intermediate | 2511 ** Semaphore locks only really support EXCLUSIVE locks. We track intermediate |
2316 ** lock states in the sqlite3_file structure, but all locks SHARED or | 2512 ** lock states in the sqlite3_file structure, but all locks SHARED or |
2317 ** above are really EXCLUSIVE locks and exclude all other processes from | 2513 ** above are really EXCLUSIVE locks and exclude all other processes from |
2318 ** access the file. | 2514 ** access the file. |
2319 ** | 2515 ** |
2320 ** This routine will only increase a lock. Use the sqlite3OsUnlock() | 2516 ** This routine will only increase a lock. Use the sqlite3OsUnlock() |
2321 ** routine to lower a locking level. | 2517 ** routine to lower a locking level. |
2322 */ | 2518 */ |
2323 static int semLock(sqlite3_file *id, int eFileLock) { | 2519 static int semLock(sqlite3_file *id, int eFileLock) { |
2324 unixFile *pFile = (unixFile*)id; | 2520 unixFile *pFile = (unixFile*)id; |
2325 int fd; | |
2326 sem_t *pSem = pFile->pInode->pSem; | 2521 sem_t *pSem = pFile->pInode->pSem; |
2327 int rc = SQLITE_OK; | 2522 int rc = SQLITE_OK; |
2328 | 2523 |
2329 /* if we already have a lock, it is exclusive. | 2524 /* if we already have a lock, it is exclusive. |
2330 ** Just adjust level and punt on outta here. */ | 2525 ** Just adjust level and punt on outta here. */ |
2331 if (pFile->eFileLock > NO_LOCK) { | 2526 if (pFile->eFileLock > NO_LOCK) { |
2332 pFile->eFileLock = eFileLock; | 2527 pFile->eFileLock = eFileLock; |
2333 rc = SQLITE_OK; | 2528 rc = SQLITE_OK; |
2334 goto sem_end_lock; | 2529 goto sem_end_lock; |
2335 } | 2530 } |
(...skipping 18 matching lines...) Expand all Loading... |
2354 ** If the locking level of the file descriptor is already at or below | 2549 ** If the locking level of the file descriptor is already at or below |
2355 ** the requested locking level, this routine is a no-op. | 2550 ** the requested locking level, this routine is a no-op. |
2356 */ | 2551 */ |
2357 static int semUnlock(sqlite3_file *id, int eFileLock) { | 2552 static int semUnlock(sqlite3_file *id, int eFileLock) { |
2358 unixFile *pFile = (unixFile*)id; | 2553 unixFile *pFile = (unixFile*)id; |
2359 sem_t *pSem = pFile->pInode->pSem; | 2554 sem_t *pSem = pFile->pInode->pSem; |
2360 | 2555 |
2361 assert( pFile ); | 2556 assert( pFile ); |
2362 assert( pSem ); | 2557 assert( pSem ); |
2363 OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, | 2558 OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, |
2364 » pFile->eFileLock, getpid())); | 2559 pFile->eFileLock, getpid())); |
2365 assert( eFileLock<=SHARED_LOCK ); | 2560 assert( eFileLock<=SHARED_LOCK ); |
2366 | 2561 |
2367 /* no-op if possible */ | 2562 /* no-op if possible */ |
2368 if( pFile->eFileLock==eFileLock ){ | 2563 if( pFile->eFileLock==eFileLock ){ |
2369 return SQLITE_OK; | 2564 return SQLITE_OK; |
2370 } | 2565 } |
2371 | 2566 |
2372 /* shared can just be set because we always have an exclusive */ | 2567 /* shared can just be set because we always have an exclusive */ |
2373 if (eFileLock==SHARED_LOCK) { | 2568 if (eFileLock==SHARED_LOCK) { |
2374 pFile->eFileLock = eFileLock; | 2569 pFile->eFileLock = eFileLock; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2493 /* | 2688 /* |
2494 ** This routine checks if there is a RESERVED lock held on the specified | 2689 ** This routine checks if there is a RESERVED lock held on the specified |
2495 ** file by this or any other process. If such a lock is held, set *pResOut | 2690 ** file by this or any other process. If such a lock is held, set *pResOut |
2496 ** to a non-zero value otherwise *pResOut is set to zero. The return value | 2691 ** to a non-zero value otherwise *pResOut is set to zero. The return value |
2497 ** is set to SQLITE_OK unless an I/O error occurs during lock checking. | 2692 ** is set to SQLITE_OK unless an I/O error occurs during lock checking. |
2498 */ | 2693 */ |
2499 static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ | 2694 static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ |
2500 int rc = SQLITE_OK; | 2695 int rc = SQLITE_OK; |
2501 int reserved = 0; | 2696 int reserved = 0; |
2502 unixFile *pFile = (unixFile*)id; | 2697 unixFile *pFile = (unixFile*)id; |
| 2698 afpLockingContext *context; |
2503 | 2699 |
2504 SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); | 2700 SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); |
2505 | 2701 |
2506 assert( pFile ); | 2702 assert( pFile ); |
2507 afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; | 2703 context = (afpLockingContext *) pFile->lockingContext; |
2508 if( context->reserved ){ | 2704 if( context->reserved ){ |
2509 *pResOut = 1; | 2705 *pResOut = 1; |
2510 return SQLITE_OK; | 2706 return SQLITE_OK; |
2511 } | 2707 } |
2512 unixEnterMutex(); /* Because pFile->pInode is shared across threads */ | 2708 unixEnterMutex(); /* Because pFile->pInode is shared across threads */ |
2513 | 2709 |
2514 /* Check if a thread in this process holds such a lock */ | 2710 /* Check if a thread in this process holds such a lock */ |
2515 if( pFile->pInode->eFileLock>SHARED_LOCK ){ | 2711 if( pFile->pInode->eFileLock>SHARED_LOCK ){ |
2516 reserved = 1; | 2712 reserved = 1; |
2517 } | 2713 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2637 if (failed) { | 2833 if (failed) { |
2638 rc = failed; | 2834 rc = failed; |
2639 goto afp_end_lock; | 2835 goto afp_end_lock; |
2640 } | 2836 } |
2641 } | 2837 } |
2642 | 2838 |
2643 /* If control gets to this point, then actually go ahead and make | 2839 /* If control gets to this point, then actually go ahead and make |
2644 ** operating system calls for the specified lock. | 2840 ** operating system calls for the specified lock. |
2645 */ | 2841 */ |
2646 if( eFileLock==SHARED_LOCK ){ | 2842 if( eFileLock==SHARED_LOCK ){ |
2647 int lrc1, lrc2, lrc1Errno; | 2843 int lrc1, lrc2, lrc1Errno = 0; |
2648 long lk, mask; | 2844 long lk, mask; |
2649 | 2845 |
2650 assert( pInode->nShared==0 ); | 2846 assert( pInode->nShared==0 ); |
2651 assert( pInode->eFileLock==0 ); | 2847 assert( pInode->eFileLock==0 ); |
2652 | 2848 |
2653 mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff; | 2849 mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff; |
2654 /* Now get the read-lock SHARED_LOCK */ | 2850 /* Now get the read-lock SHARED_LOCK */ |
2655 /* note that the quality of the randomness doesn't matter that much */ | 2851 /* note that the quality of the randomness doesn't matter that much */ |
2656 lk = random(); | 2852 lk = random(); |
2657 pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1); | 2853 pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2768 } | 2964 } |
2769 unixEnterMutex(); | 2965 unixEnterMutex(); |
2770 pInode = pFile->pInode; | 2966 pInode = pFile->pInode; |
2771 assert( pInode->nShared!=0 ); | 2967 assert( pInode->nShared!=0 ); |
2772 if( pFile->eFileLock>SHARED_LOCK ){ | 2968 if( pFile->eFileLock>SHARED_LOCK ){ |
2773 assert( pInode->eFileLock==pFile->eFileLock ); | 2969 assert( pInode->eFileLock==pFile->eFileLock ); |
2774 SimulateIOErrorBenign(1); | 2970 SimulateIOErrorBenign(1); |
2775 SimulateIOError( h=(-1) ) | 2971 SimulateIOError( h=(-1) ) |
2776 SimulateIOErrorBenign(0); | 2972 SimulateIOErrorBenign(0); |
2777 | 2973 |
2778 #ifndef NDEBUG | 2974 #ifdef SQLITE_DEBUG |
2779 /* When reducing a lock such that other processes can start | 2975 /* When reducing a lock such that other processes can start |
2780 ** reading the database file again, make sure that the | 2976 ** reading the database file again, make sure that the |
2781 ** transaction counter was updated if any part of the database | 2977 ** transaction counter was updated if any part of the database |
2782 ** file changed. If the transaction counter is not updated, | 2978 ** file changed. If the transaction counter is not updated, |
2783 ** other connections to the same file might not realize that | 2979 ** other connections to the same file might not realize that |
2784 ** the file has changed and hence might not know to flush their | 2980 ** the file has changed and hence might not know to flush their |
2785 ** cache. The use of a stale cache can lead to database corruption. | 2981 ** cache. The use of a stale cache can lead to database corruption. |
2786 */ | 2982 */ |
2787 assert( pFile->inNormalWrite==0 | 2983 assert( pFile->inNormalWrite==0 |
2788 || pFile->dbUpdate==0 | 2984 || pFile->dbUpdate==0 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2916 ** are gather together into this division. | 3112 ** are gather together into this division. |
2917 */ | 3113 */ |
2918 | 3114 |
2919 /* | 3115 /* |
2920 ** Seek to the offset passed as the second argument, then read cnt | 3116 ** Seek to the offset passed as the second argument, then read cnt |
2921 ** bytes into pBuf. Return the number of bytes actually read. | 3117 ** bytes into pBuf. Return the number of bytes actually read. |
2922 ** | 3118 ** |
2923 ** NB: If you define USE_PREAD or USE_PREAD64, then it might also | 3119 ** NB: If you define USE_PREAD or USE_PREAD64, then it might also |
2924 ** be necessary to define _XOPEN_SOURCE to be 500. This varies from | 3120 ** be necessary to define _XOPEN_SOURCE to be 500. This varies from |
2925 ** one system to another. Since SQLite does not define USE_PREAD | 3121 ** one system to another. Since SQLite does not define USE_PREAD |
2926 ** any any form by default, we will not attempt to define _XOPEN_SOURCE. | 3122 ** in any form by default, we will not attempt to define _XOPEN_SOURCE. |
2927 ** See tickets #2741 and #2681. | 3123 ** See tickets #2741 and #2681. |
2928 ** | 3124 ** |
2929 ** To avoid stomping the errno value on a failed read the lastErrno value | 3125 ** To avoid stomping the errno value on a failed read the lastErrno value |
2930 ** is set before returning. | 3126 ** is set before returning. |
2931 */ | 3127 */ |
2932 static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ | 3128 static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ |
2933 int got; | 3129 int got; |
| 3130 int prior = 0; |
2934 #if (!defined(USE_PREAD) && !defined(USE_PREAD64)) | 3131 #if (!defined(USE_PREAD) && !defined(USE_PREAD64)) |
2935 i64 newOffset; | 3132 i64 newOffset; |
2936 #endif | 3133 #endif |
2937 TIMER_START; | 3134 TIMER_START; |
| 3135 assert( cnt==(cnt&0x1ffff) ); |
| 3136 assert( id->h>2 ); |
| 3137 cnt &= 0x1ffff; |
| 3138 do{ |
2938 #if defined(USE_PREAD) | 3139 #if defined(USE_PREAD) |
2939 do{ got = osPread(id->h, pBuf, cnt, offset); }while( got<0 && errno==EINTR ); | 3140 got = osPread(id->h, pBuf, cnt, offset); |
2940 SimulateIOError( got = -1 ); | 3141 SimulateIOError( got = -1 ); |
2941 #elif defined(USE_PREAD64) | 3142 #elif defined(USE_PREAD64) |
2942 do{ got = osPread64(id->h, pBuf, cnt, offset); }while( got<0 && errno==EINTR); | 3143 got = osPread64(id->h, pBuf, cnt, offset); |
2943 SimulateIOError( got = -1 ); | 3144 SimulateIOError( got = -1 ); |
2944 #else | 3145 #else |
2945 newOffset = lseek(id->h, offset, SEEK_SET); | 3146 newOffset = lseek(id->h, offset, SEEK_SET); |
2946 SimulateIOError( newOffset-- ); | 3147 SimulateIOError( newOffset-- ); |
2947 if( newOffset!=offset ){ | 3148 if( newOffset!=offset ){ |
2948 if( newOffset == -1 ){ | 3149 if( newOffset == -1 ){ |
| 3150 ((unixFile*)id)->lastErrno = errno; |
| 3151 }else{ |
| 3152 ((unixFile*)id)->lastErrno = 0; |
| 3153 } |
| 3154 return -1; |
| 3155 } |
| 3156 got = osRead(id->h, pBuf, cnt); |
| 3157 #endif |
| 3158 if( got==cnt ) break; |
| 3159 if( got<0 ){ |
| 3160 if( errno==EINTR ){ got = 1; continue; } |
| 3161 prior = 0; |
2949 ((unixFile*)id)->lastErrno = errno; | 3162 ((unixFile*)id)->lastErrno = errno; |
2950 }else{ | 3163 break; |
2951 ((unixFile*)id)->lastErrno = 0;» » » | 3164 }else if( got>0 ){ |
| 3165 cnt -= got; |
| 3166 offset += got; |
| 3167 prior += got; |
| 3168 pBuf = (void*)(got + (char*)pBuf); |
2952 } | 3169 } |
2953 return -1; | 3170 }while( got>0 ); |
2954 } | |
2955 do{ got = osRead(id->h, pBuf, cnt); }while( got<0 && errno==EINTR ); | |
2956 #endif | |
2957 TIMER_END; | 3171 TIMER_END; |
2958 if( got<0 ){ | 3172 OSTRACE(("READ %-3d %5d %7lld %llu\n", |
2959 ((unixFile*)id)->lastErrno = errno; | 3173 id->h, got+prior, offset-prior, TIMER_ELAPSED)); |
2960 } | 3174 return got+prior; |
2961 OSTRACE(("READ %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED)); | |
2962 return got; | |
2963 } | 3175 } |
2964 | 3176 |
2965 /* | 3177 /* |
2966 ** Read data from a file into a buffer. Return SQLITE_OK if all | 3178 ** Read data from a file into a buffer. Return SQLITE_OK if all |
2967 ** bytes were read successfully and SQLITE_IOERR if anything goes | 3179 ** bytes were read successfully and SQLITE_IOERR if anything goes |
2968 ** wrong. | 3180 ** wrong. |
2969 */ | 3181 */ |
2970 static int unixRead( | 3182 static int unixRead( |
2971 sqlite3_file *id, | 3183 sqlite3_file *id, |
2972 void *pBuf, | 3184 void *pBuf, |
2973 int amt, | 3185 int amt, |
2974 sqlite3_int64 offset | 3186 sqlite3_int64 offset |
2975 ){ | 3187 ){ |
2976 unixFile *pFile = (unixFile *)id; | 3188 unixFile *pFile = (unixFile *)id; |
2977 int got; | 3189 int got; |
2978 assert( id ); | 3190 assert( id ); |
| 3191 assert( offset>=0 ); |
| 3192 assert( amt>0 ); |
2979 | 3193 |
2980 /* If this is a database file (not a journal, master-journal or temp | 3194 /* If this is a database file (not a journal, master-journal or temp |
2981 ** file), the bytes in the locking range should never be read or written. */ | 3195 ** file), the bytes in the locking range should never be read or written. */ |
2982 #if 0 | 3196 #if 0 |
2983 assert( pFile->pUnused==0 | 3197 assert( pFile->pUnused==0 |
2984 || offset>=PENDING_BYTE+512 | 3198 || offset>=PENDING_BYTE+512 |
2985 || offset+amt<=PENDING_BYTE | 3199 || offset+amt<=PENDING_BYTE |
2986 ); | 3200 ); |
2987 #endif | 3201 #endif |
2988 | 3202 |
| 3203 #if SQLITE_MAX_MMAP_SIZE>0 |
| 3204 /* Deal with as much of this read request as possible by transfering |
| 3205 ** data from the memory mapping using memcpy(). */ |
| 3206 if( offset<pFile->mmapSize ){ |
| 3207 if( offset+amt <= pFile->mmapSize ){ |
| 3208 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); |
| 3209 return SQLITE_OK; |
| 3210 }else{ |
| 3211 int nCopy = pFile->mmapSize - offset; |
| 3212 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); |
| 3213 pBuf = &((u8 *)pBuf)[nCopy]; |
| 3214 amt -= nCopy; |
| 3215 offset += nCopy; |
| 3216 } |
| 3217 } |
| 3218 #endif |
| 3219 |
2989 got = seekAndRead(pFile, offset, pBuf, amt); | 3220 got = seekAndRead(pFile, offset, pBuf, amt); |
2990 if( got==amt ){ | 3221 if( got==amt ){ |
2991 return SQLITE_OK; | 3222 return SQLITE_OK; |
2992 }else if( got<0 ){ | 3223 }else if( got<0 ){ |
2993 /* lastErrno set by seekAndRead */ | 3224 /* lastErrno set by seekAndRead */ |
2994 return SQLITE_IOERR_READ; | 3225 return SQLITE_IOERR_READ; |
2995 }else{ | 3226 }else{ |
2996 pFile->lastErrno = 0; /* not a system error */ | 3227 pFile->lastErrno = 0; /* not a system error */ |
2997 /* Unread parts of the buffer must be zero-filled */ | 3228 /* Unread parts of the buffer must be zero-filled */ |
2998 memset(&((char*)pBuf)[got], 0, amt-got); | 3229 memset(&((char*)pBuf)[got], 0, amt-got); |
2999 return SQLITE_IOERR_SHORT_READ; | 3230 return SQLITE_IOERR_SHORT_READ; |
3000 } | 3231 } |
3001 } | 3232 } |
3002 | 3233 |
3003 /* | 3234 /* |
| 3235 ** Attempt to seek the file-descriptor passed as the first argument to |
| 3236 ** absolute offset iOff, then attempt to write nBuf bytes of data from |
| 3237 ** pBuf to it. If an error occurs, return -1 and set *piErrno. Otherwise, |
| 3238 ** return the actual number of bytes written (which may be less than |
| 3239 ** nBuf). |
| 3240 */ |
| 3241 static int seekAndWriteFd( |
| 3242 int fd, /* File descriptor to write to */ |
| 3243 i64 iOff, /* File offset to begin writing at */ |
| 3244 const void *pBuf, /* Copy data from this buffer to the file */ |
| 3245 int nBuf, /* Size of buffer pBuf in bytes */ |
| 3246 int *piErrno /* OUT: Error number if error occurs */ |
| 3247 ){ |
| 3248 int rc = 0; /* Value returned by system call */ |
| 3249 |
| 3250 assert( nBuf==(nBuf&0x1ffff) ); |
| 3251 assert( fd>2 ); |
| 3252 nBuf &= 0x1ffff; |
| 3253 TIMER_START; |
| 3254 |
| 3255 #if defined(USE_PREAD) |
| 3256 do{ rc = osPwrite(fd, pBuf, nBuf, iOff); }while( rc<0 && errno==EINTR ); |
| 3257 #elif defined(USE_PREAD64) |
| 3258 do{ rc = osPwrite64(fd, pBuf, nBuf, iOff);}while( rc<0 && errno==EINTR); |
| 3259 #else |
| 3260 do{ |
| 3261 i64 iSeek = lseek(fd, iOff, SEEK_SET); |
| 3262 SimulateIOError( iSeek-- ); |
| 3263 |
| 3264 if( iSeek!=iOff ){ |
| 3265 if( piErrno ) *piErrno = (iSeek==-1 ? errno : 0); |
| 3266 return -1; |
| 3267 } |
| 3268 rc = osWrite(fd, pBuf, nBuf); |
| 3269 }while( rc<0 && errno==EINTR ); |
| 3270 #endif |
| 3271 |
| 3272 TIMER_END; |
| 3273 OSTRACE(("WRITE %-3d %5d %7lld %llu\n", fd, rc, iOff, TIMER_ELAPSED)); |
| 3274 |
| 3275 if( rc<0 && piErrno ) *piErrno = errno; |
| 3276 return rc; |
| 3277 } |
| 3278 |
| 3279 |
| 3280 /* |
3004 ** Seek to the offset in id->offset then read cnt bytes into pBuf. | 3281 ** Seek to the offset in id->offset then read cnt bytes into pBuf. |
3005 ** Return the number of bytes actually read. Update the offset. | 3282 ** Return the number of bytes actually read. Update the offset. |
3006 ** | 3283 ** |
3007 ** To avoid stomping the errno value on a failed write the lastErrno value | 3284 ** To avoid stomping the errno value on a failed write the lastErrno value |
3008 ** is set before returning. | 3285 ** is set before returning. |
3009 */ | 3286 */ |
3010 static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ | 3287 static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ |
3011 int got; | 3288 return seekAndWriteFd(id->h, offset, pBuf, cnt, &id->lastErrno); |
3012 #if (!defined(USE_PREAD) && !defined(USE_PREAD64)) | |
3013 i64 newOffset; | |
3014 #endif | |
3015 TIMER_START; | |
3016 #if defined(USE_PREAD) | |
3017 do{ got = osPwrite(id->h, pBuf, cnt, offset); }while( got<0 && errno==EINTR ); | |
3018 #elif defined(USE_PREAD64) | |
3019 do{ got = osPwrite64(id->h, pBuf, cnt, offset);}while( got<0 && errno==EINTR); | |
3020 #else | |
3021 newOffset = lseek(id->h, offset, SEEK_SET); | |
3022 SimulateIOError( newOffset-- ); | |
3023 if( newOffset!=offset ){ | |
3024 if( newOffset == -1 ){ | |
3025 ((unixFile*)id)->lastErrno = errno; | |
3026 }else{ | |
3027 ((unixFile*)id)->lastErrno = 0;» » » | |
3028 } | |
3029 return -1; | |
3030 } | |
3031 do{ got = osWrite(id->h, pBuf, cnt); }while( got<0 && errno==EINTR ); | |
3032 #endif | |
3033 TIMER_END; | |
3034 if( got<0 ){ | |
3035 ((unixFile*)id)->lastErrno = errno; | |
3036 } | |
3037 | |
3038 OSTRACE(("WRITE %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED)); | |
3039 return got; | |
3040 } | 3289 } |
3041 | 3290 |
3042 | 3291 |
3043 /* | 3292 /* |
3044 ** Write data from a buffer into a file. Return SQLITE_OK on success | 3293 ** Write data from a buffer into a file. Return SQLITE_OK on success |
3045 ** or some other error code on failure. | 3294 ** or some other error code on failure. |
3046 */ | 3295 */ |
3047 static int unixWrite( | 3296 static int unixWrite( |
3048 sqlite3_file *id, | 3297 sqlite3_file *id, |
3049 const void *pBuf, | 3298 const void *pBuf, |
3050 int amt, | 3299 int amt, |
3051 sqlite3_int64 offset | 3300 sqlite3_int64 offset |
3052 ){ | 3301 ){ |
3053 unixFile *pFile = (unixFile*)id; | 3302 unixFile *pFile = (unixFile*)id; |
3054 int wrote = 0; | 3303 int wrote = 0; |
3055 assert( id ); | 3304 assert( id ); |
3056 assert( amt>0 ); | 3305 assert( amt>0 ); |
3057 | 3306 |
3058 /* If this is a database file (not a journal, master-journal or temp | 3307 /* If this is a database file (not a journal, master-journal or temp |
3059 ** file), the bytes in the locking range should never be read or written. */ | 3308 ** file), the bytes in the locking range should never be read or written. */ |
3060 #if 0 | 3309 #if 0 |
3061 assert( pFile->pUnused==0 | 3310 assert( pFile->pUnused==0 |
3062 || offset>=PENDING_BYTE+512 | 3311 || offset>=PENDING_BYTE+512 |
3063 || offset+amt<=PENDING_BYTE | 3312 || offset+amt<=PENDING_BYTE |
3064 ); | 3313 ); |
3065 #endif | 3314 #endif |
3066 | 3315 |
3067 #ifndef NDEBUG | 3316 #ifdef SQLITE_DEBUG |
3068 /* If we are doing a normal write to a database file (as opposed to | 3317 /* If we are doing a normal write to a database file (as opposed to |
3069 ** doing a hot-journal rollback or a write to some file other than a | 3318 ** doing a hot-journal rollback or a write to some file other than a |
3070 ** normal database file) then record the fact that the database | 3319 ** normal database file) then record the fact that the database |
3071 ** has changed. If the transaction counter is modified, record that | 3320 ** has changed. If the transaction counter is modified, record that |
3072 ** fact too. | 3321 ** fact too. |
3073 */ | 3322 */ |
3074 if( pFile->inNormalWrite ){ | 3323 if( pFile->inNormalWrite ){ |
3075 pFile->dbUpdate = 1; /* The database has been modified */ | 3324 pFile->dbUpdate = 1; /* The database has been modified */ |
3076 if( offset<=24 && offset+amt>=27 ){ | 3325 if( offset<=24 && offset+amt>=27 ){ |
3077 int rc; | 3326 int rc; |
3078 char oldCntr[4]; | 3327 char oldCntr[4]; |
3079 SimulateIOErrorBenign(1); | 3328 SimulateIOErrorBenign(1); |
3080 rc = seekAndRead(pFile, 24, oldCntr, 4); | 3329 rc = seekAndRead(pFile, 24, oldCntr, 4); |
3081 SimulateIOErrorBenign(0); | 3330 SimulateIOErrorBenign(0); |
3082 if( rc!=4 || memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){ | 3331 if( rc!=4 || memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){ |
3083 pFile->transCntrChng = 1; /* The transaction counter has changed */ | 3332 pFile->transCntrChng = 1; /* The transaction counter has changed */ |
3084 } | 3333 } |
3085 } | 3334 } |
3086 } | 3335 } |
3087 #endif | 3336 #endif |
3088 | 3337 |
| 3338 #if SQLITE_MAX_MMAP_SIZE>0 |
| 3339 /* Deal with as much of this write request as possible by transfering |
| 3340 ** data from the memory mapping using memcpy(). */ |
| 3341 if( offset<pFile->mmapSize ){ |
| 3342 if( offset+amt <= pFile->mmapSize ){ |
| 3343 memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); |
| 3344 return SQLITE_OK; |
| 3345 }else{ |
| 3346 int nCopy = pFile->mmapSize - offset; |
| 3347 memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); |
| 3348 pBuf = &((u8 *)pBuf)[nCopy]; |
| 3349 amt -= nCopy; |
| 3350 offset += nCopy; |
| 3351 } |
| 3352 } |
| 3353 #endif |
| 3354 |
3089 while( amt>0 && (wrote = seekAndWrite(pFile, offset, pBuf, amt))>0 ){ | 3355 while( amt>0 && (wrote = seekAndWrite(pFile, offset, pBuf, amt))>0 ){ |
3090 amt -= wrote; | 3356 amt -= wrote; |
3091 offset += wrote; | 3357 offset += wrote; |
3092 pBuf = &((char*)pBuf)[wrote]; | 3358 pBuf = &((char*)pBuf)[wrote]; |
3093 } | 3359 } |
3094 SimulateIOError(( wrote=(-1), amt=1 )); | 3360 SimulateIOError(( wrote=(-1), amt=1 )); |
3095 SimulateDiskfullError(( wrote=0, amt=1 )); | 3361 SimulateDiskfullError(( wrote=0, amt=1 )); |
3096 | 3362 |
3097 if( amt>0 ){ | 3363 if( amt>0 ){ |
3098 if( wrote<0 ){ | 3364 if( wrote<0 && pFile->lastErrno!=ENOSPC ){ |
3099 /* lastErrno set by seekAndWrite */ | 3365 /* lastErrno set by seekAndWrite */ |
3100 return SQLITE_IOERR_WRITE; | 3366 return SQLITE_IOERR_WRITE; |
3101 }else{ | 3367 }else{ |
3102 pFile->lastErrno = 0; /* not a system error */ | 3368 pFile->lastErrno = 0; /* not a system error */ |
3103 return SQLITE_FULL; | 3369 return SQLITE_FULL; |
3104 } | 3370 } |
3105 } | 3371 } |
3106 | 3372 |
3107 return SQLITE_OK; | 3373 return SQLITE_OK; |
3108 } | 3374 } |
3109 | 3375 |
3110 #ifdef SQLITE_TEST | 3376 #ifdef SQLITE_TEST |
3111 /* | 3377 /* |
3112 ** Count the number of fullsyncs and normal syncs. This is used to test | 3378 ** Count the number of fullsyncs and normal syncs. This is used to test |
3113 ** that syncs and fullsyncs are occurring at the right times. | 3379 ** that syncs and fullsyncs are occurring at the right times. |
3114 */ | 3380 */ |
3115 int sqlite3_sync_count = 0; | 3381 int sqlite3_sync_count = 0; |
3116 int sqlite3_fullsync_count = 0; | 3382 int sqlite3_fullsync_count = 0; |
3117 #endif | 3383 #endif |
3118 | 3384 |
3119 /* | 3385 /* |
3120 ** We do not trust systems to provide a working fdatasync(). Some do. | 3386 ** We do not trust systems to provide a working fdatasync(). Some do. |
3121 ** Others do no. To be safe, we will stick with the (slower) fsync(). | 3387 ** Others do no. To be safe, we will stick with the (slightly slower) |
3122 ** If you know that your system does support fdatasync() correctly, | 3388 ** fsync(). If you know that your system does support fdatasync() correctly, |
3123 ** then simply compile with -Dfdatasync=fdatasync | 3389 ** then simply compile with -Dfdatasync=fdatasync |
3124 */ | 3390 */ |
3125 #if !defined(fdatasync) && !defined(__linux__) | 3391 #if !defined(fdatasync) |
3126 # define fdatasync fsync | 3392 # define fdatasync fsync |
3127 #endif | 3393 #endif |
3128 | 3394 |
3129 /* | 3395 /* |
3130 ** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not | 3396 ** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not |
3131 ** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently | 3397 ** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently |
3132 ** only available on Mac OS X. But that could change. | 3398 ** only available on Mac OS X. But that could change. |
3133 */ | 3399 */ |
3134 #ifdef F_FULLFSYNC | 3400 #ifdef F_FULLFSYNC |
3135 # define HAVE_FULLFSYNC 1 | 3401 # define HAVE_FULLFSYNC 1 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3257 int ii; | 3523 int ii; |
3258 int fd = -1; | 3524 int fd = -1; |
3259 char zDirname[MAX_PATHNAME+1]; | 3525 char zDirname[MAX_PATHNAME+1]; |
3260 | 3526 |
3261 sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); | 3527 sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); |
3262 for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); | 3528 for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); |
3263 if( ii>0 ){ | 3529 if( ii>0 ){ |
3264 zDirname[ii] = '\0'; | 3530 zDirname[ii] = '\0'; |
3265 fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); | 3531 fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); |
3266 if( fd>=0 ){ | 3532 if( fd>=0 ){ |
3267 #ifdef FD_CLOEXEC | |
3268 osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); | |
3269 #endif | |
3270 OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); | 3533 OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); |
3271 } | 3534 } |
3272 } | 3535 } |
3273 *pFd = fd; | 3536 *pFd = fd; |
3274 return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname)); | 3537 return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname)); |
3275 } | 3538 } |
3276 | 3539 |
3277 /* | 3540 /* |
3278 ** Make sure all writes to a particular file are committed to disk. | 3541 ** Make sure all writes to a particular file are committed to disk. |
3279 ** | 3542 ** |
(...skipping 29 matching lines...) Expand all Loading... |
3309 assert( pFile ); | 3572 assert( pFile ); |
3310 OSTRACE(("SYNC %-3d\n", pFile->h)); | 3573 OSTRACE(("SYNC %-3d\n", pFile->h)); |
3311 rc = full_fsync(pFile->h, isFullsync, isDataOnly); | 3574 rc = full_fsync(pFile->h, isFullsync, isDataOnly); |
3312 SimulateIOError( rc=1 ); | 3575 SimulateIOError( rc=1 ); |
3313 if( rc ){ | 3576 if( rc ){ |
3314 pFile->lastErrno = errno; | 3577 pFile->lastErrno = errno; |
3315 return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); | 3578 return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); |
3316 } | 3579 } |
3317 | 3580 |
3318 /* Also fsync the directory containing the file if the DIRSYNC flag | 3581 /* Also fsync the directory containing the file if the DIRSYNC flag |
3319 ** is set. This is a one-time occurrance. Many systems (examples: AIX) | 3582 ** is set. This is a one-time occurrence. Many systems (examples: AIX) |
3320 ** are unable to fsync a directory, so ignore errors on the fsync. | 3583 ** are unable to fsync a directory, so ignore errors on the fsync. |
3321 */ | 3584 */ |
3322 if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ | 3585 if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ |
3323 int dirfd; | 3586 int dirfd; |
3324 OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, | 3587 OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, |
3325 HAVE_FULLFSYNC, isFullsync)); | 3588 HAVE_FULLFSYNC, isFullsync)); |
3326 rc = osOpenDirectory(pFile->zPath, &dirfd); | 3589 rc = osOpenDirectory(pFile->zPath, &dirfd); |
3327 if( rc==SQLITE_OK && dirfd>=0 ){ | 3590 if( rc==SQLITE_OK && dirfd>=0 ){ |
3328 full_fsync(dirfd, 0, 0); | 3591 full_fsync(dirfd, 0, 0); |
3329 robust_close(pFile, dirfd, __LINE__); | 3592 robust_close(pFile, dirfd, __LINE__); |
(...skipping 12 matching lines...) Expand all Loading... |
3342 unixFile *pFile = (unixFile *)id; | 3605 unixFile *pFile = (unixFile *)id; |
3343 int rc; | 3606 int rc; |
3344 assert( pFile ); | 3607 assert( pFile ); |
3345 SimulateIOError( return SQLITE_IOERR_TRUNCATE ); | 3608 SimulateIOError( return SQLITE_IOERR_TRUNCATE ); |
3346 | 3609 |
3347 /* If the user has configured a chunk-size for this file, truncate the | 3610 /* If the user has configured a chunk-size for this file, truncate the |
3348 ** file so that it consists of an integer number of chunks (i.e. the | 3611 ** file so that it consists of an integer number of chunks (i.e. the |
3349 ** actual file size after the operation may be larger than the requested | 3612 ** actual file size after the operation may be larger than the requested |
3350 ** size). | 3613 ** size). |
3351 */ | 3614 */ |
3352 if( pFile->szChunk ){ | 3615 if( pFile->szChunk>0 ){ |
3353 nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; | 3616 nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; |
3354 } | 3617 } |
3355 | 3618 |
3356 rc = robust_ftruncate(pFile->h, (off_t)nByte); | 3619 rc = robust_ftruncate(pFile->h, nByte); |
3357 if( rc ){ | 3620 if( rc ){ |
3358 pFile->lastErrno = errno; | 3621 pFile->lastErrno = errno; |
3359 return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); | 3622 return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); |
3360 }else{ | 3623 }else{ |
3361 #ifndef NDEBUG | 3624 #ifdef SQLITE_DEBUG |
3362 /* If we are doing a normal write to a database file (as opposed to | 3625 /* If we are doing a normal write to a database file (as opposed to |
3363 ** doing a hot-journal rollback or a write to some file other than a | 3626 ** doing a hot-journal rollback or a write to some file other than a |
3364 ** normal database file) and we truncate the file to zero length, | 3627 ** normal database file) and we truncate the file to zero length, |
3365 ** that effectively updates the change counter. This might happen | 3628 ** that effectively updates the change counter. This might happen |
3366 ** when restoring a database using the backup API from a zero-length | 3629 ** when restoring a database using the backup API from a zero-length |
3367 ** source. | 3630 ** source. |
3368 */ | 3631 */ |
3369 if( pFile->inNormalWrite && nByte==0 ){ | 3632 if( pFile->inNormalWrite && nByte==0 ){ |
3370 pFile->transCntrChng = 1; | 3633 pFile->transCntrChng = 1; |
3371 } | 3634 } |
3372 #endif | 3635 #endif |
3373 | 3636 |
| 3637 #if SQLITE_MAX_MMAP_SIZE>0 |
| 3638 /* If the file was just truncated to a size smaller than the currently |
| 3639 ** mapped region, reduce the effective mapping size as well. SQLite will |
| 3640 ** use read() and write() to access data beyond this point from now on. |
| 3641 */ |
| 3642 if( nByte<pFile->mmapSize ){ |
| 3643 pFile->mmapSize = nByte; |
| 3644 } |
| 3645 #endif |
| 3646 |
3374 return SQLITE_OK; | 3647 return SQLITE_OK; |
3375 } | 3648 } |
3376 } | 3649 } |
3377 | 3650 |
3378 /* | 3651 /* |
3379 ** Determine the current size of a file in bytes | 3652 ** Determine the current size of a file in bytes |
3380 */ | 3653 */ |
3381 static int unixFileSize(sqlite3_file *id, i64 *pSize){ | 3654 static int unixFileSize(sqlite3_file *id, i64 *pSize){ |
3382 int rc; | 3655 int rc; |
3383 struct stat buf; | 3656 struct stat buf; |
(...skipping 21 matching lines...) Expand all Loading... |
3405 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) | 3678 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) |
3406 /* | 3679 /* |
3407 ** Handler for proxy-locking file-control verbs. Defined below in the | 3680 ** Handler for proxy-locking file-control verbs. Defined below in the |
3408 ** proxying locking division. | 3681 ** proxying locking division. |
3409 */ | 3682 */ |
3410 static int proxyFileControl(sqlite3_file*,int,void*); | 3683 static int proxyFileControl(sqlite3_file*,int,void*); |
3411 #endif | 3684 #endif |
3412 | 3685 |
3413 /* | 3686 /* |
3414 ** This function is called to handle the SQLITE_FCNTL_SIZE_HINT | 3687 ** This function is called to handle the SQLITE_FCNTL_SIZE_HINT |
3415 ** file-control operation. | 3688 ** file-control operation. Enlarge the database to nBytes in size |
3416 ** | 3689 ** (rounded up to the next chunk-size). If the database is already |
3417 ** If the user has configured a chunk-size for this file, it could be | 3690 ** nBytes or larger, this routine is a no-op. |
3418 ** that the file needs to be extended at this point. Otherwise, the | |
3419 ** SQLITE_FCNTL_SIZE_HINT operation is a no-op for Unix. | |
3420 */ | 3691 */ |
3421 static int fcntlSizeHint(unixFile *pFile, i64 nByte){ | 3692 static int fcntlSizeHint(unixFile *pFile, i64 nByte){ |
3422 if( pFile->szChunk ){ | 3693 if( pFile->szChunk>0 ){ |
3423 i64 nSize; /* Required file size */ | 3694 i64 nSize; /* Required file size */ |
3424 struct stat buf; /* Used to hold return values of fstat() */ | 3695 struct stat buf; /* Used to hold return values of fstat() */ |
3425 | 3696 |
3426 if( osFstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT; | 3697 if( osFstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT; |
3427 | 3698 |
3428 nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; | 3699 nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; |
3429 if( nSize>(i64)buf.st_size ){ | 3700 if( nSize>(i64)buf.st_size ){ |
3430 | 3701 |
3431 #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE | 3702 #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE |
3432 /* The code below is handling the return value of osFallocate() | 3703 /* The code below is handling the return value of osFallocate() |
(...skipping 21 matching lines...) Expand all Loading... |
3454 iWrite = ((buf.st_size + 2*nBlk - 1)/nBlk)*nBlk-1; | 3725 iWrite = ((buf.st_size + 2*nBlk - 1)/nBlk)*nBlk-1; |
3455 while( iWrite<nSize ){ | 3726 while( iWrite<nSize ){ |
3456 int nWrite = seekAndWrite(pFile, iWrite, "", 1); | 3727 int nWrite = seekAndWrite(pFile, iWrite, "", 1); |
3457 if( nWrite!=1 ) return SQLITE_IOERR_WRITE; | 3728 if( nWrite!=1 ) return SQLITE_IOERR_WRITE; |
3458 iWrite += nBlk; | 3729 iWrite += nBlk; |
3459 } | 3730 } |
3460 #endif | 3731 #endif |
3461 } | 3732 } |
3462 } | 3733 } |
3463 | 3734 |
| 3735 #if SQLITE_MAX_MMAP_SIZE>0 |
| 3736 if( pFile->mmapSizeMax>0 && nByte>pFile->mmapSize ){ |
| 3737 int rc; |
| 3738 if( pFile->szChunk<=0 ){ |
| 3739 if( robust_ftruncate(pFile->h, nByte) ){ |
| 3740 pFile->lastErrno = errno; |
| 3741 return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); |
| 3742 } |
| 3743 } |
| 3744 |
| 3745 rc = unixMapfile(pFile, nByte); |
| 3746 return rc; |
| 3747 } |
| 3748 #endif |
| 3749 |
3464 return SQLITE_OK; | 3750 return SQLITE_OK; |
3465 } | 3751 } |
3466 | 3752 |
3467 /* | 3753 /* |
| 3754 ** If *pArg is initially negative then this is a query. Set *pArg to |
| 3755 ** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. |
| 3756 ** |
| 3757 ** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. |
| 3758 */ |
| 3759 static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){ |
| 3760 if( *pArg<0 ){ |
| 3761 *pArg = (pFile->ctrlFlags & mask)!=0; |
| 3762 }else if( (*pArg)==0 ){ |
| 3763 pFile->ctrlFlags &= ~mask; |
| 3764 }else{ |
| 3765 pFile->ctrlFlags |= mask; |
| 3766 } |
| 3767 } |
| 3768 |
| 3769 /* Forward declaration */ |
| 3770 static int unixGetTempname(int nBuf, char *zBuf); |
| 3771 |
| 3772 /* |
3468 ** Information and control of an open file handle. | 3773 ** Information and control of an open file handle. |
3469 */ | 3774 */ |
3470 static int unixFileControl(sqlite3_file *id, int op, void *pArg){ | 3775 static int unixFileControl(sqlite3_file *id, int op, void *pArg){ |
| 3776 unixFile *pFile = (unixFile*)id; |
3471 switch( op ){ | 3777 switch( op ){ |
3472 case SQLITE_FCNTL_LOCKSTATE: { | 3778 case SQLITE_FCNTL_LOCKSTATE: { |
3473 *(int*)pArg = ((unixFile*)id)->eFileLock; | 3779 *(int*)pArg = pFile->eFileLock; |
3474 return SQLITE_OK; | 3780 return SQLITE_OK; |
3475 } | 3781 } |
3476 case SQLITE_LAST_ERRNO: { | 3782 case SQLITE_LAST_ERRNO: { |
3477 *(int*)pArg = ((unixFile*)id)->lastErrno; | 3783 *(int*)pArg = pFile->lastErrno; |
3478 return SQLITE_OK; | 3784 return SQLITE_OK; |
3479 } | 3785 } |
3480 case SQLITE_FCNTL_CHUNK_SIZE: { | 3786 case SQLITE_FCNTL_CHUNK_SIZE: { |
3481 ((unixFile*)id)->szChunk = *(int *)pArg; | 3787 pFile->szChunk = *(int *)pArg; |
3482 return SQLITE_OK; | 3788 return SQLITE_OK; |
3483 } | 3789 } |
3484 case SQLITE_FCNTL_SIZE_HINT: { | 3790 case SQLITE_FCNTL_SIZE_HINT: { |
3485 return fcntlSizeHint((unixFile *)id, *(i64 *)pArg); | 3791 int rc; |
| 3792 SimulateIOErrorBenign(1); |
| 3793 rc = fcntlSizeHint(pFile, *(i64 *)pArg); |
| 3794 SimulateIOErrorBenign(0); |
| 3795 return rc; |
3486 } | 3796 } |
3487 #ifndef NDEBUG | 3797 case SQLITE_FCNTL_PERSIST_WAL: { |
| 3798 unixModeBit(pFile, UNIXFILE_PERSIST_WAL, (int*)pArg); |
| 3799 return SQLITE_OK; |
| 3800 } |
| 3801 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { |
| 3802 unixModeBit(pFile, UNIXFILE_PSOW, (int*)pArg); |
| 3803 return SQLITE_OK; |
| 3804 } |
| 3805 case SQLITE_FCNTL_VFSNAME: { |
| 3806 *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); |
| 3807 return SQLITE_OK; |
| 3808 } |
| 3809 case SQLITE_FCNTL_TEMPFILENAME: { |
| 3810 char *zTFile = sqlite3_malloc( pFile->pVfs->mxPathname ); |
| 3811 if( zTFile ){ |
| 3812 unixGetTempname(pFile->pVfs->mxPathname, zTFile); |
| 3813 *(char**)pArg = zTFile; |
| 3814 } |
| 3815 return SQLITE_OK; |
| 3816 } |
| 3817 case SQLITE_FCNTL_HAS_MOVED: { |
| 3818 *(int*)pArg = fileHasMoved(pFile); |
| 3819 return SQLITE_OK; |
| 3820 } |
| 3821 #if SQLITE_MAX_MMAP_SIZE>0 |
| 3822 case SQLITE_FCNTL_MMAP_SIZE: { |
| 3823 i64 newLimit = *(i64*)pArg; |
| 3824 int rc = SQLITE_OK; |
| 3825 if( newLimit>sqlite3GlobalConfig.mxMmap ){ |
| 3826 newLimit = sqlite3GlobalConfig.mxMmap; |
| 3827 } |
| 3828 *(i64*)pArg = pFile->mmapSizeMax; |
| 3829 if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ |
| 3830 pFile->mmapSizeMax = newLimit; |
| 3831 if( pFile->mmapSize>0 ){ |
| 3832 unixUnmapfile(pFile); |
| 3833 rc = unixMapfile(pFile, -1); |
| 3834 } |
| 3835 } |
| 3836 return rc; |
| 3837 } |
| 3838 #endif |
| 3839 #ifdef SQLITE_DEBUG |
3488 /* The pager calls this method to signal that it has done | 3840 /* The pager calls this method to signal that it has done |
3489 ** a rollback and that the database is therefore unchanged and | 3841 ** a rollback and that the database is therefore unchanged and |
3490 ** it hence it is OK for the transaction change counter to be | 3842 ** it hence it is OK for the transaction change counter to be |
3491 ** unchanged. | 3843 ** unchanged. |
3492 */ | 3844 */ |
3493 case SQLITE_FCNTL_DB_UNCHANGED: { | 3845 case SQLITE_FCNTL_DB_UNCHANGED: { |
3494 ((unixFile*)id)->dbUpdate = 0; | 3846 ((unixFile*)id)->dbUpdate = 0; |
3495 return SQLITE_OK; | 3847 return SQLITE_OK; |
3496 } | 3848 } |
3497 #endif | 3849 #endif |
3498 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) | 3850 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) |
3499 case SQLITE_SET_LOCKPROXYFILE: | 3851 case SQLITE_SET_LOCKPROXYFILE: |
3500 case SQLITE_GET_LOCKPROXYFILE: { | 3852 case SQLITE_GET_LOCKPROXYFILE: { |
3501 return proxyFileControl(id,op,pArg); | 3853 return proxyFileControl(id,op,pArg); |
3502 } | 3854 } |
3503 #endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ | 3855 #endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ |
3504 case SQLITE_FCNTL_SYNC_OMITTED: { | |
3505 return SQLITE_OK; /* A no-op */ | |
3506 } | |
3507 } | 3856 } |
3508 return SQLITE_NOTFOUND; | 3857 return SQLITE_NOTFOUND; |
3509 } | 3858 } |
3510 | 3859 |
3511 /* | 3860 /* |
3512 ** Return the sector size in bytes of the underlying block device for | 3861 ** Return the sector size in bytes of the underlying block device for |
3513 ** the specified file. This is almost always 512 bytes, but may be | 3862 ** the specified file. This is almost always 512 bytes, but may be |
3514 ** larger for some devices. | 3863 ** larger for some devices. |
3515 ** | 3864 ** |
3516 ** SQLite code assumes this function cannot fail. It also assumes that | 3865 ** SQLite code assumes this function cannot fail. It also assumes that |
3517 ** if two files are created in the same file-system directory (i.e. | 3866 ** if two files are created in the same file-system directory (i.e. |
3518 ** a database and its journal file) that the sector size will be the | 3867 ** a database and its journal file) that the sector size will be the |
3519 ** same for both. | 3868 ** same for both. |
3520 */ | 3869 */ |
| 3870 #ifndef __QNXNTO__ |
3521 static int unixSectorSize(sqlite3_file *NotUsed){ | 3871 static int unixSectorSize(sqlite3_file *NotUsed){ |
3522 UNUSED_PARAMETER(NotUsed); | 3872 UNUSED_PARAMETER(NotUsed); |
3523 return SQLITE_DEFAULT_SECTOR_SIZE; | 3873 return SQLITE_DEFAULT_SECTOR_SIZE; |
3524 } | 3874 } |
| 3875 #endif |
3525 | 3876 |
3526 /* | 3877 /* |
3527 ** Return the device characteristics for the file. This is always 0 for unix. | 3878 ** The following version of unixSectorSize() is optimized for QNX. |
3528 */ | 3879 */ |
3529 static int unixDeviceCharacteristics(sqlite3_file *NotUsed){ | 3880 #ifdef __QNXNTO__ |
3530 UNUSED_PARAMETER(NotUsed); | 3881 #include <sys/dcmd_blk.h> |
3531 return 0; | 3882 #include <sys/statvfs.h> |
| 3883 static int unixSectorSize(sqlite3_file *id){ |
| 3884 unixFile *pFile = (unixFile*)id; |
| 3885 if( pFile->sectorSize == 0 ){ |
| 3886 struct statvfs fsInfo; |
| 3887 |
| 3888 /* Set defaults for non-supported filesystems */ |
| 3889 pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; |
| 3890 pFile->deviceCharacteristics = 0; |
| 3891 if( fstatvfs(pFile->h, &fsInfo) == -1 ) { |
| 3892 return pFile->sectorSize; |
| 3893 } |
| 3894 |
| 3895 if( !strcmp(fsInfo.f_basetype, "tmp") ) { |
| 3896 pFile->sectorSize = fsInfo.f_bsize; |
| 3897 pFile->deviceCharacteristics = |
| 3898 SQLITE_IOCAP_ATOMIC4K | /* All ram filesystem writes are atomic */ |
| 3899 SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until |
| 3900 ** the write succeeds */ |
| 3901 SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind |
| 3902 ** so it is ordered */ |
| 3903 0; |
| 3904 }else if( strstr(fsInfo.f_basetype, "etfs") ){ |
| 3905 pFile->sectorSize = fsInfo.f_bsize; |
| 3906 pFile->deviceCharacteristics = |
| 3907 /* etfs cluster size writes are atomic */ |
| 3908 (pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) | |
| 3909 SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until |
| 3910 ** the write succeeds */ |
| 3911 SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind |
| 3912 ** so it is ordered */ |
| 3913 0; |
| 3914 }else if( !strcmp(fsInfo.f_basetype, "qnx6") ){ |
| 3915 pFile->sectorSize = fsInfo.f_bsize; |
| 3916 pFile->deviceCharacteristics = |
| 3917 SQLITE_IOCAP_ATOMIC | /* All filesystem writes are atomic */ |
| 3918 SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until |
| 3919 ** the write succeeds */ |
| 3920 SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind |
| 3921 ** so it is ordered */ |
| 3922 0; |
| 3923 }else if( !strcmp(fsInfo.f_basetype, "qnx4") ){ |
| 3924 pFile->sectorSize = fsInfo.f_bsize; |
| 3925 pFile->deviceCharacteristics = |
| 3926 /* full bitset of atomics from max sector size and smaller */ |
| 3927 ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | |
| 3928 SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind |
| 3929 ** so it is ordered */ |
| 3930 0; |
| 3931 }else if( strstr(fsInfo.f_basetype, "dos") ){ |
| 3932 pFile->sectorSize = fsInfo.f_bsize; |
| 3933 pFile->deviceCharacteristics = |
| 3934 /* full bitset of atomics from max sector size and smaller */ |
| 3935 ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | |
| 3936 SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind |
| 3937 ** so it is ordered */ |
| 3938 0; |
| 3939 }else{ |
| 3940 pFile->deviceCharacteristics = |
| 3941 SQLITE_IOCAP_ATOMIC512 | /* blocks are atomic */ |
| 3942 SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until |
| 3943 ** the write succeeds */ |
| 3944 0; |
| 3945 } |
| 3946 } |
| 3947 /* Last chance verification. If the sector size isn't a multiple of 512 |
| 3948 ** then it isn't valid.*/ |
| 3949 if( pFile->sectorSize % 512 != 0 ){ |
| 3950 pFile->deviceCharacteristics = 0; |
| 3951 pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; |
| 3952 } |
| 3953 return pFile->sectorSize; |
3532 } | 3954 } |
| 3955 #endif /* __QNXNTO__ */ |
| 3956 |
| 3957 /* |
| 3958 ** Return the device characteristics for the file. |
| 3959 ** |
| 3960 ** This VFS is set up to return SQLITE_IOCAP_POWERSAFE_OVERWRITE by default. |
| 3961 ** However, that choice is controversial since technically the underlying |
| 3962 ** file system does not always provide powersafe overwrites. (In other |
| 3963 ** words, after a power-loss event, parts of the file that were never |
| 3964 ** written might end up being altered.) However, non-PSOW behavior is very, |
| 3965 ** very rare. And asserting PSOW makes a large reduction in the amount |
| 3966 ** of required I/O for journaling, since a lot of padding is eliminated. |
| 3967 ** Hence, while POWERSAFE_OVERWRITE is on by default, there is a file-control |
| 3968 ** available to turn it off and URI query parameter available to turn it off. |
| 3969 */ |
| 3970 static int unixDeviceCharacteristics(sqlite3_file *id){ |
| 3971 unixFile *p = (unixFile*)id; |
| 3972 int rc = 0; |
| 3973 #ifdef __QNXNTO__ |
| 3974 if( p->sectorSize==0 ) unixSectorSize(id); |
| 3975 rc = p->deviceCharacteristics; |
| 3976 #endif |
| 3977 if( p->ctrlFlags & UNIXFILE_PSOW ){ |
| 3978 rc |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; |
| 3979 } |
| 3980 return rc; |
| 3981 } |
| 3982 |
| 3983 #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 |
| 3984 |
| 3985 /* |
| 3986 ** Return the system page size. |
| 3987 ** |
| 3988 ** This function should not be called directly by other code in this file. |
| 3989 ** Instead, it should be called via macro osGetpagesize(). |
| 3990 */ |
| 3991 static int unixGetpagesize(void){ |
| 3992 #if defined(_BSD_SOURCE) |
| 3993 return getpagesize(); |
| 3994 #else |
| 3995 return (int)sysconf(_SC_PAGESIZE); |
| 3996 #endif |
| 3997 } |
| 3998 |
| 3999 #endif /* !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 */ |
3533 | 4000 |
3534 #ifndef SQLITE_OMIT_WAL | 4001 #ifndef SQLITE_OMIT_WAL |
3535 | 4002 |
3536 | |
3537 /* | 4003 /* |
3538 ** Object used to represent an shared memory buffer. | 4004 ** Object used to represent an shared memory buffer. |
3539 ** | 4005 ** |
3540 ** When multiple threads all reference the same wal-index, each thread | 4006 ** When multiple threads all reference the same wal-index, each thread |
3541 ** has its own unixShm object, but they all point to a single instance | 4007 ** has its own unixShm object, but they all point to a single instance |
3542 ** of this unixShmNode object. In other words, each wal-index is opened | 4008 ** of this unixShmNode object. In other words, each wal-index is opened |
3543 ** only once per process. | 4009 ** only once per process. |
3544 ** | 4010 ** |
3545 ** Each unixShmNode object is connected to a single unixInodeInfo object. | 4011 ** Each unixShmNode object is connected to a single unixInodeInfo object. |
3546 ** We could coalesce this object into unixInodeInfo, but that would mean | 4012 ** We could coalesce this object into unixInodeInfo, but that would mean |
(...skipping 15 matching lines...) Expand all Loading... |
3562 ** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and | 4028 ** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and |
3563 ** unixMutexHeld() is true when reading or writing any other field | 4029 ** unixMutexHeld() is true when reading or writing any other field |
3564 ** in this structure. | 4030 ** in this structure. |
3565 */ | 4031 */ |
3566 struct unixShmNode { | 4032 struct unixShmNode { |
3567 unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ | 4033 unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ |
3568 sqlite3_mutex *mutex; /* Mutex to access this object */ | 4034 sqlite3_mutex *mutex; /* Mutex to access this object */ |
3569 char *zFilename; /* Name of the mmapped file */ | 4035 char *zFilename; /* Name of the mmapped file */ |
3570 int h; /* Open file descriptor */ | 4036 int h; /* Open file descriptor */ |
3571 int szRegion; /* Size of shared-memory regions */ | 4037 int szRegion; /* Size of shared-memory regions */ |
3572 int nRegion; /* Size of array apRegion */ | 4038 u16 nRegion; /* Size of array apRegion */ |
| 4039 u8 isReadonly; /* True if read-only */ |
3573 char **apRegion; /* Array of mapped shared-memory regions */ | 4040 char **apRegion; /* Array of mapped shared-memory regions */ |
3574 int nRef; /* Number of unixShm objects pointing to this */ | 4041 int nRef; /* Number of unixShm objects pointing to this */ |
3575 unixShm *pFirst; /* All unixShm objects pointing to this */ | 4042 unixShm *pFirst; /* All unixShm objects pointing to this */ |
3576 #ifdef SQLITE_DEBUG | 4043 #ifdef SQLITE_DEBUG |
3577 u8 exclMask; /* Mask of exclusive locks held */ | 4044 u8 exclMask; /* Mask of exclusive locks held */ |
3578 u8 sharedMask; /* Mask of shared locks held */ | 4045 u8 sharedMask; /* Mask of shared locks held */ |
3579 u8 nextShmId; /* Next available unixShm.id value */ | 4046 u8 nextShmId; /* Next available unixShm.id value */ |
3580 #endif | 4047 #endif |
3581 }; | 4048 }; |
3582 | 4049 |
3583 /* | 4050 /* |
3584 ** Structure used internally by this VFS to record the state of an | 4051 ** Structure used internally by this VFS to record the state of an |
3585 ** open shared memory connection. | 4052 ** open shared memory connection. |
3586 ** | 4053 ** |
3587 ** The following fields are initialized when this object is created and | 4054 ** The following fields are initialized when this object is created and |
3588 ** are read-only thereafter: | 4055 ** are read-only thereafter: |
3589 ** | 4056 ** |
3590 ** unixShm.pFile | 4057 ** unixShm.pFile |
3591 ** unixShm.id | 4058 ** unixShm.id |
3592 ** | 4059 ** |
3593 ** All other fields are read/write. The unixShm.pFile->mutex must be held | 4060 ** All other fields are read/write. The unixShm.pFile->mutex must be held |
3594 ** while accessing any read/write fields. | 4061 ** while accessing any read/write fields. |
3595 */ | 4062 */ |
3596 struct unixShm { | 4063 struct unixShm { |
3597 unixShmNode *pShmNode; /* The underlying unixShmNode object */ | 4064 unixShmNode *pShmNode; /* The underlying unixShmNode object */ |
3598 unixShm *pNext; /* Next unixShm with the same unixShmNode */ | 4065 unixShm *pNext; /* Next unixShm with the same unixShmNode */ |
3599 u8 hasMutex; /* True if holding the unixShmNode mutex */ | 4066 u8 hasMutex; /* True if holding the unixShmNode mutex */ |
| 4067 u8 id; /* Id of this connection within its unixShmNode */ |
3600 u16 sharedMask; /* Mask of shared locks held */ | 4068 u16 sharedMask; /* Mask of shared locks held */ |
3601 u16 exclMask; /* Mask of exclusive locks held */ | 4069 u16 exclMask; /* Mask of exclusive locks held */ |
3602 #ifdef SQLITE_DEBUG | |
3603 u8 id; /* Id of this connection within its unixShmNode */ | |
3604 #endif | |
3605 }; | 4070 }; |
3606 | 4071 |
3607 /* | 4072 /* |
3608 ** Constants used for locking | 4073 ** Constants used for locking |
3609 */ | 4074 */ |
3610 #define UNIX_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ | 4075 #define UNIX_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ |
3611 #define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ | 4076 #define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ |
3612 | 4077 |
3613 /* | 4078 /* |
3614 ** Apply posix advisory locks for all bytes from ofst through ofst+n-1. | 4079 ** Apply posix advisory locks for all bytes from ofst through ofst+n-1. |
(...skipping 28 matching lines...) Expand all Loading... |
3643 f.l_len = n; | 4108 f.l_len = n; |
3644 | 4109 |
3645 rc = osFcntl(pShmNode->h, F_SETLK, &f); | 4110 rc = osFcntl(pShmNode->h, F_SETLK, &f); |
3646 rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY; | 4111 rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY; |
3647 } | 4112 } |
3648 | 4113 |
3649 /* Update the global lock state and do debug tracing */ | 4114 /* Update the global lock state and do debug tracing */ |
3650 #ifdef SQLITE_DEBUG | 4115 #ifdef SQLITE_DEBUG |
3651 { u16 mask; | 4116 { u16 mask; |
3652 OSTRACE(("SHM-LOCK ")); | 4117 OSTRACE(("SHM-LOCK ")); |
3653 mask = (1<<(ofst+n)) - (1<<ofst); | 4118 mask = ofst>31 ? 0xffff : (1<<(ofst+n)) - (1<<ofst); |
3654 if( rc==SQLITE_OK ){ | 4119 if( rc==SQLITE_OK ){ |
3655 if( lockType==F_UNLCK ){ | 4120 if( lockType==F_UNLCK ){ |
3656 OSTRACE(("unlock %d ok", ofst)); | 4121 OSTRACE(("unlock %d ok", ofst)); |
3657 pShmNode->exclMask &= ~mask; | 4122 pShmNode->exclMask &= ~mask; |
3658 pShmNode->sharedMask &= ~mask; | 4123 pShmNode->sharedMask &= ~mask; |
3659 }else if( lockType==F_RDLCK ){ | 4124 }else if( lockType==F_RDLCK ){ |
3660 OSTRACE(("read-lock %d ok", ofst)); | 4125 OSTRACE(("read-lock %d ok", ofst)); |
3661 pShmNode->exclMask &= ~mask; | 4126 pShmNode->exclMask &= ~mask; |
3662 pShmNode->sharedMask |= mask; | 4127 pShmNode->sharedMask |= mask; |
3663 }else{ | 4128 }else{ |
(...skipping 13 matching lines...) Expand all Loading... |
3677 } | 4142 } |
3678 } | 4143 } |
3679 OSTRACE((" - afterwards %03x,%03x\n", | 4144 OSTRACE((" - afterwards %03x,%03x\n", |
3680 pShmNode->sharedMask, pShmNode->exclMask)); | 4145 pShmNode->sharedMask, pShmNode->exclMask)); |
3681 } | 4146 } |
3682 #endif | 4147 #endif |
3683 | 4148 |
3684 return rc; | 4149 return rc; |
3685 } | 4150 } |
3686 | 4151 |
| 4152 /* |
| 4153 ** Return the minimum number of 32KB shm regions that should be mapped at |
| 4154 ** a time, assuming that each mapping must be an integer multiple of the |
| 4155 ** current system page-size. |
| 4156 ** |
| 4157 ** Usually, this is 1. The exception seems to be systems that are configured |
| 4158 ** to use 64KB pages - in this case each mapping must cover at least two |
| 4159 ** shm regions. |
| 4160 */ |
| 4161 static int unixShmRegionPerMap(void){ |
| 4162 int shmsz = 32*1024; /* SHM region size */ |
| 4163 int pgsz = osGetpagesize(); /* System page size */ |
| 4164 assert( ((pgsz-1)&pgsz)==0 ); /* Page size must be a power of 2 */ |
| 4165 if( pgsz<shmsz ) return 1; |
| 4166 return pgsz/shmsz; |
| 4167 } |
3687 | 4168 |
3688 /* | 4169 /* |
3689 ** Purge the unixShmNodeList list of all entries with unixShmNode.nRef==0. | 4170 ** Purge the unixShmNodeList list of all entries with unixShmNode.nRef==0. |
3690 ** | 4171 ** |
3691 ** This is not a VFS shared-memory method; it is a utility function called | 4172 ** This is not a VFS shared-memory method; it is a utility function called |
3692 ** by VFS shared-memory methods. | 4173 ** by VFS shared-memory methods. |
3693 */ | 4174 */ |
3694 static void unixShmPurge(unixFile *pFd){ | 4175 static void unixShmPurge(unixFile *pFd){ |
3695 unixShmNode *p = pFd->pInode->pShmNode; | 4176 unixShmNode *p = pFd->pInode->pShmNode; |
3696 assert( unixMutexHeld() ); | 4177 assert( unixMutexHeld() ); |
3697 if( p && p->nRef==0 ){ | 4178 if( p && p->nRef==0 ){ |
| 4179 int nShmPerMap = unixShmRegionPerMap(); |
3698 int i; | 4180 int i; |
3699 assert( p->pInode==pFd->pInode ); | 4181 assert( p->pInode==pFd->pInode ); |
3700 if( p->mutex ) sqlite3_mutex_free(p->mutex); | 4182 sqlite3_mutex_free(p->mutex); |
3701 for(i=0; i<p->nRegion; i++){ | 4183 for(i=0; i<p->nRegion; i+=nShmPerMap){ |
3702 if( p->h>=0 ){ | 4184 if( p->h>=0 ){ |
3703 munmap(p->apRegion[i], p->szRegion); | 4185 osMunmap(p->apRegion[i], p->szRegion); |
3704 }else{ | 4186 }else{ |
3705 sqlite3_free(p->apRegion[i]); | 4187 sqlite3_free(p->apRegion[i]); |
3706 } | 4188 } |
3707 } | 4189 } |
3708 sqlite3_free(p->apRegion); | 4190 sqlite3_free(p->apRegion); |
3709 if( p->h>=0 ){ | 4191 if( p->h>=0 ){ |
3710 robust_close(pFd, p->h, __LINE__); | 4192 robust_close(pFd, p->h, __LINE__); |
3711 p->h = -1; | 4193 p->h = -1; |
3712 } | 4194 } |
3713 p->pInode->pShmNode = 0; | 4195 p->pInode->pShmNode = 0; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3768 ** one if present. Create a new one if necessary. | 4250 ** one if present. Create a new one if necessary. |
3769 */ | 4251 */ |
3770 unixEnterMutex(); | 4252 unixEnterMutex(); |
3771 pInode = pDbFd->pInode; | 4253 pInode = pDbFd->pInode; |
3772 pShmNode = pInode->pShmNode; | 4254 pShmNode = pInode->pShmNode; |
3773 if( pShmNode==0 ){ | 4255 if( pShmNode==0 ){ |
3774 struct stat sStat; /* fstat() info for database file */ | 4256 struct stat sStat; /* fstat() info for database file */ |
3775 | 4257 |
3776 /* Call fstat() to figure out the permissions on the database file. If | 4258 /* Call fstat() to figure out the permissions on the database file. If |
3777 ** a new *-shm file is created, an attempt will be made to create it | 4259 ** a new *-shm file is created, an attempt will be made to create it |
3778 ** with the same permissions. The actual permissions the file is created | 4260 ** with the same permissions. |
3779 ** with are subject to the current umask setting. | |
3780 */ | 4261 */ |
3781 if( osFstat(pDbFd->h, &sStat) && pInode->bProcessLock==0 ){ | 4262 if( osFstat(pDbFd->h, &sStat) && pInode->bProcessLock==0 ){ |
3782 rc = SQLITE_IOERR_FSTAT; | 4263 rc = SQLITE_IOERR_FSTAT; |
3783 goto shm_open_err; | 4264 goto shm_open_err; |
3784 } | 4265 } |
3785 | 4266 |
3786 #ifdef SQLITE_SHM_DIRECTORY | 4267 #ifdef SQLITE_SHM_DIRECTORY |
3787 nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 30; | 4268 nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; |
3788 #else | 4269 #else |
3789 nShmFilename = 5 + (int)strlen(pDbFd->zPath); | 4270 nShmFilename = 6 + (int)strlen(pDbFd->zPath); |
3790 #endif | 4271 #endif |
3791 pShmNode = sqlite3_malloc( sizeof(*pShmNode) + nShmFilename ); | 4272 pShmNode = sqlite3_malloc( sizeof(*pShmNode) + nShmFilename ); |
3792 if( pShmNode==0 ){ | 4273 if( pShmNode==0 ){ |
3793 rc = SQLITE_NOMEM; | 4274 rc = SQLITE_NOMEM; |
3794 goto shm_open_err; | 4275 goto shm_open_err; |
3795 } | 4276 } |
3796 memset(pShmNode, 0, sizeof(*pShmNode)); | 4277 memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); |
3797 zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1]; | 4278 zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1]; |
3798 #ifdef SQLITE_SHM_DIRECTORY | 4279 #ifdef SQLITE_SHM_DIRECTORY |
3799 sqlite3_snprintf(nShmFilename, zShmFilename, | 4280 sqlite3_snprintf(nShmFilename, zShmFilename, |
3800 SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", | 4281 SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", |
3801 (u32)sStat.st_ino, (u32)sStat.st_dev); | 4282 (u32)sStat.st_ino, (u32)sStat.st_dev); |
3802 #else | 4283 #else |
3803 sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", pDbFd->zPath); | 4284 sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", pDbFd->zPath); |
| 4285 sqlite3FileSuffix3(pDbFd->zPath, zShmFilename); |
3804 #endif | 4286 #endif |
3805 pShmNode->h = -1; | 4287 pShmNode->h = -1; |
3806 pDbFd->pInode->pShmNode = pShmNode; | 4288 pDbFd->pInode->pShmNode = pShmNode; |
3807 pShmNode->pInode = pDbFd->pInode; | 4289 pShmNode->pInode = pDbFd->pInode; |
3808 pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); | 4290 pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); |
3809 if( pShmNode->mutex==0 ){ | 4291 if( pShmNode->mutex==0 ){ |
3810 rc = SQLITE_NOMEM; | 4292 rc = SQLITE_NOMEM; |
3811 goto shm_open_err; | 4293 goto shm_open_err; |
3812 } | 4294 } |
3813 | 4295 |
3814 if( pInode->bProcessLock==0 ){ | 4296 if( pInode->bProcessLock==0 ){ |
3815 pShmNode->h = robust_open(zShmFilename, O_RDWR|O_CREAT, | 4297 int openFlags = O_RDWR | O_CREAT; |
3816 (sStat.st_mode & 0777)); | 4298 if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ |
| 4299 openFlags = O_RDONLY; |
| 4300 pShmNode->isReadonly = 1; |
| 4301 } |
| 4302 pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777)); |
3817 if( pShmNode->h<0 ){ | 4303 if( pShmNode->h<0 ){ |
3818 rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShmFilename); | 4304 rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShmFilename); |
3819 goto shm_open_err; | 4305 goto shm_open_err; |
3820 } | 4306 } |
| 4307 |
| 4308 /* If this process is running as root, make sure that the SHM file |
| 4309 ** is owned by the same user that owns the original database. Otherwise, |
| 4310 ** the original owner will not be able to connect. |
| 4311 */ |
| 4312 osFchown(pShmNode->h, sStat.st_uid, sStat.st_gid); |
3821 | 4313 |
3822 /* Check to see if another process is holding the dead-man switch. | 4314 /* Check to see if another process is holding the dead-man switch. |
3823 ** If not, truncate the file to zero length. | 4315 ** If not, truncate the file to zero length. |
3824 */ | 4316 */ |
3825 rc = SQLITE_OK; | 4317 rc = SQLITE_OK; |
3826 if( unixShmSystemLock(pShmNode, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){ | 4318 if( unixShmSystemLock(pShmNode, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){ |
3827 if( robust_ftruncate(pShmNode->h, 0) ){ | 4319 if( robust_ftruncate(pShmNode->h, 0) ){ |
3828 rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", zShmFilename); | 4320 rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", zShmFilename); |
3829 } | 4321 } |
3830 } | 4322 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3888 sqlite3_file *fd, /* Handle open on database file */ | 4380 sqlite3_file *fd, /* Handle open on database file */ |
3889 int iRegion, /* Region to retrieve */ | 4381 int iRegion, /* Region to retrieve */ |
3890 int szRegion, /* Size of regions */ | 4382 int szRegion, /* Size of regions */ |
3891 int bExtend, /* True to extend file if necessary */ | 4383 int bExtend, /* True to extend file if necessary */ |
3892 void volatile **pp /* OUT: Mapped memory */ | 4384 void volatile **pp /* OUT: Mapped memory */ |
3893 ){ | 4385 ){ |
3894 unixFile *pDbFd = (unixFile*)fd; | 4386 unixFile *pDbFd = (unixFile*)fd; |
3895 unixShm *p; | 4387 unixShm *p; |
3896 unixShmNode *pShmNode; | 4388 unixShmNode *pShmNode; |
3897 int rc = SQLITE_OK; | 4389 int rc = SQLITE_OK; |
| 4390 int nShmPerMap = unixShmRegionPerMap(); |
| 4391 int nReqRegion; |
3898 | 4392 |
3899 /* If the shared-memory file has not yet been opened, open it now. */ | 4393 /* If the shared-memory file has not yet been opened, open it now. */ |
3900 if( pDbFd->pShm==0 ){ | 4394 if( pDbFd->pShm==0 ){ |
3901 rc = unixOpenSharedMemory(pDbFd); | 4395 rc = unixOpenSharedMemory(pDbFd); |
3902 if( rc!=SQLITE_OK ) return rc; | 4396 if( rc!=SQLITE_OK ) return rc; |
3903 } | 4397 } |
3904 | 4398 |
3905 p = pDbFd->pShm; | 4399 p = pDbFd->pShm; |
3906 pShmNode = p->pShmNode; | 4400 pShmNode = p->pShmNode; |
3907 sqlite3_mutex_enter(pShmNode->mutex); | 4401 sqlite3_mutex_enter(pShmNode->mutex); |
3908 assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); | 4402 assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); |
3909 assert( pShmNode->pInode==pDbFd->pInode ); | 4403 assert( pShmNode->pInode==pDbFd->pInode ); |
3910 assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); | 4404 assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); |
3911 assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); | 4405 assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); |
3912 | 4406 |
3913 if( pShmNode->nRegion<=iRegion ){ | 4407 /* Minimum number of regions required to be mapped. */ |
| 4408 nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap; |
| 4409 |
| 4410 if( pShmNode->nRegion<nReqRegion ){ |
3914 char **apNew; /* New apRegion[] array */ | 4411 char **apNew; /* New apRegion[] array */ |
3915 int nByte = (iRegion+1)*szRegion; /* Minimum required file size */ | 4412 int nByte = nReqRegion*szRegion; /* Minimum required file size */ |
3916 struct stat sStat; /* Used by fstat() */ | 4413 struct stat sStat; /* Used by fstat() */ |
3917 | 4414 |
3918 pShmNode->szRegion = szRegion; | 4415 pShmNode->szRegion = szRegion; |
3919 | 4416 |
3920 if( pShmNode->h>=0 ){ | 4417 if( pShmNode->h>=0 ){ |
3921 /* The requested region is not mapped into this processes address space. | 4418 /* The requested region is not mapped into this processes address space. |
3922 ** Check to see if it has been allocated (i.e. if the wal-index file is | 4419 ** Check to see if it has been allocated (i.e. if the wal-index file is |
3923 ** large enough to contain the requested region). | 4420 ** large enough to contain the requested region). |
3924 */ | 4421 */ |
3925 if( osFstat(pShmNode->h, &sStat) ){ | 4422 if( osFstat(pShmNode->h, &sStat) ){ |
3926 rc = SQLITE_IOERR_SHMSIZE; | 4423 rc = SQLITE_IOERR_SHMSIZE; |
3927 goto shmpage_out; | 4424 goto shmpage_out; |
3928 } | 4425 } |
3929 | 4426 |
3930 if( sStat.st_size<nByte ){ | 4427 if( sStat.st_size<nByte ){ |
3931 /* The requested memory region does not exist. If bExtend is set to | 4428 /* The requested memory region does not exist. If bExtend is set to |
3932 ** false, exit early. *pp will be set to NULL and SQLITE_OK returned. | 4429 ** false, exit early. *pp will be set to NULL and SQLITE_OK returned. |
3933 ** | |
3934 ** Alternatively, if bExtend is true, use ftruncate() to allocate | |
3935 ** the requested memory region. | |
3936 */ | 4430 */ |
3937 if( !bExtend ) goto shmpage_out; | 4431 if( !bExtend ){ |
3938 if( robust_ftruncate(pShmNode->h, nByte) ){ | |
3939 rc = unixLogError(SQLITE_IOERR_SHMSIZE, "ftruncate", | |
3940 pShmNode->zFilename); | |
3941 goto shmpage_out; | 4432 goto shmpage_out; |
3942 } | 4433 } |
| 4434 |
| 4435 /* Alternatively, if bExtend is true, extend the file. Do this by |
| 4436 ** writing a single byte to the end of each (OS) page being |
| 4437 ** allocated or extended. Technically, we need only write to the |
| 4438 ** last page in order to extend the file. But writing to all new |
| 4439 ** pages forces the OS to allocate them immediately, which reduces |
| 4440 ** the chances of SIGBUS while accessing the mapped region later on. |
| 4441 */ |
| 4442 else{ |
| 4443 static const int pgsz = 4096; |
| 4444 int iPg; |
| 4445 |
| 4446 /* Write to the last byte of each newly allocated or extended page */ |
| 4447 assert( (nByte % pgsz)==0 ); |
| 4448 for(iPg=(sStat.st_size/pgsz); iPg<(nByte/pgsz); iPg++){ |
| 4449 if( seekAndWriteFd(pShmNode->h, iPg*pgsz + pgsz-1, "", 1, 0)!=1 ){ |
| 4450 const char *zFile = pShmNode->zFilename; |
| 4451 rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); |
| 4452 goto shmpage_out; |
| 4453 } |
| 4454 } |
| 4455 } |
3943 } | 4456 } |
3944 } | 4457 } |
3945 | 4458 |
3946 /* Map the requested memory region into this processes address space. */ | 4459 /* Map the requested memory region into this processes address space. */ |
3947 apNew = (char **)sqlite3_realloc( | 4460 apNew = (char **)sqlite3_realloc( |
3948 pShmNode->apRegion, (iRegion+1)*sizeof(char *) | 4461 pShmNode->apRegion, nReqRegion*sizeof(char *) |
3949 ); | 4462 ); |
3950 if( !apNew ){ | 4463 if( !apNew ){ |
3951 rc = SQLITE_IOERR_NOMEM; | 4464 rc = SQLITE_IOERR_NOMEM; |
3952 goto shmpage_out; | 4465 goto shmpage_out; |
3953 } | 4466 } |
3954 pShmNode->apRegion = apNew; | 4467 pShmNode->apRegion = apNew; |
3955 while(pShmNode->nRegion<=iRegion){ | 4468 while( pShmNode->nRegion<nReqRegion ){ |
| 4469 int nMap = szRegion*nShmPerMap; |
| 4470 int i; |
3956 void *pMem; | 4471 void *pMem; |
3957 if( pShmNode->h>=0 ){ | 4472 if( pShmNode->h>=0 ){ |
3958 pMem = mmap(0, szRegion, PROT_READ|PROT_WRITE, | 4473 pMem = osMmap(0, nMap, |
3959 MAP_SHARED, pShmNode->h, pShmNode->nRegion*szRegion | 4474 pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, |
| 4475 MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion |
3960 ); | 4476 ); |
3961 if( pMem==MAP_FAILED ){ | 4477 if( pMem==MAP_FAILED ){ |
3962 rc = SQLITE_IOERR; | 4478 rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); |
3963 goto shmpage_out; | 4479 goto shmpage_out; |
3964 } | 4480 } |
3965 }else{ | 4481 }else{ |
3966 pMem = sqlite3_malloc(szRegion); | 4482 pMem = sqlite3_malloc(szRegion); |
3967 if( pMem==0 ){ | 4483 if( pMem==0 ){ |
3968 rc = SQLITE_NOMEM; | 4484 rc = SQLITE_NOMEM; |
3969 goto shmpage_out; | 4485 goto shmpage_out; |
3970 } | 4486 } |
3971 memset(pMem, 0, szRegion); | 4487 memset(pMem, 0, szRegion); |
3972 } | 4488 } |
3973 pShmNode->apRegion[pShmNode->nRegion] = pMem; | 4489 |
3974 pShmNode->nRegion++; | 4490 for(i=0; i<nShmPerMap; i++){ |
| 4491 pShmNode->apRegion[pShmNode->nRegion+i] = &((char*)pMem)[szRegion*i]; |
| 4492 } |
| 4493 pShmNode->nRegion += nShmPerMap; |
3975 } | 4494 } |
3976 } | 4495 } |
3977 | 4496 |
3978 shmpage_out: | 4497 shmpage_out: |
3979 if( pShmNode->nRegion>iRegion ){ | 4498 if( pShmNode->nRegion>iRegion ){ |
3980 *pp = pShmNode->apRegion[iRegion]; | 4499 *pp = pShmNode->apRegion[iRegion]; |
3981 }else{ | 4500 }else{ |
3982 *pp = 0; | 4501 *pp = 0; |
3983 } | 4502 } |
| 4503 if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; |
3984 sqlite3_mutex_leave(pShmNode->mutex); | 4504 sqlite3_mutex_leave(pShmNode->mutex); |
3985 return rc; | 4505 return rc; |
3986 } | 4506 } |
3987 | 4507 |
3988 /* | 4508 /* |
3989 ** Change the lock state for a shared-memory segment. | 4509 ** Change the lock state for a shared-memory segment. |
3990 ** | 4510 ** |
3991 ** Note that the relationship between SHAREd and EXCLUSIVE locks is a little | 4511 ** Note that the relationship between SHAREd and EXCLUSIVE locks is a little |
3992 ** different here than in posix. In xShmLock(), one can go from unlocked | 4512 ** different here than in posix. In xShmLock(), one can go from unlocked |
3993 ** to shared and back or from unlocked to exclusive and back. But one may | 4513 ** to shared and back or from unlocked to exclusive and back. But one may |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4163 } | 4683 } |
4164 | 4684 |
4165 | 4685 |
4166 #else | 4686 #else |
4167 # define unixShmMap 0 | 4687 # define unixShmMap 0 |
4168 # define unixShmLock 0 | 4688 # define unixShmLock 0 |
4169 # define unixShmBarrier 0 | 4689 # define unixShmBarrier 0 |
4170 # define unixShmUnmap 0 | 4690 # define unixShmUnmap 0 |
4171 #endif /* #ifndef SQLITE_OMIT_WAL */ | 4691 #endif /* #ifndef SQLITE_OMIT_WAL */ |
4172 | 4692 |
| 4693 #if SQLITE_MAX_MMAP_SIZE>0 |
| 4694 /* |
| 4695 ** If it is currently memory mapped, unmap file pFd. |
| 4696 */ |
| 4697 static void unixUnmapfile(unixFile *pFd){ |
| 4698 assert( pFd->nFetchOut==0 ); |
| 4699 if( pFd->pMapRegion ){ |
| 4700 osMunmap(pFd->pMapRegion, pFd->mmapSizeActual); |
| 4701 pFd->pMapRegion = 0; |
| 4702 pFd->mmapSize = 0; |
| 4703 pFd->mmapSizeActual = 0; |
| 4704 } |
| 4705 } |
| 4706 |
| 4707 /* |
| 4708 ** Attempt to set the size of the memory mapping maintained by file |
| 4709 ** descriptor pFd to nNew bytes. Any existing mapping is discarded. |
| 4710 ** |
| 4711 ** If successful, this function sets the following variables: |
| 4712 ** |
| 4713 ** unixFile.pMapRegion |
| 4714 ** unixFile.mmapSize |
| 4715 ** unixFile.mmapSizeActual |
| 4716 ** |
| 4717 ** If unsuccessful, an error message is logged via sqlite3_log() and |
| 4718 ** the three variables above are zeroed. In this case SQLite should |
| 4719 ** continue accessing the database using the xRead() and xWrite() |
| 4720 ** methods. |
| 4721 */ |
| 4722 static void unixRemapfile( |
| 4723 unixFile *pFd, /* File descriptor object */ |
| 4724 i64 nNew /* Required mapping size */ |
| 4725 ){ |
| 4726 const char *zErr = "mmap"; |
| 4727 int h = pFd->h; /* File descriptor open on db file */ |
| 4728 u8 *pOrig = (u8 *)pFd->pMapRegion; /* Pointer to current file mapping */ |
| 4729 i64 nOrig = pFd->mmapSizeActual; /* Size of pOrig region in bytes */ |
| 4730 u8 *pNew = 0; /* Location of new mapping */ |
| 4731 int flags = PROT_READ; /* Flags to pass to mmap() */ |
| 4732 |
| 4733 assert( pFd->nFetchOut==0 ); |
| 4734 assert( nNew>pFd->mmapSize ); |
| 4735 assert( nNew<=pFd->mmapSizeMax ); |
| 4736 assert( nNew>0 ); |
| 4737 assert( pFd->mmapSizeActual>=pFd->mmapSize ); |
| 4738 assert( MAP_FAILED!=0 ); |
| 4739 |
| 4740 if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; |
| 4741 |
| 4742 if( pOrig ){ |
| 4743 #if HAVE_MREMAP |
| 4744 i64 nReuse = pFd->mmapSize; |
| 4745 #else |
| 4746 const int szSyspage = osGetpagesize(); |
| 4747 i64 nReuse = (pFd->mmapSize & ~(szSyspage-1)); |
| 4748 #endif |
| 4749 u8 *pReq = &pOrig[nReuse]; |
| 4750 |
| 4751 /* Unmap any pages of the existing mapping that cannot be reused. */ |
| 4752 if( nReuse!=nOrig ){ |
| 4753 osMunmap(pReq, nOrig-nReuse); |
| 4754 } |
| 4755 |
| 4756 #if HAVE_MREMAP |
| 4757 pNew = osMremap(pOrig, nReuse, nNew, MREMAP_MAYMOVE); |
| 4758 zErr = "mremap"; |
| 4759 #else |
| 4760 pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED, h, nReuse); |
| 4761 if( pNew!=MAP_FAILED ){ |
| 4762 if( pNew!=pReq ){ |
| 4763 osMunmap(pNew, nNew - nReuse); |
| 4764 pNew = 0; |
| 4765 }else{ |
| 4766 pNew = pOrig; |
| 4767 } |
| 4768 } |
| 4769 #endif |
| 4770 |
| 4771 /* The attempt to extend the existing mapping failed. Free it. */ |
| 4772 if( pNew==MAP_FAILED || pNew==0 ){ |
| 4773 osMunmap(pOrig, nReuse); |
| 4774 } |
| 4775 } |
| 4776 |
| 4777 /* If pNew is still NULL, try to create an entirely new mapping. */ |
| 4778 if( pNew==0 ){ |
| 4779 pNew = osMmap(0, nNew, flags, MAP_SHARED, h, 0); |
| 4780 } |
| 4781 |
| 4782 if( pNew==MAP_FAILED ){ |
| 4783 pNew = 0; |
| 4784 nNew = 0; |
| 4785 unixLogError(SQLITE_OK, zErr, pFd->zPath); |
| 4786 |
| 4787 /* If the mmap() above failed, assume that all subsequent mmap() calls |
| 4788 ** will probably fail too. Fall back to using xRead/xWrite exclusively |
| 4789 ** in this case. */ |
| 4790 pFd->mmapSizeMax = 0; |
| 4791 } |
| 4792 pFd->pMapRegion = (void *)pNew; |
| 4793 pFd->mmapSize = pFd->mmapSizeActual = nNew; |
| 4794 } |
| 4795 |
| 4796 /* |
| 4797 ** Memory map or remap the file opened by file-descriptor pFd (if the file |
| 4798 ** is already mapped, the existing mapping is replaced by the new). Or, if |
| 4799 ** there already exists a mapping for this file, and there are still |
| 4800 ** outstanding xFetch() references to it, this function is a no-op. |
| 4801 ** |
| 4802 ** If parameter nByte is non-negative, then it is the requested size of |
| 4803 ** the mapping to create. Otherwise, if nByte is less than zero, then the |
| 4804 ** requested size is the size of the file on disk. The actual size of the |
| 4805 ** created mapping is either the requested size or the value configured |
| 4806 ** using SQLITE_FCNTL_MMAP_LIMIT, whichever is smaller. |
| 4807 ** |
| 4808 ** SQLITE_OK is returned if no error occurs (even if the mapping is not |
| 4809 ** recreated as a result of outstanding references) or an SQLite error |
| 4810 ** code otherwise. |
| 4811 */ |
| 4812 static int unixMapfile(unixFile *pFd, i64 nByte){ |
| 4813 i64 nMap = nByte; |
| 4814 int rc; |
| 4815 |
| 4816 assert( nMap>=0 || pFd->nFetchOut==0 ); |
| 4817 if( pFd->nFetchOut>0 ) return SQLITE_OK; |
| 4818 |
| 4819 if( nMap<0 ){ |
| 4820 struct stat statbuf; /* Low-level file information */ |
| 4821 rc = osFstat(pFd->h, &statbuf); |
| 4822 if( rc!=SQLITE_OK ){ |
| 4823 return SQLITE_IOERR_FSTAT; |
| 4824 } |
| 4825 nMap = statbuf.st_size; |
| 4826 } |
| 4827 if( nMap>pFd->mmapSizeMax ){ |
| 4828 nMap = pFd->mmapSizeMax; |
| 4829 } |
| 4830 |
| 4831 if( nMap!=pFd->mmapSize ){ |
| 4832 if( nMap>0 ){ |
| 4833 unixRemapfile(pFd, nMap); |
| 4834 }else{ |
| 4835 unixUnmapfile(pFd); |
| 4836 } |
| 4837 } |
| 4838 |
| 4839 return SQLITE_OK; |
| 4840 } |
| 4841 #endif /* SQLITE_MAX_MMAP_SIZE>0 */ |
| 4842 |
| 4843 /* |
| 4844 ** If possible, return a pointer to a mapping of file fd starting at offset |
| 4845 ** iOff. The mapping must be valid for at least nAmt bytes. |
| 4846 ** |
| 4847 ** If such a pointer can be obtained, store it in *pp and return SQLITE_OK. |
| 4848 ** Or, if one cannot but no error occurs, set *pp to 0 and return SQLITE_OK. |
| 4849 ** Finally, if an error does occur, return an SQLite error code. The final |
| 4850 ** value of *pp is undefined in this case. |
| 4851 ** |
| 4852 ** If this function does return a pointer, the caller must eventually |
| 4853 ** release the reference by calling unixUnfetch(). |
| 4854 */ |
| 4855 static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ |
| 4856 #if SQLITE_MAX_MMAP_SIZE>0 |
| 4857 unixFile *pFd = (unixFile *)fd; /* The underlying database file */ |
| 4858 #endif |
| 4859 *pp = 0; |
| 4860 |
| 4861 #if SQLITE_MAX_MMAP_SIZE>0 |
| 4862 if( pFd->mmapSizeMax>0 ){ |
| 4863 if( pFd->pMapRegion==0 ){ |
| 4864 int rc = unixMapfile(pFd, -1); |
| 4865 if( rc!=SQLITE_OK ) return rc; |
| 4866 } |
| 4867 if( pFd->mmapSize >= iOff+nAmt ){ |
| 4868 *pp = &((u8 *)pFd->pMapRegion)[iOff]; |
| 4869 pFd->nFetchOut++; |
| 4870 } |
| 4871 } |
| 4872 #endif |
| 4873 return SQLITE_OK; |
| 4874 } |
| 4875 |
| 4876 /* |
| 4877 ** If the third argument is non-NULL, then this function releases a |
| 4878 ** reference obtained by an earlier call to unixFetch(). The second |
| 4879 ** argument passed to this function must be the same as the corresponding |
| 4880 ** argument that was passed to the unixFetch() invocation. |
| 4881 ** |
| 4882 ** Or, if the third argument is NULL, then this function is being called |
| 4883 ** to inform the VFS layer that, according to POSIX, any existing mapping |
| 4884 ** may now be invalid and should be unmapped. |
| 4885 */ |
| 4886 static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ |
| 4887 #if SQLITE_MAX_MMAP_SIZE>0 |
| 4888 unixFile *pFd = (unixFile *)fd; /* The underlying database file */ |
| 4889 UNUSED_PARAMETER(iOff); |
| 4890 |
| 4891 /* If p==0 (unmap the entire file) then there must be no outstanding |
| 4892 ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), |
| 4893 ** then there must be at least one outstanding. */ |
| 4894 assert( (p==0)==(pFd->nFetchOut==0) ); |
| 4895 |
| 4896 /* If p!=0, it must match the iOff value. */ |
| 4897 assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); |
| 4898 |
| 4899 if( p ){ |
| 4900 pFd->nFetchOut--; |
| 4901 }else{ |
| 4902 unixUnmapfile(pFd); |
| 4903 } |
| 4904 |
| 4905 assert( pFd->nFetchOut>=0 ); |
| 4906 #else |
| 4907 UNUSED_PARAMETER(fd); |
| 4908 UNUSED_PARAMETER(p); |
| 4909 UNUSED_PARAMETER(iOff); |
| 4910 #endif |
| 4911 return SQLITE_OK; |
| 4912 } |
| 4913 |
4173 /* | 4914 /* |
4174 ** Here ends the implementation of all sqlite3_file methods. | 4915 ** Here ends the implementation of all sqlite3_file methods. |
4175 ** | 4916 ** |
4176 ********************** End sqlite3_file Methods ******************************* | 4917 ********************** End sqlite3_file Methods ******************************* |
4177 ******************************************************************************/ | 4918 ******************************************************************************/ |
4178 | 4919 |
4179 /* | 4920 /* |
4180 ** This division contains definitions of sqlite3_io_methods objects that | 4921 ** This division contains definitions of sqlite3_io_methods objects that |
4181 ** implement various file locking strategies. It also contains definitions | 4922 ** implement various file locking strategies. It also contains definitions |
4182 ** of "finder" functions. A finder-function is used to locate the appropriate | 4923 ** of "finder" functions. A finder-function is used to locate the appropriate |
4183 ** sqlite3_io_methods object for a particular database file. The pAppData | 4924 ** sqlite3_io_methods object for a particular database file. The pAppData |
4184 ** field of the sqlite3_vfs VFS objects are initialized to be pointers to | 4925 ** field of the sqlite3_vfs VFS objects are initialized to be pointers to |
4185 ** the correct finder-function for that VFS. | 4926 ** the correct finder-function for that VFS. |
4186 ** | 4927 ** |
4187 ** Most finder functions return a pointer to a fixed sqlite3_io_methods | 4928 ** Most finder functions return a pointer to a fixed sqlite3_io_methods |
4188 ** object. The only interesting finder-function is autolockIoFinder, which | 4929 ** object. The only interesting finder-function is autolockIoFinder, which |
4189 ** looks at the filesystem type and tries to guess the best locking | 4930 ** looks at the filesystem type and tries to guess the best locking |
4190 ** strategy from that. | 4931 ** strategy from that. |
4191 ** | 4932 ** |
4192 ** For finder-funtion F, two objects are created: | 4933 ** For finder-function F, two objects are created: |
4193 ** | 4934 ** |
4194 ** (1) The real finder-function named "FImpt()". | 4935 ** (1) The real finder-function named "FImpt()". |
4195 ** | 4936 ** |
4196 ** (2) A constant pointer to this function named just "F". | 4937 ** (2) A constant pointer to this function named just "F". |
4197 ** | 4938 ** |
4198 ** | 4939 ** |
4199 ** A pointer to the F pointer is used as the pAppData value for VFS | 4940 ** A pointer to the F pointer is used as the pAppData value for VFS |
4200 ** objects. We have to do this instead of letting pAppData point | 4941 ** objects. We have to do this instead of letting pAppData point |
4201 ** directly at the finder-function since C90 rules prevent a void* | 4942 ** directly at the finder-function since C90 rules prevent a void* |
4202 ** from be cast into a function pointer. | 4943 ** from be cast into a function pointer. |
4203 ** | 4944 ** |
4204 ** | 4945 ** |
4205 ** Each instance of this macro generates two objects: | 4946 ** Each instance of this macro generates two objects: |
4206 ** | 4947 ** |
4207 ** * A constant sqlite3_io_methods object call METHOD that has locking | 4948 ** * A constant sqlite3_io_methods object call METHOD that has locking |
4208 ** methods CLOSE, LOCK, UNLOCK, CKRESLOCK. | 4949 ** methods CLOSE, LOCK, UNLOCK, CKRESLOCK. |
4209 ** | 4950 ** |
4210 ** * An I/O method finder function called FINDER that returns a pointer | 4951 ** * An I/O method finder function called FINDER that returns a pointer |
4211 ** to the METHOD object in the previous bullet. | 4952 ** to the METHOD object in the previous bullet. |
4212 */ | 4953 */ |
4213 #define IOMETHODS(FINDER, METHOD, VERSION, CLOSE, LOCK, UNLOCK, CKLOCK) \ | 4954 #define IOMETHODS(FINDER, METHOD, VERSION, CLOSE, LOCK, UNLOCK, CKLOCK, SHMMAP)
\ |
4214 static const sqlite3_io_methods METHOD = { \ | 4955 static const sqlite3_io_methods METHOD = { \ |
4215 VERSION, /* iVersion */ \ | 4956 VERSION, /* iVersion */ \ |
4216 CLOSE, /* xClose */ \ | 4957 CLOSE, /* xClose */ \ |
4217 unixRead, /* xRead */ \ | 4958 unixRead, /* xRead */ \ |
4218 unixWrite, /* xWrite */ \ | 4959 unixWrite, /* xWrite */ \ |
4219 unixTruncate, /* xTruncate */ \ | 4960 unixTruncate, /* xTruncate */ \ |
4220 unixSync, /* xSync */ \ | 4961 unixSync, /* xSync */ \ |
4221 unixFileSize, /* xFileSize */ \ | 4962 unixFileSize, /* xFileSize */ \ |
4222 LOCK, /* xLock */ \ | 4963 LOCK, /* xLock */ \ |
4223 UNLOCK, /* xUnlock */ \ | 4964 UNLOCK, /* xUnlock */ \ |
4224 CKLOCK, /* xCheckReservedLock */ \ | 4965 CKLOCK, /* xCheckReservedLock */ \ |
4225 unixFileControl, /* xFileControl */ \ | 4966 unixFileControl, /* xFileControl */ \ |
4226 unixSectorSize, /* xSectorSize */ \ | 4967 unixSectorSize, /* xSectorSize */ \ |
4227 unixDeviceCharacteristics, /* xDeviceCapabilities */ \ | 4968 unixDeviceCharacteristics, /* xDeviceCapabilities */ \ |
4228 unixShmMap, /* xShmMap */ \ | 4969 SHMMAP, /* xShmMap */ \ |
4229 unixShmLock, /* xShmLock */ \ | 4970 unixShmLock, /* xShmLock */ \ |
4230 unixShmBarrier, /* xShmBarrier */ \ | 4971 unixShmBarrier, /* xShmBarrier */ \ |
4231 unixShmUnmap /* xShmUnmap */ \ | 4972 unixShmUnmap, /* xShmUnmap */ \ |
| 4973 unixFetch, /* xFetch */ \ |
| 4974 unixUnfetch, /* xUnfetch */ \ |
4232 }; \ | 4975 }; \ |
4233 static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \ | 4976 static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \ |
4234 UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \ | 4977 UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \ |
4235 return &METHOD; \ | 4978 return &METHOD; \ |
4236 } \ | 4979 } \ |
4237 static const sqlite3_io_methods *(*const FINDER)(const char*,unixFile *p) \ | 4980 static const sqlite3_io_methods *(*const FINDER)(const char*,unixFile *p) \ |
4238 = FINDER##Impl; | 4981 = FINDER##Impl; |
4239 | 4982 |
4240 /* | 4983 /* |
4241 ** Here are all of the sqlite3_io_methods objects for each of the | 4984 ** Here are all of the sqlite3_io_methods objects for each of the |
4242 ** locking strategies. Functions that return pointers to these methods | 4985 ** locking strategies. Functions that return pointers to these methods |
4243 ** are also created. | 4986 ** are also created. |
4244 */ | 4987 */ |
4245 IOMETHODS( | 4988 IOMETHODS( |
4246 posixIoFinder, /* Finder function name */ | 4989 posixIoFinder, /* Finder function name */ |
4247 posixIoMethods, /* sqlite3_io_methods object name */ | 4990 posixIoMethods, /* sqlite3_io_methods object name */ |
4248 2, /* shared memory is enabled */ | 4991 3, /* shared memory and mmap are enabled */ |
4249 unixClose, /* xClose method */ | 4992 unixClose, /* xClose method */ |
4250 unixLock, /* xLock method */ | 4993 unixLock, /* xLock method */ |
4251 unixUnlock, /* xUnlock method */ | 4994 unixUnlock, /* xUnlock method */ |
4252 unixCheckReservedLock /* xCheckReservedLock method */ | 4995 unixCheckReservedLock, /* xCheckReservedLock method */ |
| 4996 unixShmMap /* xShmMap method */ |
4253 ) | 4997 ) |
4254 IOMETHODS( | 4998 IOMETHODS( |
4255 nolockIoFinder, /* Finder function name */ | 4999 nolockIoFinder, /* Finder function name */ |
4256 nolockIoMethods, /* sqlite3_io_methods object name */ | 5000 nolockIoMethods, /* sqlite3_io_methods object name */ |
4257 1, /* shared memory is disabled */ | 5001 3, /* shared memory is disabled */ |
4258 nolockClose, /* xClose method */ | 5002 nolockClose, /* xClose method */ |
4259 nolockLock, /* xLock method */ | 5003 nolockLock, /* xLock method */ |
4260 nolockUnlock, /* xUnlock method */ | 5004 nolockUnlock, /* xUnlock method */ |
4261 nolockCheckReservedLock /* xCheckReservedLock method */ | 5005 nolockCheckReservedLock, /* xCheckReservedLock method */ |
| 5006 0 /* xShmMap method */ |
4262 ) | 5007 ) |
4263 IOMETHODS( | 5008 IOMETHODS( |
4264 dotlockIoFinder, /* Finder function name */ | 5009 dotlockIoFinder, /* Finder function name */ |
4265 dotlockIoMethods, /* sqlite3_io_methods object name */ | 5010 dotlockIoMethods, /* sqlite3_io_methods object name */ |
4266 1, /* shared memory is disabled */ | 5011 1, /* shared memory is disabled */ |
4267 dotlockClose, /* xClose method */ | 5012 dotlockClose, /* xClose method */ |
4268 dotlockLock, /* xLock method */ | 5013 dotlockLock, /* xLock method */ |
4269 dotlockUnlock, /* xUnlock method */ | 5014 dotlockUnlock, /* xUnlock method */ |
4270 dotlockCheckReservedLock /* xCheckReservedLock method */ | 5015 dotlockCheckReservedLock, /* xCheckReservedLock method */ |
| 5016 0 /* xShmMap method */ |
4271 ) | 5017 ) |
4272 | 5018 |
4273 #if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS | 5019 #if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS |
4274 IOMETHODS( | 5020 IOMETHODS( |
4275 flockIoFinder, /* Finder function name */ | 5021 flockIoFinder, /* Finder function name */ |
4276 flockIoMethods, /* sqlite3_io_methods object name */ | 5022 flockIoMethods, /* sqlite3_io_methods object name */ |
4277 1, /* shared memory is disabled */ | 5023 1, /* shared memory is disabled */ |
4278 flockClose, /* xClose method */ | 5024 flockClose, /* xClose method */ |
4279 flockLock, /* xLock method */ | 5025 flockLock, /* xLock method */ |
4280 flockUnlock, /* xUnlock method */ | 5026 flockUnlock, /* xUnlock method */ |
4281 flockCheckReservedLock /* xCheckReservedLock method */ | 5027 flockCheckReservedLock, /* xCheckReservedLock method */ |
| 5028 0 /* xShmMap method */ |
4282 ) | 5029 ) |
4283 #endif | 5030 #endif |
4284 | 5031 |
4285 #if OS_VXWORKS | 5032 #if OS_VXWORKS |
4286 IOMETHODS( | 5033 IOMETHODS( |
4287 semIoFinder, /* Finder function name */ | 5034 semIoFinder, /* Finder function name */ |
4288 semIoMethods, /* sqlite3_io_methods object name */ | 5035 semIoMethods, /* sqlite3_io_methods object name */ |
4289 1, /* shared memory is disabled */ | 5036 1, /* shared memory is disabled */ |
4290 semClose, /* xClose method */ | 5037 semClose, /* xClose method */ |
4291 semLock, /* xLock method */ | 5038 semLock, /* xLock method */ |
4292 semUnlock, /* xUnlock method */ | 5039 semUnlock, /* xUnlock method */ |
4293 semCheckReservedLock /* xCheckReservedLock method */ | 5040 semCheckReservedLock, /* xCheckReservedLock method */ |
| 5041 0 /* xShmMap method */ |
4294 ) | 5042 ) |
4295 #endif | 5043 #endif |
4296 | 5044 |
4297 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE | 5045 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE |
4298 IOMETHODS( | 5046 IOMETHODS( |
4299 afpIoFinder, /* Finder function name */ | 5047 afpIoFinder, /* Finder function name */ |
4300 afpIoMethods, /* sqlite3_io_methods object name */ | 5048 afpIoMethods, /* sqlite3_io_methods object name */ |
4301 1, /* shared memory is disabled */ | 5049 1, /* shared memory is disabled */ |
4302 afpClose, /* xClose method */ | 5050 afpClose, /* xClose method */ |
4303 afpLock, /* xLock method */ | 5051 afpLock, /* xLock method */ |
4304 afpUnlock, /* xUnlock method */ | 5052 afpUnlock, /* xUnlock method */ |
4305 afpCheckReservedLock /* xCheckReservedLock method */ | 5053 afpCheckReservedLock, /* xCheckReservedLock method */ |
| 5054 0 /* xShmMap method */ |
4306 ) | 5055 ) |
4307 #endif | 5056 #endif |
4308 | 5057 |
4309 /* | 5058 /* |
4310 ** The proxy locking method is a "super-method" in the sense that it | 5059 ** The proxy locking method is a "super-method" in the sense that it |
4311 ** opens secondary file descriptors for the conch and lock files and | 5060 ** opens secondary file descriptors for the conch and lock files and |
4312 ** it uses proxy, dot-file, AFP, and flock() locking methods on those | 5061 ** it uses proxy, dot-file, AFP, and flock() locking methods on those |
4313 ** secondary files. For this reason, the division that implements | 5062 ** secondary files. For this reason, the division that implements |
4314 ** proxy locking is located much further down in the file. But we need | 5063 ** proxy locking is located much further down in the file. But we need |
4315 ** to go ahead and define the sqlite3_io_methods and finder function | 5064 ** to go ahead and define the sqlite3_io_methods and finder function |
4316 ** for proxy locking here. So we forward declare the I/O methods. | 5065 ** for proxy locking here. So we forward declare the I/O methods. |
4317 */ | 5066 */ |
4318 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE | 5067 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE |
4319 static int proxyClose(sqlite3_file*); | 5068 static int proxyClose(sqlite3_file*); |
4320 static int proxyLock(sqlite3_file*, int); | 5069 static int proxyLock(sqlite3_file*, int); |
4321 static int proxyUnlock(sqlite3_file*, int); | 5070 static int proxyUnlock(sqlite3_file*, int); |
4322 static int proxyCheckReservedLock(sqlite3_file*, int*); | 5071 static int proxyCheckReservedLock(sqlite3_file*, int*); |
4323 IOMETHODS( | 5072 IOMETHODS( |
4324 proxyIoFinder, /* Finder function name */ | 5073 proxyIoFinder, /* Finder function name */ |
4325 proxyIoMethods, /* sqlite3_io_methods object name */ | 5074 proxyIoMethods, /* sqlite3_io_methods object name */ |
4326 1, /* shared memory is disabled */ | 5075 1, /* shared memory is disabled */ |
4327 proxyClose, /* xClose method */ | 5076 proxyClose, /* xClose method */ |
4328 proxyLock, /* xLock method */ | 5077 proxyLock, /* xLock method */ |
4329 proxyUnlock, /* xUnlock method */ | 5078 proxyUnlock, /* xUnlock method */ |
4330 proxyCheckReservedLock /* xCheckReservedLock method */ | 5079 proxyCheckReservedLock, /* xCheckReservedLock method */ |
| 5080 0 /* xShmMap method */ |
4331 ) | 5081 ) |
4332 #endif | 5082 #endif |
4333 | 5083 |
4334 /* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */ | 5084 /* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */ |
4335 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE | 5085 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE |
4336 IOMETHODS( | 5086 IOMETHODS( |
4337 nfsIoFinder, /* Finder function name */ | 5087 nfsIoFinder, /* Finder function name */ |
4338 nfsIoMethods, /* sqlite3_io_methods object name */ | 5088 nfsIoMethods, /* sqlite3_io_methods object name */ |
4339 1, /* shared memory is disabled */ | 5089 1, /* shared memory is disabled */ |
4340 unixClose, /* xClose method */ | 5090 unixClose, /* xClose method */ |
4341 unixLock, /* xLock method */ | 5091 unixLock, /* xLock method */ |
4342 nfsUnlock, /* xUnlock method */ | 5092 nfsUnlock, /* xUnlock method */ |
4343 unixCheckReservedLock /* xCheckReservedLock method */ | 5093 unixCheckReservedLock, /* xCheckReservedLock method */ |
| 5094 0 /* xShmMap method */ |
4344 ) | 5095 ) |
4345 #endif | 5096 #endif |
4346 | 5097 |
4347 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE | 5098 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE |
4348 /* | 5099 /* |
4349 ** This "finder" function attempts to determine the best locking strategy | 5100 ** This "finder" function attempts to determine the best locking strategy |
4350 ** for the database file "filePath". It then returns the sqlite3_io_methods | 5101 ** for the database file "filePath". It then returns the sqlite3_io_methods |
4351 ** object that implements that strategy. | 5102 ** object that implements that strategy. |
4352 ** | 5103 ** |
4353 ** This is for MacOSX only. | 5104 ** This is for MacOSX only. |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4442 }else{ | 5193 }else{ |
4443 return &semIoMethods; | 5194 return &semIoMethods; |
4444 } | 5195 } |
4445 } | 5196 } |
4446 static const sqlite3_io_methods | 5197 static const sqlite3_io_methods |
4447 *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; | 5198 *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; |
4448 | 5199 |
4449 #endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ | 5200 #endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ |
4450 | 5201 |
4451 /* | 5202 /* |
4452 ** An abstract type for a pointer to a IO method finder function: | 5203 ** An abstract type for a pointer to an IO method finder function: |
4453 */ | 5204 */ |
4454 typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*); | 5205 typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*); |
4455 | 5206 |
4456 | 5207 |
4457 /**************************************************************************** | 5208 /**************************************************************************** |
4458 **************************** sqlite3_vfs methods **************************** | 5209 **************************** sqlite3_vfs methods **************************** |
4459 ** | 5210 ** |
4460 ** This division contains the implementation of methods on the | 5211 ** This division contains the implementation of methods on the |
4461 ** sqlite3_vfs object. | 5212 ** sqlite3_vfs object. |
4462 */ | 5213 */ |
4463 | 5214 |
4464 /* | 5215 /* |
4465 ** Initializes a unixFile structure with zeros. | |
4466 */ | |
4467 void initUnixFile(sqlite3_file* file) { | |
4468 memset(file, 0, sizeof(unixFile)); | |
4469 } | |
4470 | |
4471 /* | |
4472 ** Initialize the contents of the unixFile structure pointed to by pId. | 5216 ** Initialize the contents of the unixFile structure pointed to by pId. |
4473 */ | 5217 */ |
4474 int fillInUnixFile( | 5218 static int fillInUnixFile( |
4475 sqlite3_vfs *pVfs, /* Pointer to vfs object */ | 5219 sqlite3_vfs *pVfs, /* Pointer to vfs object */ |
4476 int h, /* Open file descriptor of file being opened */ | 5220 int h, /* Open file descriptor of file being opened */ |
4477 int syncDir, /* True to sync directory on first sync */ | |
4478 sqlite3_file *pId, /* Write to the unixFile structure here */ | 5221 sqlite3_file *pId, /* Write to the unixFile structure here */ |
4479 const char *zFilename, /* Name of the file being opened */ | 5222 const char *zFilename, /* Name of the file being opened */ |
4480 int noLock, /* Omit locking if true */ | 5223 int ctrlFlags /* Zero or more UNIXFILE_* values */ |
4481 int isDelete, /* Delete on close if true */ | |
4482 int isReadOnly /* True if the file is opened read-only */ | |
4483 ){ | 5224 ){ |
4484 const sqlite3_io_methods *pLockingStyle; | 5225 const sqlite3_io_methods *pLockingStyle; |
4485 unixFile *pNew = (unixFile *)pId; | 5226 unixFile *pNew = (unixFile *)pId; |
4486 int rc = SQLITE_OK; | 5227 int rc = SQLITE_OK; |
4487 | 5228 |
4488 assert( pNew->pInode==NULL ); | 5229 assert( pNew->pInode==NULL ); |
4489 | 5230 |
4490 /* Parameter isDelete is only used on vxworks. Express this explicitly | |
4491 ** here to prevent compiler warnings about unused parameters. | |
4492 */ | |
4493 UNUSED_PARAMETER(isDelete); | |
4494 | |
4495 /* Usually the path zFilename should not be a relative pathname. The | 5231 /* Usually the path zFilename should not be a relative pathname. The |
4496 ** exception is when opening the proxy "conch" file in builds that | 5232 ** exception is when opening the proxy "conch" file in builds that |
4497 ** include the special Apple locking styles. | 5233 ** include the special Apple locking styles. |
4498 */ | 5234 */ |
4499 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE | 5235 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE |
4500 assert( zFilename==0 || zFilename[0]=='/' | 5236 assert( zFilename==0 || zFilename[0]=='/' |
4501 || pVfs->pAppData==(void*)&autolockIoFinder ); | 5237 || pVfs->pAppData==(void*)&autolockIoFinder ); |
4502 #else | 5238 #else |
4503 assert( zFilename==0 || zFilename[0]=='/' ); | 5239 assert( zFilename==0 || zFilename[0]=='/' ); |
4504 #endif | 5240 #endif |
4505 | 5241 |
| 5242 /* No locking occurs in temporary files */ |
| 5243 assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 ); |
| 5244 |
4506 OSTRACE(("OPEN %-3d %s\n", h, zFilename)); | 5245 OSTRACE(("OPEN %-3d %s\n", h, zFilename)); |
4507 pNew->h = h; | 5246 pNew->h = h; |
| 5247 pNew->pVfs = pVfs; |
4508 pNew->zPath = zFilename; | 5248 pNew->zPath = zFilename; |
| 5249 pNew->ctrlFlags = (u8)ctrlFlags; |
| 5250 #if SQLITE_MAX_MMAP_SIZE>0 |
| 5251 pNew->mmapSizeMax = sqlite3GlobalConfig.szMmap; |
| 5252 #endif |
| 5253 if( sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0), |
| 5254 "psow", SQLITE_POWERSAFE_OVERWRITE) ){ |
| 5255 pNew->ctrlFlags |= UNIXFILE_PSOW; |
| 5256 } |
4509 if( strcmp(pVfs->zName,"unix-excl")==0 ){ | 5257 if( strcmp(pVfs->zName,"unix-excl")==0 ){ |
4510 pNew->ctrlFlags = UNIXFILE_EXCL; | 5258 pNew->ctrlFlags |= UNIXFILE_EXCL; |
4511 }else{ | |
4512 pNew->ctrlFlags = 0; | |
4513 } | |
4514 if( isReadOnly ){ | |
4515 pNew->ctrlFlags |= UNIXFILE_RDONLY; | |
4516 } | |
4517 if( syncDir ){ | |
4518 pNew->ctrlFlags |= UNIXFILE_DIRSYNC; | |
4519 } | 5259 } |
4520 | 5260 |
4521 #if OS_VXWORKS | 5261 #if OS_VXWORKS |
4522 pNew->pId = vxworksFindFileId(zFilename); | 5262 pNew->pId = vxworksFindFileId(zFilename); |
4523 if( pNew->pId==0 ){ | 5263 if( pNew->pId==0 ){ |
4524 noLock = 1; | 5264 ctrlFlags |= UNIXFILE_NOLOCK; |
4525 rc = SQLITE_NOMEM; | 5265 rc = SQLITE_NOMEM; |
4526 } | 5266 } |
4527 #endif | 5267 #endif |
4528 | 5268 |
4529 if( noLock ){ | 5269 if( ctrlFlags & UNIXFILE_NOLOCK ){ |
4530 pLockingStyle = &nolockIoMethods; | 5270 pLockingStyle = &nolockIoMethods; |
4531 }else{ | 5271 }else{ |
4532 pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); | 5272 pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); |
4533 #if SQLITE_ENABLE_LOCKING_STYLE | 5273 #if SQLITE_ENABLE_LOCKING_STYLE |
4534 /* Cache zFilename in the locking context (AFP and dotlock override) for | 5274 /* Cache zFilename in the locking context (AFP and dotlock override) for |
4535 ** proxyLock activation is possible (remote proxy is based on db name) | 5275 ** proxyLock activation is possible (remote proxy is based on db name) |
4536 ** zFilename remains valid until file is closed, to support */ | 5276 ** zFilename remains valid until file is closed, to support */ |
4537 pNew->lockingContext = (void*)zFilename; | 5277 pNew->lockingContext = (void*)zFilename; |
4538 #endif | 5278 #endif |
4539 } | 5279 } |
4540 | 5280 |
4541 if( pLockingStyle == &posixIoMethods | 5281 if( pLockingStyle == &posixIoMethods |
4542 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE | 5282 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE |
4543 || pLockingStyle == &nfsIoMethods | 5283 || pLockingStyle == &nfsIoMethods |
4544 #endif | 5284 #endif |
4545 ){ | 5285 ){ |
4546 unixEnterMutex(); | 5286 unixEnterMutex(); |
4547 rc = findInodeInfo(pNew, &pNew->pInode); | 5287 rc = findInodeInfo(pNew, &pNew->pInode); |
4548 if( rc!=SQLITE_OK ){ | 5288 if( rc!=SQLITE_OK ){ |
4549 /* If an error occured in findInodeInfo(), close the file descriptor | 5289 /* If an error occurred in findInodeInfo(), close the file descriptor |
4550 ** immediately, before releasing the mutex. findInodeInfo() may fail | 5290 ** immediately, before releasing the mutex. findInodeInfo() may fail |
4551 ** in two scenarios: | 5291 ** in two scenarios: |
4552 ** | 5292 ** |
4553 ** (a) A call to fstat() failed. | 5293 ** (a) A call to fstat() failed. |
4554 ** (b) A malloc failed. | 5294 ** (b) A malloc failed. |
4555 ** | 5295 ** |
4556 ** Scenario (b) may only occur if the process is holding no other | 5296 ** Scenario (b) may only occur if the process is holding no other |
4557 ** file descriptors open on the same file. If there were other file | 5297 ** file descriptors open on the same file. If there were other file |
4558 ** descriptors on this file, then no malloc would be required by | 5298 ** descriptors on this file, then no malloc would be required by |
4559 ** findInodeInfo(). If this is the case, it is quite safe to close | 5299 ** findInodeInfo(). If this is the case, it is quite safe to close |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4597 } | 5337 } |
4598 } | 5338 } |
4599 #endif | 5339 #endif |
4600 | 5340 |
4601 else if( pLockingStyle == &dotlockIoMethods ){ | 5341 else if( pLockingStyle == &dotlockIoMethods ){ |
4602 /* Dotfile locking uses the file path so it needs to be included in | 5342 /* Dotfile locking uses the file path so it needs to be included in |
4603 ** the dotlockLockingContext | 5343 ** the dotlockLockingContext |
4604 */ | 5344 */ |
4605 char *zLockFile; | 5345 char *zLockFile; |
4606 int nFilename; | 5346 int nFilename; |
| 5347 assert( zFilename!=0 ); |
4607 nFilename = (int)strlen(zFilename) + 6; | 5348 nFilename = (int)strlen(zFilename) + 6; |
4608 zLockFile = (char *)sqlite3_malloc(nFilename); | 5349 zLockFile = (char *)sqlite3_malloc(nFilename); |
4609 if( zLockFile==0 ){ | 5350 if( zLockFile==0 ){ |
4610 rc = SQLITE_NOMEM; | 5351 rc = SQLITE_NOMEM; |
4611 }else{ | 5352 }else{ |
4612 sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); | 5353 sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); |
4613 } | 5354 } |
4614 pNew->lockingContext = zLockFile; | 5355 pNew->lockingContext = zLockFile; |
4615 } | 5356 } |
4616 | 5357 |
(...skipping 20 matching lines...) Expand all Loading... |
4637 unixLeaveMutex(); | 5378 unixLeaveMutex(); |
4638 } | 5379 } |
4639 #endif | 5380 #endif |
4640 | 5381 |
4641 pNew->lastErrno = 0; | 5382 pNew->lastErrno = 0; |
4642 #if OS_VXWORKS | 5383 #if OS_VXWORKS |
4643 if( rc!=SQLITE_OK ){ | 5384 if( rc!=SQLITE_OK ){ |
4644 if( h>=0 ) robust_close(pNew, h, __LINE__); | 5385 if( h>=0 ) robust_close(pNew, h, __LINE__); |
4645 h = -1; | 5386 h = -1; |
4646 osUnlink(zFilename); | 5387 osUnlink(zFilename); |
4647 isDelete = 0; | 5388 pNew->ctrlFlags |= UNIXFILE_DELETE; |
4648 } | 5389 } |
4649 pNew->isDelete = isDelete; | |
4650 #endif | 5390 #endif |
4651 if( rc!=SQLITE_OK ){ | 5391 if( rc!=SQLITE_OK ){ |
4652 if( h>=0 ) robust_close(pNew, h, __LINE__); | 5392 if( h>=0 ) robust_close(pNew, h, __LINE__); |
4653 }else{ | 5393 }else{ |
4654 pNew->pMethod = pLockingStyle; | 5394 pNew->pMethod = pLockingStyle; |
4655 OpenCounter(+1); | 5395 OpenCounter(+1); |
| 5396 verifyDbFile(pNew); |
4656 } | 5397 } |
4657 return rc; | 5398 return rc; |
4658 } | 5399 } |
4659 | 5400 |
4660 /* | 5401 /* |
4661 ** Return the name of a directory in which to put temporary files. | 5402 ** Return the name of a directory in which to put temporary files. |
4662 ** If no suitable temporary file directory can be found, return NULL. | 5403 ** If no suitable temporary file directory can be found, return NULL. |
4663 */ | 5404 */ |
4664 static const char *unixTempFileDir(void){ | 5405 static const char *unixTempFileDir(void){ |
4665 static const char *azDirs[] = { | 5406 static const char *azDirs[] = { |
4666 0, | 5407 0, |
4667 0, | 5408 0, |
| 5409 0, |
4668 "/var/tmp", | 5410 "/var/tmp", |
4669 "/usr/tmp", | 5411 "/usr/tmp", |
4670 "/tmp", | 5412 "/tmp", |
4671 0 /* List terminator */ | 5413 0 /* List terminator */ |
4672 }; | 5414 }; |
4673 unsigned int i; | 5415 unsigned int i; |
4674 struct stat buf; | 5416 struct stat buf; |
4675 const char *zDir = 0; | 5417 const char *zDir = 0; |
4676 | 5418 |
4677 azDirs[0] = sqlite3_temp_directory; | 5419 azDirs[0] = sqlite3_temp_directory; |
4678 if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); | 5420 if( !azDirs[1] ) azDirs[1] = getenv("SQLITE_TMPDIR"); |
| 5421 if( !azDirs[2] ) azDirs[2] = getenv("TMPDIR"); |
4679 for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){ | 5422 for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){ |
4680 if( zDir==0 ) continue; | 5423 if( zDir==0 ) continue; |
4681 if( osStat(zDir, &buf) ) continue; | 5424 if( osStat(zDir, &buf) ) continue; |
4682 if( !S_ISDIR(buf.st_mode) ) continue; | 5425 if( !S_ISDIR(buf.st_mode) ) continue; |
4683 if( osAccess(zDir, 07) ) continue; | 5426 if( osAccess(zDir, 07) ) continue; |
4684 break; | 5427 break; |
4685 } | 5428 } |
4686 return zDir; | 5429 return zDir; |
4687 } | 5430 } |
4688 | 5431 |
(...skipping 15 matching lines...) Expand all Loading... |
4704 ** function failing. | 5447 ** function failing. |
4705 */ | 5448 */ |
4706 SimulateIOError( return SQLITE_IOERR ); | 5449 SimulateIOError( return SQLITE_IOERR ); |
4707 | 5450 |
4708 zDir = unixTempFileDir(); | 5451 zDir = unixTempFileDir(); |
4709 if( zDir==0 ) zDir = "."; | 5452 if( zDir==0 ) zDir = "."; |
4710 | 5453 |
4711 /* Check that the output buffer is large enough for the temporary file | 5454 /* Check that the output buffer is large enough for the temporary file |
4712 ** name. If it is not, return SQLITE_ERROR. | 5455 ** name. If it is not, return SQLITE_ERROR. |
4713 */ | 5456 */ |
4714 if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 17) >= (size_t)nBuf ){ | 5457 if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 18) >= (size_t)nBuf ){ |
4715 return SQLITE_ERROR; | 5458 return SQLITE_ERROR; |
4716 } | 5459 } |
4717 | 5460 |
4718 do{ | 5461 do{ |
4719 sqlite3_snprintf(nBuf-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); | 5462 sqlite3_snprintf(nBuf-18, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); |
4720 j = (int)strlen(zBuf); | 5463 j = (int)strlen(zBuf); |
4721 sqlite3_randomness(15, &zBuf[j]); | 5464 sqlite3_randomness(15, &zBuf[j]); |
4722 for(i=0; i<15; i++, j++){ | 5465 for(i=0; i<15; i++, j++){ |
4723 zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; | 5466 zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; |
4724 } | 5467 } |
4725 zBuf[j] = 0; | 5468 zBuf[j] = 0; |
| 5469 zBuf[j+1] = 0; |
4726 }while( osAccess(zBuf,0)==0 ); | 5470 }while( osAccess(zBuf,0)==0 ); |
4727 return SQLITE_OK; | 5471 return SQLITE_OK; |
4728 } | 5472 } |
4729 | 5473 |
4730 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) | 5474 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) |
4731 /* | 5475 /* |
4732 ** Routine to transform a unixFile into a proxy-locking unixFile. | 5476 ** Routine to transform a unixFile into a proxy-locking unixFile. |
4733 ** Implementation in the proxy-lock division, but used by unixOpen() | 5477 ** Implementation in the proxy-lock division, but used by unixOpen() |
4734 ** if SQLITE_PREFER_PROXY_LOCKING is defined. | 5478 ** if SQLITE_PREFER_PROXY_LOCKING is defined. |
4735 */ | 5479 */ |
(...skipping 27 matching lines...) Expand all Loading... |
4763 #if !OS_VXWORKS | 5507 #if !OS_VXWORKS |
4764 struct stat sStat; /* Results of stat() call */ | 5508 struct stat sStat; /* Results of stat() call */ |
4765 | 5509 |
4766 /* A stat() call may fail for various reasons. If this happens, it is | 5510 /* A stat() call may fail for various reasons. If this happens, it is |
4767 ** almost certain that an open() call on the same path will also fail. | 5511 ** almost certain that an open() call on the same path will also fail. |
4768 ** For this reason, if an error occurs in the stat() call here, it is | 5512 ** For this reason, if an error occurs in the stat() call here, it is |
4769 ** ignored and -1 is returned. The caller will try to open a new file | 5513 ** ignored and -1 is returned. The caller will try to open a new file |
4770 ** descriptor on the same path, fail, and return an error to SQLite. | 5514 ** descriptor on the same path, fail, and return an error to SQLite. |
4771 ** | 5515 ** |
4772 ** Even if a subsequent open() call does succeed, the consequences of | 5516 ** Even if a subsequent open() call does succeed, the consequences of |
4773 ** not searching for a resusable file descriptor are not dire. */ | 5517 ** not searching for a reusable file descriptor are not dire. */ |
4774 if( 0==osStat(zPath, &sStat) ){ | 5518 if( 0==osStat(zPath, &sStat) ){ |
4775 unixInodeInfo *pInode; | 5519 unixInodeInfo *pInode; |
4776 | 5520 |
4777 unixEnterMutex(); | 5521 unixEnterMutex(); |
4778 pInode = inodeList; | 5522 pInode = inodeList; |
4779 while( pInode && (pInode->fileId.dev!=sStat.st_dev | 5523 while( pInode && (pInode->fileId.dev!=sStat.st_dev |
4780 || pInode->fileId.ino!=sStat.st_ino) ){ | 5524 || pInode->fileId.ino!=sStat.st_ino) ){ |
4781 pInode = pInode->pNext; | 5525 pInode = pInode->pNext; |
4782 } | 5526 } |
4783 if( pInode ){ | 5527 if( pInode ){ |
(...skipping 10 matching lines...) Expand all Loading... |
4794 return pUnused; | 5538 return pUnused; |
4795 } | 5539 } |
4796 | 5540 |
4797 /* | 5541 /* |
4798 ** This function is called by unixOpen() to determine the unix permissions | 5542 ** This function is called by unixOpen() to determine the unix permissions |
4799 ** to create new files with. If no error occurs, then SQLITE_OK is returned | 5543 ** to create new files with. If no error occurs, then SQLITE_OK is returned |
4800 ** and a value suitable for passing as the third argument to open(2) is | 5544 ** and a value suitable for passing as the third argument to open(2) is |
4801 ** written to *pMode. If an IO error occurs, an SQLite error code is | 5545 ** written to *pMode. If an IO error occurs, an SQLite error code is |
4802 ** returned and the value of *pMode is not modified. | 5546 ** returned and the value of *pMode is not modified. |
4803 ** | 5547 ** |
4804 ** If the file being opened is a temporary file, it is always created with | 5548 ** In most cases, this routine sets *pMode to 0, which will become |
4805 ** the octal permissions 0600 (read/writable by owner only). If the file | 5549 ** an indication to robust_open() to create the file using |
4806 ** is a database or master journal file, it is created with the permissions | 5550 ** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask. |
4807 ** mask SQLITE_DEFAULT_FILE_PERMISSIONS. | 5551 ** But if the file being opened is a WAL or regular journal file, then |
4808 ** | |
4809 ** Finally, if the file being opened is a WAL or regular journal file, then | |
4810 ** this function queries the file-system for the permissions on the | 5552 ** this function queries the file-system for the permissions on the |
4811 ** corresponding database file and sets *pMode to this value. Whenever | 5553 ** corresponding database file and sets *pMode to this value. Whenever |
4812 ** possible, WAL and journal files are created using the same permissions | 5554 ** possible, WAL and journal files are created using the same permissions |
4813 ** as the associated database file. | 5555 ** as the associated database file. |
| 5556 ** |
| 5557 ** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the |
| 5558 ** original filename is unavailable. But 8_3_NAMES is only used for |
| 5559 ** FAT filesystems and permissions do not matter there, so just use |
| 5560 ** the default permissions. |
4814 */ | 5561 */ |
4815 static int findCreateFileMode( | 5562 static int findCreateFileMode( |
4816 const char *zPath, /* Path of file (possibly) being created */ | 5563 const char *zPath, /* Path of file (possibly) being created */ |
4817 int flags, /* Flags passed as 4th argument to xOpen() */ | 5564 int flags, /* Flags passed as 4th argument to xOpen() */ |
4818 mode_t *pMode /* OUT: Permissions to open file with */ | 5565 mode_t *pMode, /* OUT: Permissions to open file with */ |
| 5566 uid_t *pUid, /* OUT: uid to set on the file */ |
| 5567 gid_t *pGid /* OUT: gid to set on the file */ |
4819 ){ | 5568 ){ |
4820 int rc = SQLITE_OK; /* Return Code */ | 5569 int rc = SQLITE_OK; /* Return Code */ |
| 5570 *pMode = 0; |
| 5571 *pUid = 0; |
| 5572 *pGid = 0; |
4821 if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ | 5573 if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ |
4822 char zDb[MAX_PATHNAME+1]; /* Database file path */ | 5574 char zDb[MAX_PATHNAME+1]; /* Database file path */ |
4823 int nDb; /* Number of valid bytes in zDb */ | 5575 int nDb; /* Number of valid bytes in zDb */ |
4824 struct stat sStat; /* Output of stat() on database file */ | 5576 struct stat sStat; /* Output of stat() on database file */ |
4825 | 5577 |
4826 /* zPath is a path to a WAL or journal file. The following block derives | 5578 /* zPath is a path to a WAL or journal file. The following block derives |
4827 ** the path to the associated database file from zPath. This block handles | 5579 ** the path to the associated database file from zPath. This block handles |
4828 ** the following naming conventions: | 5580 ** the following naming conventions: |
4829 ** | 5581 ** |
4830 ** "<path to db>-journal" | 5582 ** "<path to db>-journal" |
4831 ** "<path to db>-wal" | 5583 ** "<path to db>-wal" |
4832 ** "<path to db>-journal-NNNN" | 5584 ** "<path to db>-journalNN" |
4833 ** "<path to db>-wal-NNNN" | 5585 ** "<path to db>-walNN" |
4834 ** | 5586 ** |
4835 ** where NNNN is a 4 digit decimal number. The NNNN naming schemes are | 5587 ** where NN is a decimal number. The NN naming schemes are |
4836 ** used by the test_multiplex.c module. | 5588 ** used by the test_multiplex.c module. |
4837 */ | 5589 */ |
4838 nDb = sqlite3Strlen30(zPath) - 1; | 5590 nDb = sqlite3Strlen30(zPath) - 1; |
4839 while( nDb>0 && zPath[nDb]!='l' ) nDb--; | 5591 #ifdef SQLITE_ENABLE_8_3_NAMES |
4840 nDb -= ((flags & SQLITE_OPEN_WAL) ? 3 : 7); | 5592 while( nDb>0 && sqlite3Isalnum(zPath[nDb]) ) nDb--; |
| 5593 if( nDb==0 || zPath[nDb]!='-' ) return SQLITE_OK; |
| 5594 #else |
| 5595 while( zPath[nDb]!='-' ){ |
| 5596 assert( nDb>0 ); |
| 5597 assert( zPath[nDb]!='\n' ); |
| 5598 nDb--; |
| 5599 } |
| 5600 #endif |
4841 memcpy(zDb, zPath, nDb); | 5601 memcpy(zDb, zPath, nDb); |
4842 zDb[nDb] = '\0'; | 5602 zDb[nDb] = '\0'; |
4843 | 5603 |
4844 if( 0==osStat(zDb, &sStat) ){ | 5604 if( 0==osStat(zDb, &sStat) ){ |
4845 *pMode = sStat.st_mode & 0777; | 5605 *pMode = sStat.st_mode & 0777; |
| 5606 *pUid = sStat.st_uid; |
| 5607 *pGid = sStat.st_gid; |
4846 }else{ | 5608 }else{ |
4847 rc = SQLITE_IOERR_FSTAT; | 5609 rc = SQLITE_IOERR_FSTAT; |
4848 } | 5610 } |
4849 }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ | 5611 }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ |
4850 *pMode = 0600; | 5612 *pMode = 0600; |
4851 }else{ | |
4852 *pMode = SQLITE_DEFAULT_FILE_PERMISSIONS; | |
4853 } | 5613 } |
4854 return rc; | 5614 return rc; |
4855 } | 5615 } |
4856 | 5616 |
4857 /* | 5617 /* |
4858 ** Initializes a unixFile structure with zeros. | |
4859 */ | |
4860 void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file) { | |
4861 memset(file, 0, sizeof(unixFile)); | |
4862 } | |
4863 | |
4864 int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, | |
4865 int fd, | |
4866 int dirfd, | |
4867 sqlite3_file* file, | |
4868 const char* fileName, | |
4869 int noLock, | |
4870 int isDelete) { | |
4871 return fillInUnixFile(vfs, fd, dirfd, file, fileName, noLock, isDelete, 0); | |
4872 } | |
4873 | |
4874 /* | |
4875 ** Search for an unused file descriptor that was opened on the database file. | |
4876 ** If a suitable file descriptor if found, then it is stored in *fd; otherwise, | |
4877 ** *fd is not modified. | |
4878 ** | |
4879 ** If a reusable file descriptor is not found, and a new UnixUnusedFd cannot | |
4880 ** be allocated, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK is returned. | |
4881 */ | |
4882 int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, | |
4883 const char* fileName, | |
4884 int flags, | |
4885 int* fd) { | |
4886 unixFile* unixSQLite3File = (unixFile*)file; | |
4887 int fileType = flags & 0xFFFFFF00; | |
4888 if (fileType == SQLITE_OPEN_MAIN_DB) { | |
4889 UnixUnusedFd *unusedFd = findReusableFd(fileName, flags); | |
4890 if (unusedFd) { | |
4891 *fd = unusedFd->fd; | |
4892 } else { | |
4893 unusedFd = sqlite3_malloc(sizeof(*unusedFd)); | |
4894 if (!unusedFd) { | |
4895 return SQLITE_NOMEM; | |
4896 } | |
4897 } | |
4898 unixSQLite3File->pUnused = unusedFd; | |
4899 } | |
4900 return SQLITE_OK; | |
4901 } | |
4902 | |
4903 /* | |
4904 ** Marks 'fd' as the unused file descriptor for 'pFile'. | |
4905 */ | |
4906 void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, | |
4907 int fd, | |
4908 int flags) { | |
4909 unixFile* unixSQLite3File = (unixFile*)file; | |
4910 if (unixSQLite3File->pUnused) { | |
4911 unixSQLite3File->pUnused->fd = fd; | |
4912 unixSQLite3File->pUnused->flags = flags; | |
4913 } | |
4914 } | |
4915 | |
4916 /* | |
4917 ** Destroys pFile's field that keeps track of the unused file descriptor. | |
4918 */ | |
4919 void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file) { | |
4920 unixFile* unixSQLite3File = (unixFile*)file; | |
4921 sqlite3_free(unixSQLite3File->pUnused); | |
4922 } | |
4923 | |
4924 /* | |
4925 ** Open the file zPath. | 5618 ** Open the file zPath. |
4926 ** | 5619 ** |
4927 ** Previously, the SQLite OS layer used three functions in place of this | 5620 ** Previously, the SQLite OS layer used three functions in place of this |
4928 ** one: | 5621 ** one: |
4929 ** | 5622 ** |
4930 ** sqlite3OsOpenReadWrite(); | 5623 ** sqlite3OsOpenReadWrite(); |
4931 ** sqlite3OsOpenReadOnly(); | 5624 ** sqlite3OsOpenReadOnly(); |
4932 ** sqlite3OsOpenExclusive(); | 5625 ** sqlite3OsOpenExclusive(); |
4933 ** | 5626 ** |
4934 ** These calls correspond to the following combinations of flags: | 5627 ** These calls correspond to the following combinations of flags: |
(...skipping 14 matching lines...) Expand all Loading... |
4949 sqlite3_file *pFile, /* The file descriptor to be filled in */ | 5642 sqlite3_file *pFile, /* The file descriptor to be filled in */ |
4950 int flags, /* Input flags to control the opening */ | 5643 int flags, /* Input flags to control the opening */ |
4951 int *pOutFlags /* Output flags returned to SQLite core */ | 5644 int *pOutFlags /* Output flags returned to SQLite core */ |
4952 ){ | 5645 ){ |
4953 unixFile *p = (unixFile *)pFile; | 5646 unixFile *p = (unixFile *)pFile; |
4954 int fd = -1; /* File descriptor returned by open() */ | 5647 int fd = -1; /* File descriptor returned by open() */ |
4955 int openFlags = 0; /* Flags to pass to open() */ | 5648 int openFlags = 0; /* Flags to pass to open() */ |
4956 int eType = flags&0xFFFFFF00; /* Type of file to open */ | 5649 int eType = flags&0xFFFFFF00; /* Type of file to open */ |
4957 int noLock; /* True to omit locking primitives */ | 5650 int noLock; /* True to omit locking primitives */ |
4958 int rc = SQLITE_OK; /* Function Return Code */ | 5651 int rc = SQLITE_OK; /* Function Return Code */ |
| 5652 int ctrlFlags = 0; /* UNIXFILE_* flags */ |
4959 | 5653 |
4960 int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); | 5654 int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); |
4961 int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); | 5655 int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); |
4962 int isCreate = (flags & SQLITE_OPEN_CREATE); | 5656 int isCreate = (flags & SQLITE_OPEN_CREATE); |
4963 int isReadonly = (flags & SQLITE_OPEN_READONLY); | 5657 int isReadonly = (flags & SQLITE_OPEN_READONLY); |
4964 int isReadWrite = (flags & SQLITE_OPEN_READWRITE); | 5658 int isReadWrite = (flags & SQLITE_OPEN_READWRITE); |
4965 #if SQLITE_ENABLE_LOCKING_STYLE | 5659 #if SQLITE_ENABLE_LOCKING_STYLE |
4966 int isAutoProxy = (flags & SQLITE_OPEN_AUTOPROXY); | 5660 int isAutoProxy = (flags & SQLITE_OPEN_AUTOPROXY); |
4967 #endif | 5661 #endif |
| 5662 #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE |
| 5663 struct statfs fsInfo; |
| 5664 #endif |
4968 | 5665 |
4969 /* If creating a master or main-file journal, this function will open | 5666 /* If creating a master or main-file journal, this function will open |
4970 ** a file-descriptor on the directory too. The first time unixSync() | 5667 ** a file-descriptor on the directory too. The first time unixSync() |
4971 ** is called the directory file descriptor will be fsync()ed and close()d. | 5668 ** is called the directory file descriptor will be fsync()ed and close()d. |
4972 */ | 5669 */ |
4973 int syncDir = (isCreate && ( | 5670 int syncDir = (isCreate && ( |
4974 eType==SQLITE_OPEN_MASTER_JOURNAL | 5671 eType==SQLITE_OPEN_MASTER_JOURNAL |
4975 || eType==SQLITE_OPEN_MAIN_JOURNAL | 5672 || eType==SQLITE_OPEN_MAIN_JOURNAL |
4976 || eType==SQLITE_OPEN_WAL | 5673 || eType==SQLITE_OPEN_WAL |
4977 )); | 5674 )); |
4978 | 5675 |
4979 /* If argument zPath is a NULL pointer, this function is required to open | 5676 /* If argument zPath is a NULL pointer, this function is required to open |
4980 ** a temporary file. Use this buffer to store the file name in. | 5677 ** a temporary file. Use this buffer to store the file name in. |
4981 */ | 5678 */ |
4982 char zTmpname[MAX_PATHNAME+1]; | 5679 char zTmpname[MAX_PATHNAME+2]; |
4983 const char *zName = zPath; | 5680 const char *zName = zPath; |
4984 | 5681 |
4985 /* Check the following statements are true: | 5682 /* Check the following statements are true: |
4986 ** | 5683 ** |
4987 ** (a) Exactly one of the READWRITE and READONLY flags must be set, and | 5684 ** (a) Exactly one of the READWRITE and READONLY flags must be set, and |
4988 ** (b) if CREATE is set, then READWRITE must also be set, and | 5685 ** (b) if CREATE is set, then READWRITE must also be set, and |
4989 ** (c) if EXCLUSIVE is set, then CREATE must also be set. | 5686 ** (c) if EXCLUSIVE is set, then CREATE must also be set. |
4990 ** (d) if DELETEONCLOSE is set, then CREATE must also be set. | 5687 ** (d) if DELETEONCLOSE is set, then CREATE must also be set. |
4991 */ | 5688 */ |
4992 assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); | 5689 assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); |
4993 assert(isCreate==0 || isReadWrite); | 5690 assert(isCreate==0 || isReadWrite); |
4994 assert(isExclusive==0 || isCreate); | 5691 assert(isExclusive==0 || isCreate); |
4995 assert(isDelete==0 || isCreate); | 5692 assert(isDelete==0 || isCreate); |
4996 | 5693 |
4997 /* The main DB, main journal, WAL file and master journal are never | 5694 /* The main DB, main journal, WAL file and master journal are never |
4998 ** automatically deleted. Nor are they ever temporary files. */ | 5695 ** automatically deleted. Nor are they ever temporary files. */ |
4999 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); | 5696 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); |
5000 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); | 5697 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); |
5001 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL ); | 5698 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL ); |
5002 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); | 5699 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); |
5003 | 5700 |
5004 /* Assert that the upper layer has set one of the "file-type" flags. */ | 5701 /* Assert that the upper layer has set one of the "file-type" flags. */ |
5005 assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB | 5702 assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB |
5006 || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL | 5703 || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL |
5007 || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL | 5704 || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL |
5008 || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL | 5705 || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL |
5009 ); | 5706 ); |
5010 | 5707 |
5011 chromium_sqlite3_initialize_unix_sqlite3_file(pFile); | 5708 /* Detect a pid change and reset the PRNG. There is a race condition |
| 5709 ** here such that two or more threads all trying to open databases at |
| 5710 ** the same instant might all reset the PRNG. But multiple resets |
| 5711 ** are harmless. |
| 5712 */ |
| 5713 if( randomnessPid!=getpid() ){ |
| 5714 randomnessPid = getpid(); |
| 5715 sqlite3_randomness(0,0); |
| 5716 } |
| 5717 |
| 5718 memset(p, 0, sizeof(unixFile)); |
5012 | 5719 |
5013 if( eType==SQLITE_OPEN_MAIN_DB ){ | 5720 if( eType==SQLITE_OPEN_MAIN_DB ){ |
5014 rc = chromium_sqlite3_get_reusable_file_handle(pFile, zName, flags, &fd); | 5721 UnixUnusedFd *pUnused; |
5015 if( rc!=SQLITE_OK ){ | 5722 pUnused = findReusableFd(zName, flags); |
5016 return rc; | 5723 if( pUnused ){ |
| 5724 fd = pUnused->fd; |
| 5725 }else{ |
| 5726 pUnused = sqlite3_malloc(sizeof(*pUnused)); |
| 5727 if( !pUnused ){ |
| 5728 return SQLITE_NOMEM; |
| 5729 } |
5017 } | 5730 } |
| 5731 p->pUnused = pUnused; |
| 5732 |
| 5733 /* Database filenames are double-zero terminated if they are not |
| 5734 ** URIs with parameters. Hence, they can always be passed into |
| 5735 ** sqlite3_uri_parameter(). */ |
| 5736 assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 ); |
| 5737 |
5018 }else if( !zName ){ | 5738 }else if( !zName ){ |
5019 /* If zName is NULL, the upper layer is requesting a temp file. */ | 5739 /* If zName is NULL, the upper layer is requesting a temp file. */ |
5020 assert(isDelete && !syncDir); | 5740 assert(isDelete && !syncDir); |
5021 rc = unixGetTempname(MAX_PATHNAME+1, zTmpname); | 5741 rc = unixGetTempname(MAX_PATHNAME+2, zTmpname); |
5022 if( rc!=SQLITE_OK ){ | 5742 if( rc!=SQLITE_OK ){ |
5023 return rc; | 5743 return rc; |
5024 } | 5744 } |
5025 zName = zTmpname; | 5745 zName = zTmpname; |
| 5746 |
| 5747 /* Generated temporary filenames are always double-zero terminated |
| 5748 ** for use by sqlite3_uri_parameter(). */ |
| 5749 assert( zName[strlen(zName)+1]==0 ); |
5026 } | 5750 } |
5027 | 5751 |
5028 /* Determine the value of the flags parameter passed to POSIX function | 5752 /* Determine the value of the flags parameter passed to POSIX function |
5029 ** open(). These must be calculated even if open() is not called, as | 5753 ** open(). These must be calculated even if open() is not called, as |
5030 ** they may be stored as part of the file handle and used by the | 5754 ** they may be stored as part of the file handle and used by the |
5031 ** 'conch file' locking functions later on. */ | 5755 ** 'conch file' locking functions later on. */ |
5032 if( isReadonly ) openFlags |= O_RDONLY; | 5756 if( isReadonly ) openFlags |= O_RDONLY; |
5033 if( isReadWrite ) openFlags |= O_RDWR; | 5757 if( isReadWrite ) openFlags |= O_RDWR; |
5034 if( isCreate ) openFlags |= O_CREAT; | 5758 if( isCreate ) openFlags |= O_CREAT; |
5035 if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW); | 5759 if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW); |
5036 openFlags |= (O_LARGEFILE|O_BINARY); | 5760 openFlags |= (O_LARGEFILE|O_BINARY); |
5037 | 5761 |
5038 if( fd<0 ){ | 5762 if( fd<0 ){ |
5039 mode_t openMode; /* Permissions to create file with */ | 5763 mode_t openMode; /* Permissions to create file with */ |
5040 rc = findCreateFileMode(zName, flags, &openMode); | 5764 uid_t uid; /* Userid for the file */ |
| 5765 gid_t gid; /* Groupid for the file */ |
| 5766 rc = findCreateFileMode(zName, flags, &openMode, &uid, &gid); |
5041 if( rc!=SQLITE_OK ){ | 5767 if( rc!=SQLITE_OK ){ |
5042 assert( !p->pUnused ); | 5768 assert( !p->pUnused ); |
5043 assert( eType==SQLITE_OPEN_WAL || eType==SQLITE_OPEN_MAIN_JOURNAL ); | 5769 assert( eType==SQLITE_OPEN_WAL || eType==SQLITE_OPEN_MAIN_JOURNAL ); |
5044 return rc; | 5770 return rc; |
5045 } | 5771 } |
5046 fd = robust_open(zName, openFlags, openMode); | 5772 fd = robust_open(zName, openFlags, openMode); |
5047 OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags)); | 5773 OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags)); |
5048 if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){ | 5774 if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){ |
5049 /* Failed to open the file for read/write access. Try read-only. */ | 5775 /* Failed to open the file for read/write access. Try read-only. */ |
5050 flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); | 5776 flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); |
5051 openFlags &= ~(O_RDWR|O_CREAT); | 5777 openFlags &= ~(O_RDWR|O_CREAT); |
5052 flags |= SQLITE_OPEN_READONLY; | 5778 flags |= SQLITE_OPEN_READONLY; |
5053 openFlags |= O_RDONLY; | 5779 openFlags |= O_RDONLY; |
5054 isReadonly = 1; | 5780 isReadonly = 1; |
5055 fd = robust_open(zName, openFlags, openMode); | 5781 fd = robust_open(zName, openFlags, openMode); |
5056 } | 5782 } |
5057 if( fd<0 ){ | 5783 if( fd<0 ){ |
5058 rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); | 5784 rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); |
5059 goto open_finished; | 5785 goto open_finished; |
5060 } | 5786 } |
| 5787 |
| 5788 /* If this process is running as root and if creating a new rollback |
| 5789 ** journal or WAL file, set the ownership of the journal or WAL to be |
| 5790 ** the same as the original database. |
| 5791 */ |
| 5792 if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ |
| 5793 osFchown(fd, uid, gid); |
| 5794 } |
5061 } | 5795 } |
5062 assert( fd>=0 ); | 5796 assert( fd>=0 ); |
5063 if( pOutFlags ){ | 5797 if( pOutFlags ){ |
5064 *pOutFlags = flags; | 5798 *pOutFlags = flags; |
5065 } | 5799 } |
5066 | 5800 |
5067 chromium_sqlite3_update_reusable_file_handle(pFile, fd, flags); | 5801 if( p->pUnused ){ |
| 5802 p->pUnused->fd = fd; |
| 5803 p->pUnused->flags = flags; |
| 5804 } |
5068 | 5805 |
5069 if( isDelete ){ | 5806 if( isDelete ){ |
5070 #if OS_VXWORKS | 5807 #if OS_VXWORKS |
5071 zPath = zName; | 5808 zPath = zName; |
| 5809 #elif defined(SQLITE_UNLINK_AFTER_CLOSE) |
| 5810 zPath = sqlite3_mprintf("%s", zName); |
| 5811 if( zPath==0 ){ |
| 5812 robust_close(p, fd, __LINE__); |
| 5813 return SQLITE_NOMEM; |
| 5814 } |
5072 #else | 5815 #else |
5073 osUnlink(zName); | 5816 osUnlink(zName); |
5074 #endif | 5817 #endif |
5075 } | 5818 } |
5076 #if SQLITE_ENABLE_LOCKING_STYLE | 5819 #if SQLITE_ENABLE_LOCKING_STYLE |
5077 else{ | 5820 else{ |
5078 p->openFlags = openFlags; | 5821 p->openFlags = openFlags; |
5079 } | 5822 } |
5080 #endif | 5823 #endif |
5081 | 5824 |
5082 #ifdef FD_CLOEXEC | |
5083 osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); | |
5084 #endif | |
5085 | |
5086 noLock = eType!=SQLITE_OPEN_MAIN_DB; | 5825 noLock = eType!=SQLITE_OPEN_MAIN_DB; |
5087 | 5826 |
5088 | 5827 |
5089 #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE | 5828 #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE |
5090 struct statfs fsInfo; | |
5091 if( fstatfs(fd, &fsInfo) == -1 ){ | 5829 if( fstatfs(fd, &fsInfo) == -1 ){ |
5092 ((unixFile*)pFile)->lastErrno = errno; | 5830 ((unixFile*)pFile)->lastErrno = errno; |
5093 robust_close(p, fd, __LINE__); | 5831 robust_close(p, fd, __LINE__); |
5094 return SQLITE_IOERR_ACCESS; | 5832 return SQLITE_IOERR_ACCESS; |
5095 } | 5833 } |
5096 if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { | 5834 if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { |
5097 ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; | 5835 ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; |
5098 } | 5836 } |
5099 #endif | 5837 #endif |
5100 | 5838 |
| 5839 /* Set up appropriate ctrlFlags */ |
| 5840 if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; |
| 5841 if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; |
| 5842 if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; |
| 5843 if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; |
| 5844 if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; |
| 5845 |
5101 #if SQLITE_ENABLE_LOCKING_STYLE | 5846 #if SQLITE_ENABLE_LOCKING_STYLE |
5102 #if SQLITE_PREFER_PROXY_LOCKING | 5847 #if SQLITE_PREFER_PROXY_LOCKING |
5103 isAutoProxy = 1; | 5848 isAutoProxy = 1; |
5104 #endif | 5849 #endif |
5105 if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){ | 5850 if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){ |
5106 char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); | 5851 char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); |
5107 int useProxy = 0; | 5852 int useProxy = 0; |
5108 | 5853 |
5109 /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means | 5854 /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means |
5110 ** never use proxy, NULL means use proxy for non-local files only. */ | 5855 ** never use proxy, NULL means use proxy for non-local files only. */ |
5111 if( envforce!=NULL ){ | 5856 if( envforce!=NULL ){ |
5112 useProxy = atoi(envforce)>0; | 5857 useProxy = atoi(envforce)>0; |
5113 }else{ | 5858 }else{ |
5114 struct statfs fsInfo; | |
5115 if( statfs(zPath, &fsInfo) == -1 ){ | 5859 if( statfs(zPath, &fsInfo) == -1 ){ |
5116 /* In theory, the close(fd) call is sub-optimal. If the file opened | 5860 /* In theory, the close(fd) call is sub-optimal. If the file opened |
5117 ** with fd is a database file, and there are other connections open | 5861 ** with fd is a database file, and there are other connections open |
5118 ** on that file that are currently holding advisory locks on it, | 5862 ** on that file that are currently holding advisory locks on it, |
5119 ** then the call to close() will cancel those locks. In practice, | 5863 ** then the call to close() will cancel those locks. In practice, |
5120 ** we're assuming that statfs() doesn't fail very often. At least | 5864 ** we're assuming that statfs() doesn't fail very often. At least |
5121 ** not while other file descriptors opened by the same process on | 5865 ** not while other file descriptors opened by the same process on |
5122 ** the same file are working. */ | 5866 ** the same file are working. */ |
5123 p->lastErrno = errno; | 5867 p->lastErrno = errno; |
5124 robust_close(p, fd, __LINE__); | 5868 robust_close(p, fd, __LINE__); |
5125 rc = SQLITE_IOERR_ACCESS; | 5869 rc = SQLITE_IOERR_ACCESS; |
5126 goto open_finished; | 5870 goto open_finished; |
5127 } | 5871 } |
5128 useProxy = !(fsInfo.f_flags&MNT_LOCAL); | 5872 useProxy = !(fsInfo.f_flags&MNT_LOCAL); |
5129 } | 5873 } |
5130 if( useProxy ){ | 5874 if( useProxy ){ |
5131 rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, | 5875 rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); |
5132 isDelete, isReadonly); | |
5133 if( rc==SQLITE_OK ){ | 5876 if( rc==SQLITE_OK ){ |
5134 rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); | 5877 rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); |
5135 if( rc!=SQLITE_OK ){ | 5878 if( rc!=SQLITE_OK ){ |
5136 /* Use unixClose to clean up the resources added in fillInUnixFile | 5879 /* Use unixClose to clean up the resources added in fillInUnixFile |
5137 ** and clear all the structure's references. Specifically, | 5880 ** and clear all the structure's references. Specifically, |
5138 ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op | 5881 ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op |
5139 */ | 5882 */ |
5140 unixClose(pFile); | 5883 unixClose(pFile); |
5141 return rc; | 5884 return rc; |
5142 } | 5885 } |
5143 } | 5886 } |
5144 goto open_finished; | 5887 goto open_finished; |
5145 } | 5888 } |
5146 } | 5889 } |
5147 #endif | 5890 #endif |
5148 | 5891 |
5149 rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, | 5892 rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); |
5150 isDelete, isReadonly); | 5893 |
5151 open_finished: | 5894 open_finished: |
5152 if( rc!=SQLITE_OK ){ | 5895 if( rc!=SQLITE_OK ){ |
5153 chromium_sqlite3_destroy_reusable_file_handle(pFile); | 5896 sqlite3_free(p->pUnused); |
5154 } | 5897 } |
5155 return rc; | 5898 return rc; |
5156 } | 5899 } |
5157 | 5900 |
5158 | 5901 |
5159 /* | 5902 /* |
5160 ** Delete the file at zPath. If the dirSync argument is true, fsync() | 5903 ** Delete the file at zPath. If the dirSync argument is true, fsync() |
5161 ** the directory after deleting the file. | 5904 ** the directory after deleting the file. |
5162 */ | 5905 */ |
5163 static int unixDelete( | 5906 static int unixDelete( |
5164 sqlite3_vfs *NotUsed, /* VFS containing this as the xDelete method */ | 5907 sqlite3_vfs *NotUsed, /* VFS containing this as the xDelete method */ |
5165 const char *zPath, /* Name of file to be deleted */ | 5908 const char *zPath, /* Name of file to be deleted */ |
5166 int dirSync /* If true, fsync() directory after deleting file */ | 5909 int dirSync /* If true, fsync() directory after deleting file */ |
5167 ){ | 5910 ){ |
5168 int rc = SQLITE_OK; | 5911 int rc = SQLITE_OK; |
5169 UNUSED_PARAMETER(NotUsed); | 5912 UNUSED_PARAMETER(NotUsed); |
5170 SimulateIOError(return SQLITE_IOERR_DELETE); | 5913 SimulateIOError(return SQLITE_IOERR_DELETE); |
5171 if( osUnlink(zPath)==(-1) && errno!=ENOENT ){ | 5914 if( osUnlink(zPath)==(-1) ){ |
5172 return unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); | 5915 if( errno==ENOENT |
| 5916 #if OS_VXWORKS |
| 5917 || osAccess(zPath,0)!=0 |
| 5918 #endif |
| 5919 ){ |
| 5920 rc = SQLITE_IOERR_DELETE_NOENT; |
| 5921 }else{ |
| 5922 rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); |
| 5923 } |
| 5924 return rc; |
5173 } | 5925 } |
5174 #ifndef SQLITE_DISABLE_DIRSYNC | 5926 #ifndef SQLITE_DISABLE_DIRSYNC |
5175 if( dirSync ){ | 5927 if( (dirSync & 1)!=0 ){ |
5176 int fd; | 5928 int fd; |
5177 rc = osOpenDirectory(zPath, &fd); | 5929 rc = osOpenDirectory(zPath, &fd); |
5178 if( rc==SQLITE_OK ){ | 5930 if( rc==SQLITE_OK ){ |
5179 #if OS_VXWORKS | 5931 #if OS_VXWORKS |
5180 if( fsync(fd)==-1 ) | 5932 if( fsync(fd)==-1 ) |
5181 #else | 5933 #else |
5182 if( fsync(fd) ) | 5934 if( fsync(fd) ) |
5183 #endif | 5935 #endif |
5184 { | 5936 { |
5185 rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); | 5937 rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); |
5186 } | 5938 } |
5187 robust_close(0, fd, __LINE__); | 5939 robust_close(0, fd, __LINE__); |
5188 }else if( rc==SQLITE_CANTOPEN ){ | 5940 }else if( rc==SQLITE_CANTOPEN ){ |
5189 rc = SQLITE_OK; | 5941 rc = SQLITE_OK; |
5190 } | 5942 } |
5191 } | 5943 } |
5192 #endif | 5944 #endif |
5193 return rc; | 5945 return rc; |
5194 } | 5946 } |
5195 | 5947 |
5196 /* | 5948 /* |
5197 ** Test the existance of or access permissions of file zPath. The | 5949 ** Test the existence of or access permissions of file zPath. The |
5198 ** test performed depends on the value of flags: | 5950 ** test performed depends on the value of flags: |
5199 ** | 5951 ** |
5200 ** SQLITE_ACCESS_EXISTS: Return 1 if the file exists | 5952 ** SQLITE_ACCESS_EXISTS: Return 1 if the file exists |
5201 ** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable. | 5953 ** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable. |
5202 ** SQLITE_ACCESS_READONLY: Return 1 if the file is readable. | 5954 ** SQLITE_ACCESS_READONLY: Return 1 if the file is readable. |
5203 ** | 5955 ** |
5204 ** Otherwise return 0. | 5956 ** Otherwise return 0. |
5205 */ | 5957 */ |
5206 static int unixAccess( | 5958 static int unixAccess( |
5207 sqlite3_vfs *NotUsed, /* The VFS containing this xAccess method */ | 5959 sqlite3_vfs *NotUsed, /* The VFS containing this xAccess method */ |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5353 ** uninitialized space in zBuf - but valgrind errors tend to worry | 6105 ** uninitialized space in zBuf - but valgrind errors tend to worry |
5354 ** some users. Rather than argue, it seems easier just to initialize | 6106 ** some users. Rather than argue, it seems easier just to initialize |
5355 ** the whole array and silence valgrind, even if that means less randomness | 6107 ** the whole array and silence valgrind, even if that means less randomness |
5356 ** in the random seed. | 6108 ** in the random seed. |
5357 ** | 6109 ** |
5358 ** When testing, initializing zBuf[] to zero is all we do. That means | 6110 ** When testing, initializing zBuf[] to zero is all we do. That means |
5359 ** that we always use the same random number sequence. This makes the | 6111 ** that we always use the same random number sequence. This makes the |
5360 ** tests repeatable. | 6112 ** tests repeatable. |
5361 */ | 6113 */ |
5362 memset(zBuf, 0, nBuf); | 6114 memset(zBuf, 0, nBuf); |
| 6115 randomnessPid = getpid(); |
5363 #if !defined(SQLITE_TEST) | 6116 #if !defined(SQLITE_TEST) |
5364 { | 6117 { |
5365 int pid, fd; | 6118 int fd, got; |
5366 fd = robust_open("/dev/urandom", O_RDONLY, 0); | 6119 fd = robust_open("/dev/urandom", O_RDONLY, 0); |
5367 if( fd<0 ){ | 6120 if( fd<0 ){ |
5368 time_t t; | 6121 time_t t; |
5369 time(&t); | 6122 time(&t); |
5370 memcpy(zBuf, &t, sizeof(t)); | 6123 memcpy(zBuf, &t, sizeof(t)); |
5371 pid = getpid(); | 6124 memcpy(&zBuf[sizeof(t)], &randomnessPid, sizeof(randomnessPid)); |
5372 memcpy(&zBuf[sizeof(t)], &pid, sizeof(pid)); | 6125 assert( sizeof(t)+sizeof(randomnessPid)<=(size_t)nBuf ); |
5373 assert( sizeof(t)+sizeof(pid)<=(size_t)nBuf ); | 6126 nBuf = sizeof(t) + sizeof(randomnessPid); |
5374 nBuf = sizeof(t) + sizeof(pid); | |
5375 }else{ | 6127 }else{ |
5376 do{ nBuf = osRead(fd, zBuf, nBuf); }while( nBuf<0 && errno==EINTR ); | 6128 do{ got = osRead(fd, zBuf, nBuf); }while( got<0 && errno==EINTR ); |
5377 robust_close(0, fd, __LINE__); | 6129 robust_close(0, fd, __LINE__); |
5378 } | 6130 } |
5379 } | 6131 } |
5380 #endif | 6132 #endif |
5381 return nBuf; | 6133 return nBuf; |
5382 } | 6134 } |
5383 | 6135 |
5384 | 6136 |
5385 /* | 6137 /* |
5386 ** Sleep for a little while. Return the amount of time slept. | 6138 ** Sleep for a little while. Return the amount of time slept. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5420 int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ | 6172 int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ |
5421 #endif | 6173 #endif |
5422 | 6174 |
5423 /* | 6175 /* |
5424 ** Find the current time (in Universal Coordinated Time). Write into *piNow | 6176 ** Find the current time (in Universal Coordinated Time). Write into *piNow |
5425 ** the current time and date as a Julian Day number times 86_400_000. In | 6177 ** the current time and date as a Julian Day number times 86_400_000. In |
5426 ** other words, write into *piNow the number of milliseconds since the Julian | 6178 ** other words, write into *piNow the number of milliseconds since the Julian |
5427 ** epoch of noon in Greenwich on November 24, 4714 B.C according to the | 6179 ** epoch of noon in Greenwich on November 24, 4714 B.C according to the |
5428 ** proleptic Gregorian calendar. | 6180 ** proleptic Gregorian calendar. |
5429 ** | 6181 ** |
5430 ** On success, return 0. Return 1 if the time and date cannot be found. | 6182 ** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date |
| 6183 ** cannot be found. |
5431 */ | 6184 */ |
5432 static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ | 6185 static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ |
5433 static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; | 6186 static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; |
| 6187 int rc = SQLITE_OK; |
5434 #if defined(NO_GETTOD) | 6188 #if defined(NO_GETTOD) |
5435 time_t t; | 6189 time_t t; |
5436 time(&t); | 6190 time(&t); |
5437 *piNow = ((sqlite3_int64)t)*1000 + unixEpoch; | 6191 *piNow = ((sqlite3_int64)t)*1000 + unixEpoch; |
5438 #elif OS_VXWORKS | 6192 #elif OS_VXWORKS |
5439 struct timespec sNow; | 6193 struct timespec sNow; |
5440 clock_gettime(CLOCK_REALTIME, &sNow); | 6194 clock_gettime(CLOCK_REALTIME, &sNow); |
5441 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000; | 6195 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000; |
5442 #else | 6196 #else |
5443 struct timeval sNow; | 6197 struct timeval sNow; |
5444 gettimeofday(&sNow, 0); | 6198 if( gettimeofday(&sNow, 0)==0 ){ |
5445 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000; | 6199 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000; |
| 6200 }else{ |
| 6201 rc = SQLITE_ERROR; |
| 6202 } |
5446 #endif | 6203 #endif |
5447 | 6204 |
5448 #ifdef SQLITE_TEST | 6205 #ifdef SQLITE_TEST |
5449 if( sqlite3_current_time ){ | 6206 if( sqlite3_current_time ){ |
5450 *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; | 6207 *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; |
5451 } | 6208 } |
5452 #endif | 6209 #endif |
5453 UNUSED_PARAMETER(NotUsed); | 6210 UNUSED_PARAMETER(NotUsed); |
5454 return 0; | 6211 return rc; |
5455 } | 6212 } |
5456 | 6213 |
5457 /* | 6214 /* |
5458 ** Find the current time (in Universal Coordinated Time). Write the | 6215 ** Find the current time (in Universal Coordinated Time). Write the |
5459 ** current time and date as a Julian Day number into *prNow and | 6216 ** current time and date as a Julian Day number into *prNow and |
5460 ** return 0. Return 1 if the time and date cannot be found. | 6217 ** return 0. Return 1 if the time and date cannot be found. |
5461 */ | 6218 */ |
5462 static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){ | 6219 static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){ |
5463 sqlite3_int64 i; | 6220 sqlite3_int64 i = 0; |
| 6221 int rc; |
5464 UNUSED_PARAMETER(NotUsed); | 6222 UNUSED_PARAMETER(NotUsed); |
5465 unixCurrentTimeInt64(0, &i); | 6223 rc = unixCurrentTimeInt64(0, &i); |
5466 *prNow = i/86400000.0; | 6224 *prNow = i/86400000.0; |
5467 return 0; | 6225 return rc; |
5468 } | 6226 } |
5469 | 6227 |
5470 /* | 6228 /* |
5471 ** We added the xGetLastError() method with the intention of providing | 6229 ** We added the xGetLastError() method with the intention of providing |
5472 ** better low-level error messages when operating-system problems come up | 6230 ** better low-level error messages when operating-system problems come up |
5473 ** during SQLite operation. But so far, none of that has been implemented | 6231 ** during SQLite operation. But so far, none of that has been implemented |
5474 ** in the core. So this routine is never called. For now, it is merely | 6232 ** in the core. So this routine is never called. For now, it is merely |
5475 ** a place-holder. | 6233 ** a place-holder. |
5476 */ | 6234 */ |
5477 static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ | 6235 static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ |
(...skipping 25 matching lines...) Expand all Loading... |
5503 ** database file to coordinate safe, concurrent access by multiple readers | 6261 ** database file to coordinate safe, concurrent access by multiple readers |
5504 ** and writers [http://sqlite.org/lockingv3.html]. The five file locking | 6262 ** and writers [http://sqlite.org/lockingv3.html]. The five file locking |
5505 ** states (UNLOCKED, PENDING, SHARED, RESERVED, EXCLUSIVE) are implemented | 6263 ** states (UNLOCKED, PENDING, SHARED, RESERVED, EXCLUSIVE) are implemented |
5506 ** as POSIX read & write locks over fixed set of locations (via fsctl), | 6264 ** as POSIX read & write locks over fixed set of locations (via fsctl), |
5507 ** on AFP and SMB only exclusive byte-range locks are available via fsctl | 6265 ** on AFP and SMB only exclusive byte-range locks are available via fsctl |
5508 ** with _IOWR('z', 23, struct ByteRangeLockPB2) to track the same 5 states. | 6266 ** with _IOWR('z', 23, struct ByteRangeLockPB2) to track the same 5 states. |
5509 ** To simulate a F_RDLCK on the shared range, on AFP a randomly selected | 6267 ** To simulate a F_RDLCK on the shared range, on AFP a randomly selected |
5510 ** address in the shared range is taken for a SHARED lock, the entire | 6268 ** address in the shared range is taken for a SHARED lock, the entire |
5511 ** shared range is taken for an EXCLUSIVE lock): | 6269 ** shared range is taken for an EXCLUSIVE lock): |
5512 ** | 6270 ** |
5513 ** PENDING_BYTE 0x40000000» » » | 6271 ** PENDING_BYTE 0x40000000 |
5514 ** RESERVED_BYTE 0x40000001 | 6272 ** RESERVED_BYTE 0x40000001 |
5515 ** SHARED_RANGE 0x40000002 -> 0x40000200 | 6273 ** SHARED_RANGE 0x40000002 -> 0x40000200 |
5516 ** | 6274 ** |
5517 ** This works well on the local file system, but shows a nearly 100x | 6275 ** This works well on the local file system, but shows a nearly 100x |
5518 ** slowdown in read performance on AFP because the AFP client disables | 6276 ** slowdown in read performance on AFP because the AFP client disables |
5519 ** the read cache when byte-range locks are present. Enabling the read | 6277 ** the read cache when byte-range locks are present. Enabling the read |
5520 ** cache exposes a cache coherency problem that is present on all OS X | 6278 ** cache exposes a cache coherency problem that is present on all OS X |
5521 ** supported network file systems. NFS and AFP both observe the | 6279 ** supported network file systems. NFS and AFP both observe the |
5522 ** close-to-open semantics for ensuring cache coherency | 6280 ** close-to-open semantics for ensuring cache coherency |
5523 ** [http://nfs.sourceforge.net/#faq_a8], which does not effectively | 6281 ** [http://nfs.sourceforge.net/#faq_a8], which does not effectively |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5572 ** | 6330 ** |
5573 ** * proxy file to act as a proxy for the advisory locks normally | 6331 ** * proxy file to act as a proxy for the advisory locks normally |
5574 ** taken on the database | 6332 ** taken on the database |
5575 ** | 6333 ** |
5576 ** The conch file - to use a proxy file, sqlite must first "hold the conch" | 6334 ** The conch file - to use a proxy file, sqlite must first "hold the conch" |
5577 ** by taking an sqlite-style shared lock on the conch file, reading the | 6335 ** by taking an sqlite-style shared lock on the conch file, reading the |
5578 ** contents and comparing the host's unique host ID (see below) and lock | 6336 ** contents and comparing the host's unique host ID (see below) and lock |
5579 ** proxy path against the values stored in the conch. The conch file is | 6337 ** proxy path against the values stored in the conch. The conch file is |
5580 ** stored in the same directory as the database file and the file name | 6338 ** stored in the same directory as the database file and the file name |
5581 ** is patterned after the database file name as ".<databasename>-conch". | 6339 ** is patterned after the database file name as ".<databasename>-conch". |
5582 ** If the conch file does not exist, or it's contents do not match the | 6340 ** If the conch file does not exist, or its contents do not match the |
5583 ** host ID and/or proxy path, then the lock is escalated to an exclusive | 6341 ** host ID and/or proxy path, then the lock is escalated to an exclusive |
5584 ** lock and the conch file contents is updated with the host ID and proxy | 6342 ** lock and the conch file contents is updated with the host ID and proxy |
5585 ** path and the lock is downgraded to a shared lock again. If the conch | 6343 ** path and the lock is downgraded to a shared lock again. If the conch |
5586 ** is held by another process (with a shared lock), the exclusive lock | 6344 ** is held by another process (with a shared lock), the exclusive lock |
5587 ** will fail and SQLITE_BUSY is returned. | 6345 ** will fail and SQLITE_BUSY is returned. |
5588 ** | 6346 ** |
5589 ** The proxy file - a single-byte file used for all advisory file locks | 6347 ** The proxy file - a single-byte file used for all advisory file locks |
5590 ** normally taken on the database file. This allows for safe sharing | 6348 ** normally taken on the database file. This allows for safe sharing |
5591 ** of the database file for multiple readers and writers on the same | 6349 ** of the database file for multiple readers and writers on the same |
5592 ** host (the conch ensures that they all use the same local lock file). | 6350 ** host (the conch ensures that they all use the same local lock file). |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5624 ** SQLITE_DEFAULT_PROXYDIR_PERMISSIONS | 6382 ** SQLITE_DEFAULT_PROXYDIR_PERMISSIONS |
5625 ** | 6383 ** |
5626 ** Permissions to use when creating a directory for storing the | 6384 ** Permissions to use when creating a directory for storing the |
5627 ** lock proxy files, only used when LOCKPROXYDIR is not set. | 6385 ** lock proxy files, only used when LOCKPROXYDIR is not set. |
5628 ** | 6386 ** |
5629 ** | 6387 ** |
5630 ** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING, | 6388 ** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING, |
5631 ** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will | 6389 ** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will |
5632 ** force proxy locking to be used for every database file opened, and 0 | 6390 ** force proxy locking to be used for every database file opened, and 0 |
5633 ** will force automatic proxy locking to be disabled for all database | 6391 ** will force automatic proxy locking to be disabled for all database |
5634 ** files (explicity calling the SQLITE_SET_LOCKPROXYFILE pragma or | 6392 ** files (explicitly calling the SQLITE_SET_LOCKPROXYFILE pragma or |
5635 ** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING). | 6393 ** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING). |
5636 */ | 6394 */ |
5637 | 6395 |
5638 /* | 6396 /* |
5639 ** Proxy locking is only available on MacOSX | 6397 ** Proxy locking is only available on MacOSX |
5640 */ | 6398 */ |
5641 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE | 6399 #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE |
5642 | 6400 |
5643 /* | 6401 /* |
5644 ** The proxyLockingContext has the path and file structures for the remote | 6402 ** The proxyLockingContext has the path and file structures for the remote |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5710 assert(lockPath!=NULL); | 6468 assert(lockPath!=NULL); |
5711 /* try to create all the intermediate directories */ | 6469 /* try to create all the intermediate directories */ |
5712 len = (int)strlen(lockPath); | 6470 len = (int)strlen(lockPath); |
5713 buf[0] = lockPath[0]; | 6471 buf[0] = lockPath[0]; |
5714 for( i=1; i<len; i++ ){ | 6472 for( i=1; i<len; i++ ){ |
5715 if( lockPath[i] == '/' && (i - start > 0) ){ | 6473 if( lockPath[i] == '/' && (i - start > 0) ){ |
5716 /* only mkdir if leaf dir != "." or "/" or ".." */ | 6474 /* only mkdir if leaf dir != "." or "/" or ".." */ |
5717 if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') | 6475 if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') |
5718 || (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){ | 6476 || (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){ |
5719 buf[i]='\0'; | 6477 buf[i]='\0'; |
5720 if( mkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ | 6478 if( osMkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ |
5721 int err=errno; | 6479 int err=errno; |
5722 if( err!=EEXIST ) { | 6480 if( err!=EEXIST ) { |
5723 OSTRACE(("CREATELOCKPATH FAILED creating %s, " | 6481 OSTRACE(("CREATELOCKPATH FAILED creating %s, " |
5724 "'%s' proxy lock path=%s pid=%d\n", | 6482 "'%s' proxy lock path=%s pid=%d\n", |
5725 buf, strerror(err), lockPath, getpid())); | 6483 buf, strerror(err), lockPath, getpid())); |
5726 return err; | 6484 return err; |
5727 } | 6485 } |
5728 } | 6486 } |
5729 } | 6487 } |
5730 start=i+1; | 6488 start=i+1; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5764 pUnused = findReusableFd(path, openFlags); | 6522 pUnused = findReusableFd(path, openFlags); |
5765 if( pUnused ){ | 6523 if( pUnused ){ |
5766 fd = pUnused->fd; | 6524 fd = pUnused->fd; |
5767 }else{ | 6525 }else{ |
5768 pUnused = sqlite3_malloc(sizeof(*pUnused)); | 6526 pUnused = sqlite3_malloc(sizeof(*pUnused)); |
5769 if( !pUnused ){ | 6527 if( !pUnused ){ |
5770 return SQLITE_NOMEM; | 6528 return SQLITE_NOMEM; |
5771 } | 6529 } |
5772 } | 6530 } |
5773 if( fd<0 ){ | 6531 if( fd<0 ){ |
5774 fd = robust_open(path, openFlags, SQLITE_DEFAULT_FILE_PERMISSIONS); | 6532 fd = robust_open(path, openFlags, 0); |
5775 terrno = errno; | 6533 terrno = errno; |
5776 if( fd<0 && errno==ENOENT && islockfile ){ | 6534 if( fd<0 && errno==ENOENT && islockfile ){ |
5777 if( proxyCreateLockPath(path) == SQLITE_OK ){ | 6535 if( proxyCreateLockPath(path) == SQLITE_OK ){ |
5778 fd = robust_open(path, openFlags, SQLITE_DEFAULT_FILE_PERMISSIONS); | 6536 fd = robust_open(path, openFlags, 0); |
5779 } | 6537 } |
5780 } | 6538 } |
5781 } | 6539 } |
5782 if( fd<0 ){ | 6540 if( fd<0 ){ |
5783 openFlags = O_RDONLY; | 6541 openFlags = O_RDONLY; |
5784 fd = robust_open(path, openFlags, SQLITE_DEFAULT_FILE_PERMISSIONS); | 6542 fd = robust_open(path, openFlags, 0); |
5785 terrno = errno; | 6543 terrno = errno; |
5786 } | 6544 } |
5787 if( fd<0 ){ | 6545 if( fd<0 ){ |
5788 if( islockfile ){ | 6546 if( islockfile ){ |
5789 return SQLITE_BUSY; | 6547 return SQLITE_BUSY; |
5790 } | 6548 } |
5791 switch (terrno) { | 6549 switch (terrno) { |
5792 case EACCES: | 6550 case EACCES: |
5793 return SQLITE_PERM; | 6551 return SQLITE_PERM; |
5794 case EIO: | 6552 case EIO: |
(...skipping 10 matching lines...) Expand all Loading... |
5805 } | 6563 } |
5806 memset(pNew, 0, sizeof(unixFile)); | 6564 memset(pNew, 0, sizeof(unixFile)); |
5807 pNew->openFlags = openFlags; | 6565 pNew->openFlags = openFlags; |
5808 memset(&dummyVfs, 0, sizeof(dummyVfs)); | 6566 memset(&dummyVfs, 0, sizeof(dummyVfs)); |
5809 dummyVfs.pAppData = (void*)&autolockIoFinder; | 6567 dummyVfs.pAppData = (void*)&autolockIoFinder; |
5810 dummyVfs.zName = "dummy"; | 6568 dummyVfs.zName = "dummy"; |
5811 pUnused->fd = fd; | 6569 pUnused->fd = fd; |
5812 pUnused->flags = openFlags; | 6570 pUnused->flags = openFlags; |
5813 pNew->pUnused = pUnused; | 6571 pNew->pUnused = pUnused; |
5814 | 6572 |
5815 rc = fillInUnixFile(&dummyVfs, fd, 0, (sqlite3_file*)pNew, path, 0, 0, 0); | 6573 rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); |
5816 if( rc==SQLITE_OK ){ | 6574 if( rc==SQLITE_OK ){ |
5817 *ppFile = pNew; | 6575 *ppFile = pNew; |
5818 return SQLITE_OK; | 6576 return SQLITE_OK; |
5819 } | 6577 } |
5820 end_create_proxy: | 6578 end_create_proxy: |
5821 robust_close(pNew, fd, __LINE__); | 6579 robust_close(pNew, fd, __LINE__); |
5822 sqlite3_free(pNew); | 6580 sqlite3_free(pNew); |
5823 sqlite3_free(pUnused); | 6581 sqlite3_free(pUnused); |
5824 return rc; | 6582 return rc; |
5825 } | 6583 } |
(...skipping 19 matching lines...) Expand all Loading... |
5845 { | 6603 { |
5846 static const struct timespec timeout = {1, 0}; /* 1 sec timeout */ | 6604 static const struct timespec timeout = {1, 0}; /* 1 sec timeout */ |
5847 if( gethostuuid(pHostID, &timeout) ){ | 6605 if( gethostuuid(pHostID, &timeout) ){ |
5848 int err = errno; | 6606 int err = errno; |
5849 if( pError ){ | 6607 if( pError ){ |
5850 *pError = err; | 6608 *pError = err; |
5851 } | 6609 } |
5852 return SQLITE_IOERR; | 6610 return SQLITE_IOERR; |
5853 } | 6611 } |
5854 } | 6612 } |
| 6613 #else |
| 6614 UNUSED_PARAMETER(pError); |
5855 #endif | 6615 #endif |
5856 #ifdef SQLITE_TEST | 6616 #ifdef SQLITE_TEST |
5857 /* simulate multiple hosts by creating unique hostid file paths */ | 6617 /* simulate multiple hosts by creating unique hostid file paths */ |
5858 if( sqlite3_hostid_num != 0){ | 6618 if( sqlite3_hostid_num != 0){ |
5859 pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF)); | 6619 pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF)); |
5860 } | 6620 } |
5861 #endif | 6621 #endif |
5862 | 6622 |
5863 return SQLITE_OK; | 6623 return SQLITE_OK; |
5864 } | 6624 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5896 sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); | 6656 sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); |
5897 goto end_breaklock; | 6657 goto end_breaklock; |
5898 } | 6658 } |
5899 /* read the conch content */ | 6659 /* read the conch content */ |
5900 readLen = osPread(conchFile->h, buf, PROXY_MAXCONCHLEN, 0); | 6660 readLen = osPread(conchFile->h, buf, PROXY_MAXCONCHLEN, 0); |
5901 if( readLen<PROXY_PATHINDEX ){ | 6661 if( readLen<PROXY_PATHINDEX ){ |
5902 sqlite3_snprintf(sizeof(errmsg),errmsg,"read error (len %d)",(int)readLen); | 6662 sqlite3_snprintf(sizeof(errmsg),errmsg,"read error (len %d)",(int)readLen); |
5903 goto end_breaklock; | 6663 goto end_breaklock; |
5904 } | 6664 } |
5905 /* write it out to the temporary break file */ | 6665 /* write it out to the temporary break file */ |
5906 fd = robust_open(tPath, (O_RDWR|O_CREAT|O_EXCL), | 6666 fd = robust_open(tPath, (O_RDWR|O_CREAT|O_EXCL), 0); |
5907 SQLITE_DEFAULT_FILE_PERMISSIONS); | |
5908 if( fd<0 ){ | 6667 if( fd<0 ){ |
5909 sqlite3_snprintf(sizeof(errmsg), errmsg, "create failed (%d)", errno); | 6668 sqlite3_snprintf(sizeof(errmsg), errmsg, "create failed (%d)", errno); |
5910 goto end_breaklock; | 6669 goto end_breaklock; |
5911 } | 6670 } |
5912 if( osPwrite(fd, buf, readLen, 0) != (ssize_t)readLen ){ | 6671 if( osPwrite(fd, buf, readLen, 0) != (ssize_t)readLen ){ |
5913 sqlite3_snprintf(sizeof(errmsg), errmsg, "write failed (%d)", errno); | 6672 sqlite3_snprintf(sizeof(errmsg), errmsg, "write failed (%d)", errno); |
5914 goto end_breaklock; | 6673 goto end_breaklock; |
5915 } | 6674 } |
5916 if( rename(tPath, cPath) ){ | 6675 if( rename(tPath, cPath) ){ |
5917 sqlite3_snprintf(sizeof(errmsg), errmsg, "rename failed (%d)", errno); | 6676 sqlite3_snprintf(sizeof(errmsg), errmsg, "rename failed (%d)", errno); |
(...skipping 19 matching lines...) Expand all Loading... |
5937 /* Take the requested lock on the conch file and break a stale lock if the | 6696 /* Take the requested lock on the conch file and break a stale lock if the |
5938 ** host id matches. | 6697 ** host id matches. |
5939 */ | 6698 */ |
5940 static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ | 6699 static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ |
5941 proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; | 6700 proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; |
5942 unixFile *conchFile = pCtx->conchFile; | 6701 unixFile *conchFile = pCtx->conchFile; |
5943 int rc = SQLITE_OK; | 6702 int rc = SQLITE_OK; |
5944 int nTries = 0; | 6703 int nTries = 0; |
5945 struct timespec conchModTime; | 6704 struct timespec conchModTime; |
5946 | 6705 |
| 6706 memset(&conchModTime, 0, sizeof(conchModTime)); |
5947 do { | 6707 do { |
5948 rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); | 6708 rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); |
5949 nTries ++; | 6709 nTries ++; |
5950 if( rc==SQLITE_BUSY ){ | 6710 if( rc==SQLITE_BUSY ){ |
5951 /* If the lock failed (busy): | 6711 /* If the lock failed (busy): |
5952 * 1st try: get the mod time of the conch, wait 0.5s and try again. | 6712 * 1st try: get the mod time of the conch, wait 0.5s and try again. |
5953 * 2nd try: fail if the mod time changed or host id is different, wait | 6713 * 2nd try: fail if the mod time changed or host id is different, wait |
5954 * 10 sec and try again | 6714 * 10 sec and try again |
5955 * 3rd try: break the lock unless the mod time has changed. | 6715 * 3rd try: break the lock unless the mod time has changed. |
5956 */ | 6716 */ |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6168 err, code, strerror(code)); | 6928 err, code, strerror(code)); |
6169 #endif | 6929 #endif |
6170 } | 6930 } |
6171 } | 6931 } |
6172 } | 6932 } |
6173 conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK); | 6933 conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK); |
6174 | 6934 |
6175 end_takeconch: | 6935 end_takeconch: |
6176 OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h)); | 6936 OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h)); |
6177 if( rc==SQLITE_OK && pFile->openFlags ){ | 6937 if( rc==SQLITE_OK && pFile->openFlags ){ |
| 6938 int fd; |
6178 if( pFile->h>=0 ){ | 6939 if( pFile->h>=0 ){ |
6179 robust_close(pFile, pFile->h, __LINE__); | 6940 robust_close(pFile, pFile->h, __LINE__); |
6180 } | 6941 } |
6181 pFile->h = -1; | 6942 pFile->h = -1; |
6182 int fd = robust_open(pCtx->dbPath, pFile->openFlags, | 6943 fd = robust_open(pCtx->dbPath, pFile->openFlags, 0); |
6183 SQLITE_DEFAULT_FILE_PERMISSIONS); | |
6184 OSTRACE(("TRANSPROXY: OPEN %d\n", fd)); | 6944 OSTRACE(("TRANSPROXY: OPEN %d\n", fd)); |
6185 if( fd>=0 ){ | 6945 if( fd>=0 ){ |
6186 pFile->h = fd; | 6946 pFile->h = fd; |
6187 }else{ | 6947 }else{ |
6188 rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called | 6948 rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called |
6189 during locking */ | 6949 during locking */ |
6190 } | 6950 } |
6191 } | 6951 } |
6192 if( rc==SQLITE_OK && !pCtx->lockProxy ){ | 6952 if( rc==SQLITE_OK && !pCtx->lockProxy ){ |
6193 char *path = tempLockPath ? tempLockPath : pCtx->lockProxyPath; | 6953 char *path = tempLockPath ? tempLockPath : pCtx->lockProxyPath; |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6742 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) | 7502 #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) |
6743 UNIXVFS("unix-afp", afpIoFinder ), | 7503 UNIXVFS("unix-afp", afpIoFinder ), |
6744 UNIXVFS("unix-nfs", nfsIoFinder ), | 7504 UNIXVFS("unix-nfs", nfsIoFinder ), |
6745 UNIXVFS("unix-proxy", proxyIoFinder ), | 7505 UNIXVFS("unix-proxy", proxyIoFinder ), |
6746 #endif | 7506 #endif |
6747 }; | 7507 }; |
6748 unsigned int i; /* Loop counter */ | 7508 unsigned int i; /* Loop counter */ |
6749 | 7509 |
6750 /* Double-check that the aSyscall[] array has been constructed | 7510 /* Double-check that the aSyscall[] array has been constructed |
6751 ** correctly. See ticket [bb3a86e890c8e96ab] */ | 7511 ** correctly. See ticket [bb3a86e890c8e96ab] */ |
6752 assert( ArraySize(aSyscall)==18 ); | 7512 assert( ArraySize(aSyscall)==25 ); |
6753 | 7513 |
6754 /* Register all VFSes defined in the aVfs[] array */ | 7514 /* Register all VFSes defined in the aVfs[] array */ |
6755 for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ | 7515 for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ |
6756 sqlite3_vfs_register(&aVfs[i], i==0); | 7516 sqlite3_vfs_register(&aVfs[i], i==0); |
6757 } | 7517 } |
6758 return SQLITE_OK; | 7518 return SQLITE_OK; |
6759 } | 7519 } |
6760 | 7520 |
6761 /* | 7521 /* |
6762 ** Shutdown the operating system interface. | 7522 ** Shutdown the operating system interface. |
6763 ** | 7523 ** |
6764 ** Some operating systems might need to do some cleanup in this routine, | 7524 ** Some operating systems might need to do some cleanup in this routine, |
6765 ** to release dynamically allocated objects. But not on unix. | 7525 ** to release dynamically allocated objects. But not on unix. |
6766 ** This routine is a no-op for unix. | 7526 ** This routine is a no-op for unix. |
6767 */ | 7527 */ |
6768 int sqlite3_os_end(void){ | 7528 int sqlite3_os_end(void){ |
6769 return SQLITE_OK; | 7529 return SQLITE_OK; |
6770 } | 7530 } |
6771 | 7531 |
6772 #endif /* SQLITE_OS_UNIX */ | 7532 #endif /* SQLITE_OS_UNIX */ |
OLD | NEW |