Hi, As per the link http://www.sqlite.org/lang_vacuum.html , SQLite claims that "*The VACUUM command works by copying the contents of the database into a temporary database file and then overwriting the original with the contents of the temporary file*." In this phrase "*The VACUUM command works by copying the contents of the database into a temporary database file*" seem to be working fine where as " *then overwriting the original with the contents of the temporary file*" is not.
As i tested, sqlite creates temp file but it does not overwrite the original file with temp file content. I am using sqlite-amalgamation-3_7_3.zip with WIN32 configuration. Please help me to find the solution for this problem. Thanks, Sudha On Thu, Feb 24, 2011 at 3:04 PM, Sudha Venkatareddy <sudha....@gmail.com>wrote: > Hi, > > I fixed the code in such a way that the temp files which are created with > below flags are deleted during close. > > dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY > | FILE_ATTRIBUTE_HIDDEN > | FILE_FLAG_DELETE_ON_CLOSE; > > > so.. > > * Problem 1. *Running VACUUM leaves 3 temporary files in the temp > directory > which are not deleted when main DB is closed.* - Fixed* > > *Problem 2.* Upon applying VACUUM command on say main DB file MyDb.db , > and > closing the main DB connection, the size of the main DB file MyDb.db does > not change where as one of the temp file(etilqs_*) will actually contain > the > reduced size of the same data as of main DB file. - *Not Fixed > > *Here i am attaching the MyDb.db as well as temp file "etilqs_*" which > gets created while running VACUUM command. Its content is same as MainDb.db > except the file size. > Expected output: content and file size of Mydb.db should be same as > etilqs_Hm4RUi6JPXcMZ17 and file name should be remained as MyDb.db. > > Please help me in fixing this problem. > > Thanks, > Sudha > > > On Thu, Feb 24, 2011 at 11:50 AM, Sudha Venkatareddy > <sudha....@gmail.com>wrote: > >> Hi, >> >> The porting is done in little tricky way due to limited support from >> underlying platform. >> >> Ported code does not completely follow WINDOWS. it is WINDOWS + WINCE >> configuration. >> >> Porting is done as below. >> >> *Step 1.* Main macros defnined in the source include: >> >> #define SQLITE_DEBUG 0 >> #define SQLITE_OS_OTHER 1 >> #define SQLITE_MUTEX_OTHER_OS 1 >> #define SQLITE_CORE 1 >> #define SQLITE_AMALGAMATION 1 >> SQLITE_OS_OTHER is same as SQLITE_OS_WIN >> >> *Step 2.* SQLITE_OS_WINCE is not defined but isNT() is defined as 1. >> #define isNT() 1 >> >> Here is the code snippet of otherOsClose() API for your reference. >> ==================================================== >> #define MX_CLOSE_ATTEMPT 3 >> static int otherOsClose(sqlite3_file *id){ >> int rc, cnt = 0; >> otherOsFile *pFile = (otherOsFile*)id; >> assert( id!=0 ); >> assert( pFile->pShm==0 ); >> OSTRACE2("CLOSE %d\n", pFile->h); >> do{ >> rc = CloseHandle(pFile->h); >> /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ >> }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (Sleep(100), 1) ); >> #if SQLITE_OS_WINCE >> #define WINCE_DELETION_ATTEMPTS 3 >> winceDestroyLock(pFile); >> if( pFile->zDeleteOnClose ){ >> int cnt = 0; >> while( >> DeleteFileW(pFile->zDeleteOnClose)==0 >> && GetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff >> && cnt++ < WINCE_DELETION_ATTEMPTS >> ){ >> Sleep(100); /* Wait a little before trying again */ >> } >> free(pFile->zDeleteOnClose); >> } >> #endif >> OSTRACE3("CLOSE %d %s\n", pFile->h, rc ? "ok" : "failed"); >> OpenCounter(-1); >> return rc ? SQLITE_OK : SQLITE_IOERR; >> } >> ============================================================ >> >> With configuration steps 1 and 2 as mentioned above, will there be any >> problems? >> >> Since SQLITE_OS_WINCE is not defined as 1, the file will not be deleted on >> close. I can make some hack to enable pFile->zDeleteOnClose and modify the >> ported code to delete the file if pFile->zDeleteOnClose is true without >> actually defining macro SQLITE_OS_WINCE. >> >> SQLITE_OS_WINCE can not be enabled since it requires winceLocks to be >> implemented which can not be supported at the moment. >> >> >> Thanks, >> Sudha >> >> On Wed, Feb 23, 2011 at 8:14 PM, Shane Harrelson <sh...@sqlite.org>wrote: >> >>> Hi- >>> >>> On Windows, SQLite uses the FILE_FLAG_DELETE_ON_CLOSE flag to have >>> temporary files automatically deleted after they are closed. WINCE >>> doesn't support this flag, so you will see special logic in os_win.c, >>> wrapped in #ifdef SQLITE_OS_WINCE, for handling the deletion of these >>> files. You mentioned in an earlier post that you had ported to your >>> platform based on this code. Could you check that your ported code >>> includes this logic? >>> >>> -Shane >>> >>> On Wed, Feb 23, 2011 at 9:00 AM, Sudha Venkatareddy <sudha....@gmail.com> >>> wrote: >>> > Hi, >>> > >>> > I referred the link http://www.sqlite.org/cvstrac/tktview?tn=2829 >>> > it is slightly related to it but the temporary files are created while >>> > running VACUUM command. >>> > --------------------------------------------------------------- >>> > Ticket 2829: >>> > >>> > This patch seems to fix it (added: SQLITE_OPEN_DELETEONCLOSE): >>> > >>> > if( flags & (SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TEMP_JOURNAL >>> > - | SQLITE_OPEN_SUBJOURNAL) ){ >>> > + | SQLITE_OPEN_SUBJOURNAL | >>> SQLITE_OPEN_DELETEONCLOSE) ){ >>> > >>> > >>> ------------------------------------------------------------------------------ >>> > >>> > The temp files were created in the below call sequence: >>> > >>> > ----------------------------------------------------------------- >>> > 62 otherOsOpen() sqlite3.c:123900 0x3afe25bd >>> > 61 sqlite3OsOpen() sqlite3.c:15280 0x3af550d0 >>> > 60 pagerOpentemp() sqlite3.c:39431 0x3af62e70 >>> > 59 pager_write_pagelist() sqlite3.c:40030 0x3af63a68 >>> > 58 sqlite3PagerCommitPhaseOne() sqlite3.c:41884 0x3af669ff >>> > 57 sqlite3BtreeCommitPhaseOne() sqlite3.c:48993 0x3af72665 >>> > 56 sqlite3BtreeCommit() sqlite3.c:49083 0x3af728e6 >>> > 55 sqlite3RunVacuum() sqlite3.c:94735 0x3afcce29 >>> > 54 sqlite3VdbeExec() sqlite3.c:66384 0x3af961e4 >>> > 53 sqlite3Step() sqlite3.c:59380 0x3af87b34 >>> > 52 sqlite3_step() sqlite3.c:59444 0x3af87d6e >>> > 51 sqlite3_exec() sqlite3.c:84701 0x3afb86b9 >>> > ------------------------------------------------------------------ >>> > >>> > >>> > >>> > Basically there 2 problems associated when i run VACUUM command. >>> > Problem 1. Running VACUUM leaves 3 temporary files in the temp >>> directory >>> > which are not deleted when main DB is closed. >>> > Problem 2. Upon applying VACUUM command on say main DB file MyDb.db , >>> and >>> > closing the main DB connection, the size of the main DB file MyDb.db >>> does >>> > not change where as one of the temp file(etilqs_*) will actually >>> contain the >>> > reduced size of the same data as of main DB file. >>> > >>> > I am not sure if this is the expected behaviour or there is some bug in >>> the >>> > flow. >>> > >>> > Please let me know if there is a solution to resolve this issue. >>> > >>> > Thanks, >>> > Sudha >>> > >>> > On Wed, Feb 23, 2011 at 5:52 PM, Simon Slavin <slav...@bigfraud.org> >>> wrote: >>> > >>> >> >>> >> On 23 Feb 2011, at 6:11am, Sudha Venkatareddy wrote: >>> >> >>> >> > *Actual output: MyDb.db remains size 23KB(size not changes from >>> original) >>> >> > and creates temporary file etilqs_Hm4RUi6JPXcMZ17 whose data is same >>> as >>> >> > MyDb.db but the size is reduced to 13KB* >>> >> >>> >> Your problem is probably related to >>> >> >>> >> http://www.sqlite.org/cvstrac/tktview?tn=2829 >>> >> >>> >> . It's quite legitimate for your symptoms to occur while the database >>> >> handle is still open but you should not be seeing those files after >>> you have >>> >> closed the connection to the database. Either you are not closing the >>> >> database connection properly, or some part of the API you're using is >>> not >>> >> closing the database connection properly. >>> >> >>> >> I'm not familiar with how this problem manifests because I don't use >>> >> Windows, so I'll leave it up to an expert to tell you if it needs >>> fixing >>> >> somehow. >>> >> >>> >> Simon. >>> >> _______________________________________________ >>> >> sqlite-users mailing list >>> >> sqlite-users@sqlite.org >>> >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >>> >> >>> > _______________________________________________ >>> > sqlite-users mailing list >>> > sqlite-users@sqlite.org >>> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >>> > >>> >> >> > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users