]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Try to better detect when the library is compiled for large file support (LFS)
authordrh <drh@noemail.net>
Sat, 9 Nov 2002 00:33:15 +0000 (00:33 +0000)
committerdrh <drh@noemail.net>
Sat, 9 Nov 2002 00:33:15 +0000 (00:33 +0000)
but the support is not available in the host OS kernel. (CVS 782)

FossilOrigin-Name: a29d60ecc5ee3f535142a81f56eecbef7875ef22

manifest
manifest.uuid
src/main.c
src/os.c
src/os.h
src/pager.c
src/sqlite.h.in
src/test2.c

index b75b4fdebd57b11ca7b1551c0a3139f731b0d424..550ac32afc8c0bab354555efb708996013153a4a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\slarge\sfile\ssupport\sto\sWindows.\s\sChange\slarge\sfile\ssupport\sfor\sUnix\sso\nthat\sit\scompiles\sautomatically\s-\swithout\srequiring\sspecial\soptions\son\sthe\ncompiler\scommand\sline.\s(CVS\s781)
-D 2002-11-06T14:08:11
+C Try\sto\sbetter\sdetect\swhen\sthe\slibrary\sis\scompiled\sfor\slarge\sfile\ssupport\s(LFS)\nbut\sthe\ssupport\sis\snot\savailable\sin\sthe\shost\sOS\skernel.\s(CVS\s782)
+D 2002-11-09T00:33:16
 F Makefile.in d6c9a85c2a5e696843201d090dcf8bf2f8716f2a
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -28,11 +28,11 @@ F src/func.c 90c583f0b91220f7cd411a2407deaf9327245d63
 F src/hash.c 6a6236b89c8c060c65dabd300a1c8ce7c10edb72
 F src/hash.h cd0433998bc1a3759d244e1637fe5a3c13b53bf8
 F src/insert.c 764300a0bd8074a2174946c0bf8a550bd833397a
-F src/main.c b95d7eeec90f86d05b6a064d07db34b7279e06d4
+F src/main.c f04f93b8928d6d85976e5137fea146a46de1fd6e
 F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
-F src/os.c ebe65e9a1c88535e367aaaae25ef087c1486b08d
-F src/os.h deac8efeac7767de931122c536ca253fdb70f2f8
-F src/pager.c 7d581b201d7284fa9dafde92cd5b737e3733c984
+F src/os.c caf5a34b35a2d99a58457517261c879ac29b0a05
+F src/os.h 1caaea972d1c0401cfe6300aba51fb0f6fe435c9
+F src/pager.c 292853d08658df23f1044fba1a793a210475964e
 F src/pager.h 6991c9c2dc5e4c7f2df4d4ba47d1c6458f763a32
 F src/parse.y 469c9636ff713e63c00234662209f11668671ae9
 F src/printf.c 5c50fc1da75c8f5bf432b1ad17d91d6653acd167
@@ -40,12 +40,12 @@ F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
 F src/select.c ce82596a2eaaf418edba45b2426f41065e49578b
 F src/shell.c 9e9a6eb6bca07f01e6472a603f908a0127ea50ff
 F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
-F src/sqlite.h.in d3999a9c6374675779058d6cfe5431131618e92b
+F src/sqlite.h.in 98b1574b2362abe02c4a4c73b9dbf99bcd713ab3
 F src/sqliteInt.h a001c52dfb10ec38f18d6b9ed7dd8b3f42ca8c72
 F src/table.c eed2098c9b577aa17f8abe89313a9c4413f57d63
 F src/tclsqlite.c 9f2c00a92338c51171ded8943bd42d77f7e69e64
 F src/test1.c a46e9f61915b32787c5d5a05a4b92e4dacc437d9
-F src/test2.c 5fa694d130b3309e3f9c852f0a437750fcb5a006
+F src/test2.c 8f7d88895a49b3eed111469f2ab1071cb780ed12
 F src/test3.c 540fa7fc3cb3732517b779b5f90ad9cc4303d0ab
 F src/threadtest.c d641a5219e718e18a1a80a50eb9bb549f451f42e
 F src/tokenize.c 75e3bb37305b64e118e709752066f494c4f93c30
@@ -149,7 +149,7 @@ F www/speed.tcl a20a792738475b68756ea7a19321600f23d1d803
 F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P 81bb1aed5e9094a9655bd03614bb111d79896928
-R 2170efe21354495bba0abb7d147e0a86
+P 2008b56fe11e49d52e28f47d14ccd70504e6c094
+R 4ac4711a79ff9ee10d8741795898da69
 U drh
