void lsmDbSetPagesize(lsm_db *pDb, int nPgsz, int nBlksz){ Database *p = pDb->pDatabase; assert( lsmMutexHeld(pDb->pEnv, p->pWorkerMutex) && p->bRecovered==0 ); p->nPgsz = nPgsz; p->nBlksz = nBlksz; lsmFsSetPageSize(pDb->pFS, p->nPgsz); lsmFsSetBlockSize(pDb->pFS, p->nBlksz); }
/* ** Set (bVal==1) or clear (bVal==0) the "recovery done" flag. ** ** TODO: Should this be combined with BeginRecovery()/FinishRecovery()? */ void lsmDbRecoveryComplete(lsm_db *pDb, int bVal){ Database *p = pDb->pDatabase; assert( bVal==1 || bVal==0 ); assert( lsmMutexHeld(pDb->pEnv, p->pWorkerMutex) ); assert( p->pTree ); p->bRecovered = bVal; p->iCheckpointId = p->worker.iId; lsmFsSetPageSize(pDb->pFS, p->nPgsz); lsmFsSetBlockSize(pDb->pFS, p->nBlksz); }
Snapshot *lsmDbSnapshotRecover(lsm_db *pDb){ Database *p = pDb->pDatabase; Snapshot *pRet = 0; lsmMutexEnter(pDb->pEnv, p->pWorkerMutex); if( p->bRecovered ){ lsmFsSetPageSize(pDb->pFS, p->nPgsz); lsmFsSetBlockSize(pDb->pFS, p->nBlksz); lsmMutexLeave(pDb->pEnv, p->pWorkerMutex); }else{ pRet = &p->worker; } return pRet; }
/* ** Open a new connection to database zFilename. */ int lsm_open(lsm_db *pDb, const char *zFilename){ int rc; if( pDb->pDatabase ){ rc = LSM_MISUSE; }else{ char *zFull; /* Translate the possibly relative pathname supplied by the user into ** an absolute pathname. This is required because the supplied path ** is used (either directly or with "-log" appended to it) for more ** than one purpose - to open both the database and log files, and ** perhaps to unlink the log file during disconnection. An absolute ** path is required to ensure that the correct files are operated ** on even if the application changes the cwd. */ rc = getFullpathname(pDb->pEnv, zFilename, &zFull); assert( rc==LSM_OK || zFull==0 ); /* Connect to the database. */ if( rc==LSM_OK ){ rc = lsmDbDatabaseConnect(pDb, zFull); } if( pDb->bReadonly==0 ){ /* Configure the file-system connection with the page-size and block-size ** of this database. Even if the database file is zero bytes in size ** on disk, these values have been set in shared-memory by now, and so ** are guaranteed not to change during the lifetime of this connection. */ if( rc==LSM_OK && LSM_OK==(rc = lsmCheckpointLoad(pDb, 0)) ){ lsmFsSetPageSize(pDb->pFS, lsmCheckpointPgsz(pDb->aSnapshot)); lsmFsSetBlockSize(pDb->pFS, lsmCheckpointBlksz(pDb->aSnapshot)); } } lsmFree(pDb->pEnv, zFull); assertRwclientLockValue(pDb); } assert( pDb->bReadonly==0 || pDb->bReadonly==1 ); assert( rc!=LSM_OK || (pDb->pShmhdr==0)==(pDb->bReadonly==1) ); return rc; }