MojErr MojDbSandwichEngine::open(const MojChar* path, MojDbEnv* env) { LOG_TRACE("Entering function %s", __FUNCTION__); MojDbSandwichEnv* bEnv = static_cast<MojDbSandwichEnv *> (env); MojAssert(bEnv); MojAssert(!m_env.get() && !m_isOpen); m_env.reset(bEnv); if (path) { MojErr err = m_path.assign(path); MojErrCheck(err); // create dir err = MojCreateDirIfNotPresent(path); MojErrCheck(err); } // TODO: consider moving to configure m_db->options = MojDbSandwichEngine::getOpenOptions(); m_db->writeOptions = MojDbSandwichEngine::getWriteOptions(); m_db->readOptions = MojDbSandwichEngine::getReadOptions(); leveldb::Status status = m_db->Open(path); if (status.IsCorruption()) { // database corrupted // try restore database // AHTUNG! After restore database can lost some data! status = leveldb::RepairDB(path, MojDbSandwichEngine::getOpenOptions()); MojLdbErrCheck(status, _T("db corrupted")); status = m_db->Open(path); // database restored, re-open } MojLdbErrCheck(status, _T("db_create/db_open")); // open seqence db m_seqDb.reset(new MojDbSandwichDatabase(m_db.use(MojEnvSeqDbName))); MojAllocCheck(m_seqDb.get()); MojErr err = m_seqDb->open(MojEnvSeqDbName, this); MojErrCheck(err); // open index db m_indexDb.reset(new MojDbSandwichDatabase(m_db.use(MojEnvIndexDbName))); MojAllocCheck(m_indexDb.get()); err = m_indexDb->open(MojEnvIndexDbName, this); MojErrCheck(err); m_isOpen = true; return MojErrNone; }
MojErr MojDb::checkDbVersion(const MojChar* path) { MojAssert(path); MojLogTrace(s_log); MojString version; MojString versionFileName; MojErr err = versionFileName.format(_T("%s/%s"), path, VersionFileName); MojErrCheck(err); err = MojFileToString(versionFileName, version); MojErrCatch(err, MojErrNotFound) { // if the version file is not found, create it // make sure the directory exists err = MojCreateDirIfNotPresent(path); MojErrCheck(err); err = version.format(_T("%lld"), DatabaseVersion); MojErrCheck(err); err = MojFileFromString(versionFileName, version); MojErrCheck(err); } else {