-Z 7e2f109564ef517cfa10eb3df7a02ba0
+Z c8abc0129b7b7c57014c7437e465381e
index ce55e79ba418b675129e1bcd7d97228e0572fb05..7e4e87e11330c2b68fb7368b5e116b6e74e91ffc 100644 (file)
@@ -1 +1 @@
-2008b56fe11e49d52e28f47d14ccd70504e6c094
\ No newline at end of file
+a29d60ecc5ee3f535142a81f56eecbef7875ef22
\ No newline at end of file
index 03bd7340679377b92cb17f6581d2302385efce07..2e156352e24466638be9cf868f7d020295e0845c 100644 (file)
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.103 2002/11/01 01:55:37 drh Exp $
+** $Id: main.c,v 1.104 2002/11/09 00:33:16 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -688,6 +688,7 @@ const char *sqlite_error_string(int rc){
     case SQLITE_CONSTRAINT: z = "constraint failed";                     break;
     case SQLITE_MISMATCH:   z = "datatype mismatch";                     break;
     case SQLITE_MISUSE:     z = "library routine called out of sequence";break;
+    case SQLITE_NOLFS:      z = "kernel lacks large file support";       break;
     default:                z = "unknown error";                         break;
   }
   return z;
index 7d8626426700a7748f39679063f77eaa12b3a5b5..a2a7e5384b0d49c482d8e26aab10b04eb3fde281 100644 (file)
--- a/src/os.c
+++ b/src/os.c
 
 #if OS_UNIX
 # include <time.h>
+# include <errno.h>
 # ifndef O_LARGEFILE
 #  define O_LARGEFILE 0
 # endif
+# ifdef SQLITE_DISABLE_LFS
+#  undef O_LARGEFILE
+#  define O_LARGEFILE 0
+# endif
 # ifndef O_NOFOLLOW
 #  define O_NOFOLLOW 0
 # endif
