>> Is it possible to use the CLI to read a WAL database and exit without
>> modifying the database?
>>
>The checkpoint-on-close feature is not affected by
>PRAGMA wal_autocheckpoint. The NO_CKPT_ON_CLOSE DB config flag is the
>only mechanism to prevent it from inside the connection.
SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
...
{ SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose },
and
SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){
u8 *pTmp = (u8 *)pPager->pTmpSpace;
...
sqlite3WalClose(pPager->pWal, db, pPager->ckptSyncFlags, pPager->pageSize,
(db && (db->flags & SQLITE_NoCkptOnClose) ? 0 : pTmp)
);
abd
SQLITE_PRIVATE int sqlite3WalClose(
Wal *pWal, /* Wal to close */
sqlite3 *db, /* For interrupt flag */
int sync_flags, /* Flags to pass to OsSync() (or 0) */
int nBuf,
u8 *zBuf /* Buffer of at least nBuf bytes */
){
int rc = SQLITE_OK;
if( pWal ){
int isDelete = 0; /* True to unlink wal and wal-index files */
/* If an EXCLUSIVE lock can be obtained on the database file (using the
** ordinary, rollback-mode locking methods, this guarantees that the
** connection associated with this log file is the only connection to
** the database. In this case checkpoint the database and unlink both
** the wal and wal-index files.
**
** The EXCLUSIVE lock is not released before returning.
*/
if( zBuf!=0
&& SQLITE_OK==(rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE))
){
...checkpointy goodness...
}
walIndexClose(pWal, isDelete);
sqlite3OsClose(pWal->pWalFd);
if( isDelete ){
sqlite3BeginBenignMalloc();
sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0);
sqlite3EndBenignMalloc();
}
WALTRACE(("WAL%p: closed\n", pWal));
sqlite3_free((void *)pWal->apWiData);
sqlite3_free(pWal);
}
return rc;
}
If checkpoint-on-close is disabled, sqlite3WalClose(...,zBuf=null) which skips
doing the checkpoint.
This gives me the behavior I want. I just have no way of doing this via the CLI
I was pawing through various corrupted databases. What I *want* is
sqlite3 my.db
sqlite> PRAGMA checkpoint_on_close=0;
sqlite> PRAGMA integrity_check;
...
sqlite> PRAGMA user_version;
...
sqlite> .q
and have the filesystem in the same state as when as I started. Since the CLI
can't set that, I had to COPY THE DB before I touched it
If the CLI could disable checkpoint-on-close it would have saved me a bunch of
time
I don't need the db to be physically readonly (and that's not possible for
WAL), but disabling checkpoint-on-close does it for me. I can issue readonly
commands, but SQLite's default checkpoint-on-close behavior in the CLI always
'writes'/modifies the database files regardless of my desire.
Make sense?
- Howard
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users