]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Save the full pathname of the database file so that journalling still works
authordrh <drh@noemail.net>
Sat, 7 Dec 2002 21:45:14 +0000 (21:45 +0000)
committerdrh <drh@noemail.net>
Sat, 7 Dec 2002 21:45:14 +0000 (21:45 +0000)
even if the user changes working directories after opening the databae.
Ticket #200. (CVS 798)

FossilOrigin-Name: 1c58b4fc032c5975dcce9b8ae844c0e516254a17

manifest
manifest.uuid
src/os.c
src/os.h
src/pager.c
test/misc1.test

index 6c666c9e49a02e0a7ee7bf977a0b4131e69fc295..26ff651622895dc9a97e7734cf3c433f5cc1c52c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbug\sin\sthe\sreverse\sscan\slogic\sthat\scomes\sup\swhen\sthe\stable\sbeing\nscanned\sis\sempty.\s\sAdd\sadditional\stests\sfor\sthe\sreverse\sscan.\s(CVS\s797)
-D 2002-12-04T22:29:28
+C Save\sthe\sfull\spathname\sof\sthe\sdatabase\sfile\sso\sthat\sjournalling\sstill\sworks\neven\sif\sthe\suser\schanges\sworking\sdirectories\safter\sopening\sthe\sdatabae.\nTicket\s#200.\s(CVS\s798)
+D 2002-12-07T21:45:14
 F Makefile.in 868c17a1ae1c07603d491274cc8f86c04acf2a1e
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -30,9 +30,9 @@ F src/hash.h cd0433998bc1a3759d244e1637fe5a3c13b53bf8
 F src/insert.c 764300a0bd8074a2174946c0bf8a550bd833397a
 F src/main.c cee05c2ba23b5e78f9671f319dbd68e2130e0f68
 F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
-F src/os.c cb829aa53e0af81336876a905ce1064f22749277
-F src/os.h b7b79563fc55c6d58b703c88ade9ab1504c48bba
-F src/pager.c 76a6e5a1d02e3ca5f5b8b22798844436349c2620
+F src/os.c 740022806209e44cab0abddfb1fee65c77702e21
+F src/os.h 09fd96b4d733aae2f3b98b2ae9ceea40b8fd780d
+F src/pager.c 0cbbde8bc4a16a6fc6b17fb7a08789391baa3d2d
 F src/pager.h 540833e8cb826b80ce2e39aa917deee5e12db626
 F src/parse.y 469c9636ff713e63c00234662209f11668671ae9
 F src/printf.c 5c50fc1da75c8f5bf432b1ad17d91d6653acd167
@@ -82,7 +82,7 @@ F test/main.test c66b564554b770ee7fdbf6a66c0cd90329bc2c85
 F test/malloc.test 7ba32a9ebd3aeed52ae4aaa6d42ca37e444536fd
 F test/memleak.test b4f59aa44488793b00feff2011d77d0f05b22468
 F test/minmax.test 29bc5727c3e4c792d5c4745833dd4b505905819e
-F test/misc1.test 3c4672069c430d0f21c23385e78ea4e063183aa5
+F test/misc1.test 828ea289e37d396432064ab23d2efc6ce660a0f9
 F test/misuse.test a3aa2b18a97e4c409a1fcaff5151a4dd804a0162
 F test/notnull.test b1f3e42fc475b0b5827b27b2e9b562081995ff30
 F test/null.test 5c2b57307e4b6178aae825eb65ddbee01e76b0fd
@@ -152,7 +152,7 @@ F www/speed.tcl a20a792738475b68756ea7a19321600f23d1d803
 F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P bfb9a2aa939ecffc5dc2c7c23bddd57d357bdf13
-R e8e5bb54da6e21aac3b570ab92f52726
+P 0051c87d5e8d07fae09da2eb7b0d8cbd1bbd3c8e
+R 1755863d930db2fe172862e1ab561a27
 U drh
-Z ef156328459f096ede699892581cbeef
+Z 6749b35c841c31daf6e1b7e300d04efa
index 1723f4a045da1aa3a6c012f411de34a2bae80759..3f3be6aa37160edf20fb4524d02a583815945034 100644 (file)
@@ -1 +1 @@
-0051c87d5e8d07fae09da2eb7b0d8cbd1bbd3c8e
\ No newline at end of file
+1c58b4fc032c5975dcce9b8ae844c0e516254a17
\ No newline at end of file
index 345f882d89c3151f5f3b54c701fb8a839bdc7ce9..ab0b75038bbf132b63f7e39cc7af468e48aab550 100644 (file)
--- a/src/os.c
+++ b/src/os.c
@@ -20,6 +20,7 @@
 #if OS_UNIX
 # include <time.h>
 # include <errno.h>
+# include <unistd.h>
 # ifndef O_LARGEFILE
 #  define O_LARGEFILE 0
 # endif
@@ -970,3 +971,32 @@ void sqliteOsLeaveMutex(){
   LeaveCriticalSection(&cs);
 #endif
 }