@@ -674,7 +679,9 @@ int isNT(void){
 ** If the file was write locked, then this reduces the lock to a read.
 ** If the file was read locked, then this acquires a new read lock.
 **
-** Return SQLITE_OK on success and SQLITE_BUSY on failure.
+** Return SQLITE_OK on success and SQLITE_BUSY on failure.  If this
+** library was compiled with large file support (LFS) but LFS is not
+** available on the host, then an SQLITE_NOLFS is returned.
 */
 int sqliteOsReadLock(OsFile *id){
 #if OS_UNIX
@@ -688,11 +695,13 @@ int sqliteOsReadLock(OsFile *id){
     rc = SQLITE_OK;
   }else if( id->locked || id->pLock->cnt==0 ){
     struct flock lock;
+    int s;
     lock.l_type = F_RDLCK;
     lock.l_whence = SEEK_SET;
     lock.l_start = lock.l_len = 0L;
-    if( fcntl(id->fd, F_SETLK, &lock)!=0 ){
-      rc = SQLITE_BUSY;
+    s = fcntl(id->fd, F_SETLK, &lock);
+    if( s!=0 ){
+      rc = (s==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
     }else{
       rc = SQLITE_OK;
       id->pLock->cnt = 1;
@@ -734,7 +743,9 @@ int sqliteOsReadLock(OsFile *id){
 
 /*
 ** Change the lock status to be an exclusive or write lock.  Return
-** SQLITE_OK on success and SQLITE_BUSY on a failure.
+** SQLITE_OK on success and SQLITE_BUSY on a failure.  If this
+** library was compiled with large file support (LFS) but LFS is not
+** available on the host, then an SQLITE_NOLFS is returned.
 */
 int sqliteOsWriteLock(OsFile *id){
 #if OS_UNIX
@@ -742,11 +753,13 @@ int sqliteOsWriteLock(OsFile *id){
   sqliteOsEnterMutex();
   if( id->pLock->cnt==0 || (id->pLock->cnt==1 && id->locked==1) ){
     struct flock lock;
+    int s;
     lock.l_type = F_WRLCK;
     lock.l_whence = SEEK_SET;
     lock.l_start = lock.l_len = 0L;
-    if( fcntl(id->fd, F_SETLK, &lock)!=0 ){
-      rc = SQLITE_BUSY;
+    s = fcntl(id->fd, F_SETLK, &lock);
+    if( s!=0 ){
+      rc = (s==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
     }else{
       rc = SQLITE_OK;
       id->pLock->cnt = -1;
@@ -791,7 +804,9 @@ int sqliteOsWriteLock(OsFile *id){
 
 /*
 ** Unlock the given file descriptor.  If the file descriptor was
-** not previously locked, then this routine is a no-op.
+** not previously locked, then this routine is a no-op.  If this
+** library was compiled with large file support (LFS) but LFS is not
+** available on the host, then an SQLITE_NOLFS is returned.
 */
 int sqliteOsUnlock(OsFile *id){
 #if OS_UNIX
@@ -804,11 +819,13 @@ int sqliteOsUnlock(OsFile *id){
     rc = SQLITE_OK;
   }else{
     struct flock lock;
+    int s;
     lock.l_type = F_UNLCK;
     lock.l_whence = SEEK_SET;
     lock.l_start = lock.l_len = 0L;
-    if( fcntl(id->fd, F_SETLK, &lock)!=0 ){
-      rc = SQLITE_BUSY;
+    s = fcntl(id->fd, F_SETLK, &lock);
+    if( s!=0 ){
+      rc = (s==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
     }else{
       rc = SQLITE_OK;
       id->pLock->cnt = 0;
index 44764a456d6c1c38e83dae6768f95c6cd7d547b6..4ebd798169336f6ebd1fc73db0bdd585a0ebfc36 100644 (file)
--- a/src/os.h
+++ b/src/os.h
 ** These #defines should enable >2GB file support on Posix if the
 ** underlying operating system supports it.  If the OS lacks
 ** large file support, or if the OS is windows, these should be no-ops.
+**
+** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch
+** on the compiler command line.  This is necessary if you are compiling
+** on a recent machine (ex: RedHat 7.2) but you want your code to work
+** on an older machine (ex: RedHat 6.0).  If you compile on RedHat 7.2
+** without this option, LFS is enable.  But LFS does not exist in the kernel
+** in RedHat 6.0, so the code won't work.  Hence, for maximum binary
+** portability you should omit LFS.
 */
-#define _LARGE_FILE       1
-#define _FILE_OFFSET_BITS 64
-#define _LARGEFILE_SOURCE 1
+#ifndef SQLITE_DISABLE_LFS
+# define _LARGE_FILE       1
+# define _FILE_OFFSET_BITS 64
+# define _LARGEFILE_SOURCE 1
+#endif
 
 /*
 ** Figure out if we are dealing with Unix or Windows.
index 58f4970c55702849a5b13ed4f7fa0c0942dd1e0e..aac9353fcf5dadc7a8e99f4f31d6f2c68c26bc1d 100644 (file)
@@ -18,7 +18,7 @@
 ** file simultaneously, or one process from reading the database while
 ** another is writing.
 **
-** @(#) $Id: pager.c,v 1.55 2002/11/06 14:08:11 drh Exp $
+** @(#) $Id: pager.c,v 1.56 2002/11/09 00:33:16 drh Exp $
 */
 #include "os.h"         /* Must be first to enable large file support */
 #include "sqliteInt.h"
@@ -815,6 +815,7 @@ static int syncAllPages(Pager *pPager){
 */
 int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){
   PgHdr *pPg;
+  int rc;
 
   /* Make sure we have not hit any critical errors.
   */ 
@@ -829,9 +830,10 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){
   ** on the database file.
   */
   if( pPager->nRef==0 ){
-    if( sqliteOsReadLock(&pPager->fd)!=SQLITE_OK ){
+    rc = sqliteOsReadLock(&pPager->fd);
+    if( rc!=SQLITE_OK ){
       *ppPage = 0;
-      return SQLITE_BUSY;
+      return rc;
     }
     pPager->state = SQLITE_READLOCK;
 
@@ -844,10 +846,12 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){
        */
        rc = sqliteOsWriteLock(&pPager->fd);
        if( rc!=SQLITE_OK ){
-         rc = sqliteOsUnlock(&pPager->fd);
-         assert( rc==SQLITE_OK );
+         if( sqliteOsUnlock(&pPager->fd)!=SQLITE_OK ){
+           /* This should never happen! */
+           rc = SQLITE_INTERNAL;
+         }
          *ppPage = 0;
-         return SQLITE_BUSY;
+         return rc;
        }
        pPager->state = SQLITE_WRITELOCK;
 
index 30d1a4f6c392ebd5a6224eb1c838bd5ca1f25fa9..8f9a6c83e05e7cac8d777b64aebd6df63f94883c 100644 (file)
@@ -12,7 +12,7 @@
 ** This header file defines the interface that the SQLite library
 ** presents to client programs.
 **
-** @(#) $Id: sqlite.h.in,v 1.34 2002/07/30 17:20:40 drh Exp $
+** @(#) $Id: sqlite.h.in,v 1.35 2002/11/09 00:33:17 drh Exp $
 */
 #ifndef _SQLITE_H_
 #define _SQLITE_H_
@@ -162,6 +162,7 @@ int sqlite_exec(
 #define SQLITE_CONSTRAINT  19   /* Abort due to contraint violation */
 #define SQLITE_MISMATCH    20   /* Data type mismatch */
 #define SQLITE_MISUSE      21   /* Library used incorrectly */
+#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
 
 /*
 ** Each entry in an SQLite table has a unique integer key.  (The key is
index b583d2a83458110b01b98ee33f65a704856d9846..ce98912efd4e0b599822486489d8c14adebb49cf 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test2.c,v 1.10 2002/08/31 18:53:08 drh Exp $
+** $Id: test2.c,v 1.11 2002/11/09 00:33:17 drh Exp $
 */
 #include "sqliteInt.h"
 #include "pager.h"
@@ -48,6 +48,7 @@ static char *errorName(int rc){
     case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT";  break;
     case SQLITE_MISMATCH:   zName = "SQLITE_MISMATCH";    break;
     case SQLITE_MISUSE:     zName = "SQLITE_MISUSE";      break;
+    case SQLITE_NOLFS:      zName = "SQLITE_NOLFS";       break;
     default:                zName = "SQLITE_Unknown";     break;
   }
   return zName;