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:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
||||
C Trying\sto\sget\sthe\sOS\sabstraction\slayer\sto\swork.\s(CVS\s256)
|
||||
D 2001-09-19T13:22:39
|
||||
C Add\sthe\sOpenReadOnly()\sOS\smethod\sto\sfix\sa\sbug\sin\sthe\spager.\s(CVS\s257)
|
||||
D 2001-09-19T13:58:44
|
||||
F Makefile.in 1d9592c4aeedd3643b2e1dfa037ce5faf54805a3
|
||||
F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958
|
||||
F VERSION 3861a21803fcd9eb92a403027b0da2bb7add4de1
|
||||
@@ -16,9 +16,9 @@ F src/expr.c 343a515a4abaf60e9e26c7412aa8c43fd3eae97d
|
||||
F src/insert.c b34860ea58525754f18bde652f74161295ca2455
|
||||
F src/main.c 5e5794eea3316dd3a63c112ccdcc997b9118f345
|
||||
F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c
|
||||
F src/os.c 6ed6f61915807b1b4578398b4e797e55b12db4ab
|
||||
F src/os.h 2528414d4d441e86cf458b7520ed7f629d446d70
|
||||
F src/pager.c 28c8a641601b81a11454de3015d3d796e31ea182
|
||||
F src/os.c 43735db052288f8bfee56e09dfa293c202ff93a3
|
||||
F src/os.h 6d627d8629a204c474cf13aa098654658378a81f
|
||||
F src/pager.c a77c7fd3f33c0c6834a042b9b0d4a8128553532e
|
||||
F src/pager.h a0d4c5ae271914aa07b62aee0707997d6932b6ca
|
||||
F src/parse.y 2bcf47bb8e6afd8bc10aebd555fa07b73905bee4
|
||||
F src/printf.c b1e22a47be8cdf707815647239991e08e8cb69f9
|
||||
@@ -96,7 +96,7 @@ F www/opcode.tcl cb3a1abf8b7b9be9f3a228d097d6bf8b742c2b6f
|
||||
F www/sqlite.tcl cb0d23d8f061a80543928755ec7775da6e4f362f
|
||||
F www/tclsqlite.tcl 06f81c401f79a04f2c5ebfb97e7c176225c0aef2
|
||||
F www/vdbe.tcl 0c8aaa529dd216ccbf7daaabd80985e413d5f9ad
|
||||
P 22132ce18cad31482cdb9b380cedc3f53bc532b8
|
||||
R f2b9b288263979b8bf39b2aa8c086069
|
||||
P abff526d005b3b46904de091753cc79548739ad8
|
||||
R 4864863de07f710a3f6b561c261f5e5d
|
||||
U drh
|
||||
Z a1f7206e19ddb2d1a7062a107b29fcdc
|
||||
Z e4c492c8b9528b70a7181a2203d31493
|
||||
|
@@ -1 +1 @@
|
||||
abff526d005b3b46904de091753cc79548739ad8
|
||||
82db5456c9817283d725daf4e1081d32a71466ad
|
46
src/os.c
46
src/os.c
@@ -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
|
||||
|
1
src/os.h
1
src/os.h
@@ -40,6 +40,7 @@ int sqliteOsDelete(const char*);
|
||||
int sqliteOsFileExists(const char*);
|
||||
int sqliteOsOpenReadWrite(const char*, OsFile*, int*);
|
||||
int sqliteOsOpenExclusive(const char*, OsFile*);
|
||||
int sqliteOsOpenReadOnly(const char*, OsFile*);
|
||||
int sqliteOsTempFileName(char*);
|
||||
int sqliteOsClose(OsFile);
|
||||
int sqliteOsRead(OsFile, void*, int amt);
|
||||
|
@@ -18,7 +18,7 @@
|
||||
** file simultaneously, or one process from reading the database while
|
||||
** another is writing.
|
||||
**
|
||||
** @(#) $Id: pager.c,v 1.22 2001/09/19 13:22:40 drh Exp $
|
||||
** @(#) $Id: pager.c,v 1.23 2001/09/19 13:58:44 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
#include "pager.h"
|
||||
@@ -636,12 +636,12 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){
|
||||
/* If a journal file exists, try to play it back.
|
||||
*/
|
||||
if( sqliteOsFileExists(pPager->zJournal) ){
|
||||
int rc, readOnly;
|
||||
int rc;
|
||||
|
||||
/* Open the journal for exclusive access. Return SQLITE_BUSY if
|
||||
** we cannot get exclusive access to the journal file
|
||||
*/
|
||||
rc = sqliteOsOpenReadWrite(pPager->zJournal, &pPager->jfd, &readOnly);
|
||||
rc = sqliteOsOpenReadOnly(pPager->zJournal, &pPager->jfd);
|
||||
if( rc==SQLITE_OK ){
|
||||
pPager->journalOpen = 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user