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;
}
Beispiel #2
0
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 {