From 474d3d6156c66c3790daf47010df2a62f5f469e2 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 19 Sep 2001 13:58:43 +0000 Subject: [PATCH] Add the OpenReadOnly() OS method to fix a bug in the pager. (CVS 257) FossilOrigin-Name: 82db5456c9817283d725daf4e1081d32a71466ad --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/os.c | 46 ++++++++++++++++++++++++++++++++++++---------- src/os.h | 1 + src/pager.c | 6 +++--- 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index d48e985832..4ee6e62269 100644 --- a/manifest +++ b/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 diff --git a/manifest.uuid b/manifest.uuid index e6191b392b..34a45f0309 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -abff526d005b3b46904de091753cc79548739ad8 \ No newline at end of file +82db5456c9817283d725daf4e1081d32a71466ad \ No newline at end of file diff --git a/src/os.c b/src/os.c index 4478df8155..544598648f 100644 --- a/src/os.c +++ b/src/os.c @@ -28,9 +28,9 @@ # define OS_WIN 0 #endif #if OS_UNIX +# include # include # include -# include # include #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 diff --git a/src/os.h b/src/os.h index 196c84eabb..a1fb96e2e4 100644 --- a/src/os.h +++ b/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); diff --git a/src/pager.c b/src/pager.c index 2ed11462e7..f5b825b763 100644 --- a/src/pager.c +++ b/src/pager.c @@ -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; }