diff options
Diffstat (limited to 'src/pager.c')
-rw-r--r-- | src/pager.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/pager.c b/src/pager.c index 66c361597..f470c0dd6 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.86 2003/07/07 10:47:10 drh Exp $ +** @(#) $Id: pager.c,v 1.87 2003/07/27 18:59:43 drh Exp $ */ #include "os.h" /* Must be first to enable large file support */ #include "sqliteInt.h" @@ -129,6 +129,7 @@ struct PgHdr { struct Pager { char *zFilename; /* Name of the database file */ char *zJournal; /* Name of the journal file */ + char *zDirectory; /* Directory hold database and journal files */ OsFile fd, jfd; /* File descriptors for database and journal */ OsFile cpfd; /* File descriptor for the checkpoint journal */ int dbSize; /* Number of pages in the file */ @@ -828,7 +829,7 @@ int sqlitepager_open( char *zFullPathname; int nameLen; OsFile fd; - int rc; + int rc, i; int tempFile; int readOnly = 0; char zTemp[SQLITE_TEMPNAME_SIZE]; @@ -855,7 +856,7 @@ int sqlitepager_open( return SQLITE_CANTOPEN; } nameLen = strlen(zFullPathname); - pPager = sqliteMalloc( sizeof(*pPager) + nameLen*2 + 30 ); + pPager = sqliteMalloc( sizeof(*pPager) + nameLen*3 + 30 ); if( pPager==0 ){ sqliteOsClose(&fd); sqliteFree(zFullPathname); @@ -863,8 +864,12 @@ int sqlitepager_open( } SET_PAGER(pPager); pPager->zFilename = (char*)&pPager[1]; - pPager->zJournal = &pPager->zFilename[nameLen+1]; + pPager->zDirectory = &pPager->zFilename[nameLen+1]; + pPager->zJournal = &pPager->zDirectory[nameLen+1]; strcpy(pPager->zFilename, zFullPathname); + strcpy(pPager->zDirectory, zFullPathname); + for(i=nameLen; i>0 && pPager->zDirectory[i-1]!='/'; i--){} + if( i>0 ) pPager->zDirectory[i-1] = 0; strcpy(pPager->zJournal, zFullPathname); sqliteFree(zFullPathname); strcpy(&pPager->zJournal[nameLen], "-journal"); @@ -995,8 +1000,10 @@ int sqlitepager_close(Pager *pPager){ */ CLR_PAGER(pPager); if( pPager->zFilename!=(char*)&pPager[1] ){ + assert( 0 ); /* Cannot happen */ sqliteFree(pPager->zFilename); sqliteFree(pPager->zJournal); + sqliteFree(pPager->zDirectory); } sqliteFree(pPager); return SQLITE_OK; @@ -1535,6 +1542,7 @@ static int pager_open_journal(Pager *pPager){ pPager->state = SQLITE_READLOCK; return SQLITE_CANTOPEN; } + sqliteOsOpenDirectory(pPager->zDirectory, &pPager->jfd); pPager->journalOpen = 1; pPager->journalStarted = 0; pPager->needSync = 0; |