diff --git a/src/sqlite3.c b/src/sqlite3.c index 946815f13ec88233ffd608e68a1000284d9b517e..f77f7739053a0758d1b696c3f581cfb6a0ae5785 100644 --- a/src/sqlite3.c +++ b/src/sqlite3.c @@ -43317,6 +43317,7 @@ shmpage_out: *pp = 0; } if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: unixShmMap, fileName[%s], errno[%d]", pShmNode->zFilename, errno); sqlite3_mutex_leave(pShmNode->pShmMutex); return rc; } @@ -50999,6 +51000,7 @@ shmpage_out: *pp = 0; } if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: unixShmMap, fileName[%s], errno[%d]", pShmNode->zFilename, errno); sqlite3_mutex_leave(pShmNode->mutex); return rc; } @@ -53243,6 +53245,7 @@ static int memdbLock(sqlite3_file *pFile, int eLock){ if( eLock>SQLITE_LOCK_SHARED && (p->mFlags & SQLITE_DESERIALIZE_READONLY) ){ rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: memdbLock, eLock[%d], mFlags[%d], errno[%d]", eLock, p->mFlags, errno); }else{ switch( eLock ){ case SQLITE_LOCK_SHARED: { @@ -62029,6 +62032,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( assert( !memDb ); pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0; readOnly = (fout&SQLITE_OPEN_READONLY)!=0; + sqlite3_log(rc, "linzhb: sqlite3PagerOpen1, readOnly[%d], fout[%d], vfsFlags[%d], errno[%d]", readOnly, fout, vfsFlags, errno); /* If the file was successfully opened for read/write access, ** choose a default page size in case we have to create the @@ -62068,6 +62072,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0) ){ vfsFlags |= SQLITE_OPEN_READONLY; + sqlite3_log(rc, "linzhb: sqlite3PagerOpen2, readOnly[%d], vfsFlags[%d], errno[%d]", readOnly, vfsFlags, errno); goto act_like_temp_file; } } @@ -62139,6 +62144,7 @@ act_like_temp_file: pPager->readOnly = (u8)readOnly; assert( useJournal || pPager->tempFile ); sqlite3PagerSetFlags(pPager, (SQLITE_DEFAULT_SYNCHRONOUS+1)|PAGER_CACHESPILL); + sqlite3_log(rc, "linzhb: sqlite3PagerOpen4, readOnly[%d], vfsFlags[%d], errno[%d]", readOnly, vfsFlags, errno); /* pPager->pFirst = 0; */ /* pPager->pFirstSynced = 0; */ /* pPager->pLast = 0; */ @@ -65693,6 +65699,7 @@ static SQLITE_NOINLINE int walIndexPageRealloc( if( iPage>0 && sqlite3FaultSim(600) ) rc = SQLITE_NOMEM; }else if( (rc&0xff)==SQLITE_READONLY ){ pWal->readOnly |= WAL_SHM_RDONLY; + sqlite3_log(rc, "linzhb: walIndexPageRealloc, readOnly[%d], errno[%d]", pWal->readOnly, errno); if( rc==SQLITE_READONLY ){ rc = SQLITE_OK; } @@ -67716,6 +67723,7 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ rc = sqlite3OsShmMap(pWal->pDbFd, 0, WALINDEX_PGSZ, 0, &pDummy); assert( rc!=SQLITE_OK ); /* SQLITE_OK not possible for read-only connection */ if( rc!=SQLITE_READONLY_CANTINIT ){ + sqlite3_log(rc, "linzhb: walBeginShmUnreliable, fileName[%s], errno[%d]", pWal->zWalName, errno); rc = (rc==SQLITE_READONLY ? WAL_RETRY : rc); goto begin_unreliable_shm_out; } @@ -68583,6 +68591,7 @@ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ assert( pWal->writeLock==0 && pWal->iReCksum==0 ); if( pWal->readOnly ){ + sqlite3_log(SQLITE_READONLY, "linzhb: sqlite3WalBeginWriteTransaction, fileName[%s], errno[%d]", pWal->zWalName, errno); return SQLITE_READONLY; } @@ -69186,6 +69195,7 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + if( pWal->readOnly ) sqlite3_log(SQLITE_READONLY, "linzhb: sqlite3WalCheckpoint, fileName[%s], errno[%d]", pWal->zWalName, errno); if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); @@ -73228,7 +73238,10 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( pBt->pCursor = 0; pBt->pPage1 = 0; - if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; + if( sqlite3PagerIsreadonly(pBt->pPager) ) { + pBt->btsFlags |= BTS_READ_ONLY; + sqlite3_log(rc, "linzhb: sqlite3BtreeOpen, pBt->btsFlags[%d], errno[%d]", pBt->btsFlags, errno); + } #if defined(SQLITE_SECURE_DELETE) pBt->btsFlags |= BTS_SECURE_DELETE; #elif defined(SQLITE_FAST_SECURE_DELETE) @@ -73613,6 +73626,7 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, if( nReservebtsFlags & BTS_PAGESIZE_FIXED ){ sqlite3BtreeLeave(p); + sqlite3_log(rc, "linzhb: sqlite3BtreeSetPageSize, pBt->btsFlags[%d], errno[%d]", pBt->btsFlags, errno); return SQLITE_READONLY; } assert( nReserve>=0 && nReserve<=255 ); @@ -73729,6 +73743,7 @@ SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ */ SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ #ifdef SQLITE_OMIT_AUTOVACUUM +sqlite3_log(SQLITE_READONLY, "linzhb: sqlite3BtreeSetAutoVacuum, autoVacuum[%d], errno[%d]", autoVacuum, errno); return SQLITE_READONLY; #else BtShared *pBt = p->pBt; @@ -73738,6 +73753,7 @@ SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ sqlite3BtreeEnter(p); if( (pBt->btsFlags & BTS_PAGESIZE_FIXED)!=0 && (av ?1:0)!=pBt->autoVacuum ){ rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: sqlite3BtreeSetAutoVacuum, pBt->btsFlags[%d], pBt->autoVacuum[%d], errno[%d]", pBt->btsFlags, pBt->autoVacuum, errno); }else{ pBt->autoVacuum = av ?1:0; pBt->incrVacuum = av==2 ?1:0; @@ -73798,6 +73814,33 @@ static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){ static int newDatabase(BtShared*); +void DumpBuf(const uint8_t *ptr, uint32_t size) +{ + if (ptr == NULL){ + return; + } + uint32_t logSize = size*2 + 1; + char *log = malloc(logSize); + if (log == NULL){ + sqlite3_log(SQLITE_CORRUPT, "alloc mem unsucc at dump buf"); + return; + } + uint32_t idx = 0; + uint32_t i = 0; + while (idx < size){ + for (i = 0; i < 100 && idx < size; i++){ + (void)sprintf(log + i * 2, "%02x", *(ptr + idx)); + idx++; + } + log[i * 2] = '\0'; + sqlite3_log(SQLITE_CORRUPT, "%s", log); + } + free(log); +} + + + + /* ** Get a reference to pPage1 of the database file. This will ** also acquire a readlock on that file. @@ -73853,6 +73896,8 @@ static int lockBtree(BtShared *pBt){ #else if( page1[18]>2 ){ pBt->btsFlags |= BTS_READ_ONLY; + sqlite3_log(rc, "linzhb: lockBtree, pBt->btsFlags[%d], errno[%d]", pBt->btsFlags, errno); + DumpBuf((const uint8_t *)pPage1->aData, 100); } if( page1[19]>2 ){ goto page1_init_failed; @@ -74153,6 +74198,7 @@ static SQLITE_NOINLINE int btreeBeginTrans( /* Write transactions are not possible on a read-only database */ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){ rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: btreeBeginTrans1, pBt->btsFlags[%d], errno[%d]", pBt->btsFlags, errno); goto trans_begun; } @@ -74217,6 +74263,7 @@ static SQLITE_NOINLINE int btreeBeginTrans( if( rc==SQLITE_OK && wrflag ){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: btreeBeginTrans2, pBt->btsFlags[%d], errno[%d]", pBt->btsFlags, errno); }else{ rc = sqlite3PagerBegin(pPager, wrflag>1, sqlite3TempInMemory(p->db)); if( rc==SQLITE_OK ){ @@ -81902,6 +81949,7 @@ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void ** (e) the cursor points at a valid row of an intKey table. */ if( (pCsr->curFlags & BTCF_WriteFlag)==0 ){ + sqlite3_log(SQLITE_READONLY, "linzhb: sqlite3BtreePutData, pCsr->curFlags[%d], errno[%d]", pCsr->curFlags, errno); return SQLITE_READONLY; } assert( (pCsr->pBt->btsFlags & BTS_READ_ONLY)==0 @@ -82392,6 +82440,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ && pgszSrc!=pgszDest ){ rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: sqlite3_backup_step, pgszSrc[%d], pgszDest[%d], errno[%d]", pgszSrc, pgszDest, errno); } /* Now that there is a read-lock on the source database, query the @@ -97139,6 +97188,7 @@ case OP_Transaction: { if( db->flags & SQLITE_QueryOnly ){ /* Writes prohibited by the "PRAGMA query_only=TRUE" statement */ rc = SQLITE_READONLY; + sqlite3_log(rc, "linzhb: OP_Transaction, db->flags[%d], errno[%d]", db->flags, errno); }else{ /* Writes prohibited due to a prior SQLITE_CORRUPT in the current ** transaction */