+
+/*
+** Turn a relative pathname into a full pathname.  Return a pointer
+** to the full pathname stored in space obtained from sqliteMalloc().
+** The calling function is responsible for freeing this space once it
+** is no longer needed.
+*/
+char *sqliteOsFullPathname(const char *zRelative){
+#if OS_UNIX
+  char *zFull = 0;
+  if( zRelative[0]=='/' ){
+    sqliteSetString(&zFull, zRelative, 0);
+  }else{
+    char zBuf[5000];
+    sqliteSetString(&zFull, getcwd(zBuf, sizeof(zBuf)), "/", zRelative, 0);
+  }
+  return zFull;
+#endif
+#if OS_WIN
+  char *zNotUsed;
+  char *zFull;
+  int nByte;
+  nByte = GetFullPathName(zRelative, 0, 0, &zNotUsed);
+  zFull = sqliteMalloc( nByte );
+  if( zFull==0 ) return 0;
+  GetFullPathName(zRelative, nByte, zFull, &zNotUsed);
+  return zFull;
+#endif
+}
index 290cb2310144c973fd2ebd6f2b0150176ebc7bad..a42e42758b37db1c495f7e2a5a787755baaa2688 100644 (file)
--- a/src/os.h
+++ b/src/os.h
@@ -115,6 +115,7 @@ int sqliteOsRandomSeed(char*);
 int sqliteOsSleep(int ms);
 void sqliteOsEnterMutex(void);
 void sqliteOsLeaveMutex(void);
+char *sqliteOsFullPathname(const char*);
 
 
 
index 60c1bb357358baf1ffb55ab8f9f9a921fbb348af..5f11f767f642ed3e888f28e32bc5f4558b8aa175 100644 (file)
@@ -18,7 +18,7 @@
 ** file simultaneously, or one process from reading the database while
 ** another is writing.
 **
-** @(#) $Id: pager.c,v 1.60 2002/12/02 04:25:21 drh Exp $
+** @(#) $Id: pager.c,v 1.61 2002/12/07 21:45:14 drh Exp $
 */
 #include "os.h"         /* Must be first to enable large file support */
 #include "sqliteInt.h"
@@ -626,6 +626,7 @@ int sqlitepager_open(
   int useJournal           /* TRUE to use a rollback journal on this file */
 ){
   Pager *pPager;
+  char *zFullPathname;
   int nameLen;
   OsFile fd;
   int rc;
@@ -638,26 +639,34 @@ int sqlitepager_open(
     return SQLITE_NOMEM;
   }
   if( zFilename ){
-    rc = sqliteOsOpenReadWrite(zFilename, &fd, &readOnly);
+    zFullPathname = sqliteOsFullPathname(zFilename);
+    rc = sqliteOsOpenReadWrite(zFullPathname, &fd, &readOnly);
     tempFile = 0;
   }else{
     rc = sqlitepager_opentemp(zTemp, &fd);
     zFilename = zTemp;
+    zFullPathname = sqliteOsFullPathname(zFilename);
     tempFile = 1;
   }
+  if( sqlite_malloc_failed ){
+    return SQLITE_NOMEM;
+  }
   if( rc!=SQLITE_OK ){
+    sqliteFree(zFullPathname);
     return SQLITE_CANTOPEN;
   }
-  nameLen = strlen(zFilename);
+  nameLen = strlen(zFullPathname);
   pPager = sqliteMalloc( sizeof(*pPager) + nameLen*2 + 30 );
   if( pPager==0 ){
     sqliteOsClose(&fd);
+    sqliteFree(zFullPathname);
     return SQLITE_NOMEM;
   }
   pPager->zFilename = (char*)&pPager[1];
   pPager->zJournal = &pPager->zFilename[nameLen+1];
-  strcpy(pPager->zFilename, zFilename);
-  strcpy(pPager->zJournal, zFilename);
+  strcpy(pPager->zFilename, zFullPathname);
+  strcpy(pPager->zJournal, zFullPathname);
+  sqliteFree(zFullPathname);
   strcpy(&pPager->zJournal[nameLen], "-journal");
   pPager->fd = fd;
   pPager->journalOpen = 0;
index 35894953c5a09a59263427c67448695feeb7d3fc..5653564af4ab61df55b81c1db92ca282bf0d76ee 100644 (file)
@@ -13,7 +13,7 @@
 # This file implements tests for miscellanous features that were
 # left out of other test files.
 #
-# $Id: misc1.test,v 1.16 2002/10/22 23:38:04 drh Exp $
+# $Id: misc1.test,v 1.17 2002/12/07 21:45:14 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -440,4 +440,24 @@ do_test misc1-13.1 {
    }
 } {1 2 3 4 5 6 7 8 9 10 11}
 
+# Make sure a database connection still works after changing the
+# working directory.
+#
+do_test misc1-14.1 {
+  file mkdir tempdir
+  cd tempdir
+  execsql {BEGIN}
+  file exists ./test.db-journal
+} {0}
+do_test misc1-14.2 {
+  file exists ../test.db-journal
+} {1}
+do_test misc1-14.3 {
+  cd ..
+  file delete tempdir
+  execsql {COMMIT}
+  file exists ./test.db-journal
+} {0}
+
+
 finish_test