1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Add the OpenReadOnly() OS method to fix a bug in the pager. (CVS 257)

FossilOrigin-Name: 82db5456c9817283d725daf4e1081d32a71466ad
This commit is contained in:
drh
2001-09-19 13:58:43 +00:00
parent 8cfbf08ffa
commit 474d3d6156
5 changed files with 49 additions and 22 deletions

View File

@@ -28,9 +28,9 @@
# define OS_WIN 0
#endif
#if OS_UNIX
# include <unistd.h>
# include <fcntl.h>
# include <sys/stat.h>
# include <unistd.h>
# include <time.h>
#endif
#if OS_WIN
@@ -183,6 +183,39 @@ int sqliteOsOpenExclusive(const char *zFilename, OsFile *pResult){
#endif
}
/*
** Attempt to open a new file for read-only access.
**
** On success, write the file handle into *pResult and return SQLITE_OK.
**
** On failure, return SQLITE_CANTOPEN.
*/
int sqliteOsOpenReadOnly(const char *zFilename, OsFile *pResult){
#if OS_UNIX
int fd = open(zFilename, O_RDONLY);
if( fd<0 ){
return SQLITE_CANTOPEN;
}
*pResult = fd;
return SQLITE_OK;
#endif
#if OS_WIN
HANDLE h = CreateFile(zFilename,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
NULL
);
if( h==INVALID_HANDLE_VALUE ){
return SQLITE_CANTOPEN;
}
*pResult = h;
return SQLITE_OK;
#endif
}
/*
** Create a temporary file name in zBuf. zBuf must be big enough to
** hold at least SQLITE_TEMPNAME_SIZE characters.
@@ -357,15 +390,10 @@ int sqliteOsLock(OsFile id, int wrlock){
#if OS_UNIX
int rc;
struct flock lock;
memset(&lock, 0, sizeof(lock));
lock.l_type = wrlock ? F_WRLCK : F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0L;
lock.l_len = 1024L;
printf("LOCK %s %d\n",wrlock?"WRITE":"READ",id);
lock.l_start = lock.l_len = 0L;
rc = fcntl(id, F_SETLK, &lock);
fcntl(id, F_GETLK, &lock);
printf("rc=%d why=%d\n",rc,lock.l_type);
return rc==0 ? SQLITE_OK : SQLITE_BUSY;
#endif
#if OS_WIN
@@ -385,9 +413,7 @@ int sqliteOsUnlock(OsFile id){
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0L;
lock.l_len = 1L;
printf("UNLOCK %d\n",id);
lock.l_start = lock.l_len = 0L;
rc = fcntl(id, F_SETLK, &lock);
return rc==0 ? SQLITE_OK : SQLITE_IOERR;
#endif