void LevelDB::open(StepFunction stepF, MessageFunction messageF) throw(DbException) { bool forceRepair = Util::fileExists(getRepairFlag()); if (forceRepair) { repair(stepF, messageF); File::deleteFile(getRepairFlag()); } auto ret = leveldb::DB::Open(defaultOptions, Text::fromUtf8(dbPath), &db); if (!ret.ok()) { if (ret.IsIOError()) { // most likely there's another instance running or the permissions are wrong messageF(STRING_F(DB_OPEN_FAILED_IO, getNameLower() % Text::toUtf8(ret.ToString()) % APPNAME % dbPath % APPNAME), false, true); throw DbException(); } else if (!forceRepair) { // the database is corrupted? messageF(STRING_F(DB_OPEN_FAILED_REPAIR, getNameLower() % Text::toUtf8(ret.ToString()) % APPNAME), false, false); repair(stepF, messageF); // try it again ret = leveldb::DB::Open(defaultOptions, Text::fromUtf8(dbPath), &db); } } if (!ret.ok()) { messageF(STRING_F(DB_OPEN_FAILED, getNameLower() % Text::toUtf8(ret.ToString()) % APPNAME), false, true); throw DbException(); } }
void Database::del(const RecordID& id) { Dbt key(id.data(), id.size()); // fetch children std::vector<RecordID> childrenIds; Dbc* pCursor = nullptr; dbParentId_.cursor(NULL, &pCursor, 0); assert(pCursor); BOOST_SCOPE_EXIT(&pCursor) { if(pCursor) pCursor->close(); } BOOST_SCOPE_EXIT_END Dbt keyChild; Dbt record; record.set_flags(DB_DBT_PARTIAL); record.set_doff(0); record.set_dlen(0); int res = pCursor->pget(&key, &keyChild, &record, DB_SET); while (res == 0) { childrenIds.push_back(RecordID(keyChild)); res = pCursor->pget(&key, &keyChild, &record, DB_NEXT_DUP); } if (res != DB_NOTFOUND) { throw DbException("Failed to obtain children ids", res); } pCursor->close(); pCursor = nullptr; // delete children for (const RecordID& childId : childrenIds) { del(childId); } // delete the record itself const int err = dbMain_.del(nullptr, &key, /*flags*/0); if (err && err != DB_NOTFOUND) { std::ostringstream ss; ss << "Failed to delete record id='" << id << '\''; throw DbException(ss.str().c_str(), err); } }
db_iterator Database::dirs_begin() const { Dbc* pCursor = nullptr; dbDirs_.cursor(NULL, &pCursor, 0); assert(pCursor); RecordID id; Dbt key; Dbt data; key.set_flags(DB_DBT_USERMEM); key.set_data(id.data()); key.set_ulen(id.size()); const int err = pCursor->get(&key, &data, DB_FIRST); if (err) { pCursor->close(); if (err != DB_NOTFOUND) { throw DbException("Failed to obtain first directory record", err); } return dirs_end(); } return db_iterator(pCursor, make_Record(std::move(id), RecordData(data))); }
void set(IRowBase * i_row, int i_column, const void * i_value) const { switch (i_column) { case 0: dynamic_cast<TableDimsRow *>(i_row)->modelId = (*(int *)i_value); break; case 1: dynamic_cast<TableDimsRow *>(i_row)->tableId = (*(int *)i_value); break; case 2: dynamic_cast<TableDimsRow *>(i_row)->dimId = (*(int *)i_value); break; case 3: dynamic_cast<TableDimsRow *>(i_row)->name = ((const char *)i_value); break; case 4: dynamic_cast<TableDimsRow *>(i_row)->typeId = (*(int *)i_value); break; case 5: dynamic_cast<TableDimsRow *>(i_row)->isTotal = (*(bool *)i_value); break; case 6: dynamic_cast<TableDimsRow *>(i_row)->dimSize = (*(int *)i_value); break; default: throw DbException("db column number out of range"); } }
void set(IRowBase * i_row, int i_column, const void * i_value) const { switch (i_column) { case 0: dynamic_cast<ParamDimsTxtRow *>(i_row)->modelId = (*(int *)i_value); break; case 1: dynamic_cast<ParamDimsTxtRow *>(i_row)->paramId = (*(int *)i_value); break; case 2: dynamic_cast<ParamDimsTxtRow *>(i_row)->dimId = (*(int *)i_value); break; case 3: dynamic_cast<ParamDimsTxtRow *>(i_row)->langId = (*(int *)i_value); break; case 4: dynamic_cast<ParamDimsTxtRow *>(i_row)->descr = ((const char *)i_value); break; case 5: dynamic_cast<ParamDimsTxtRow *>(i_row)->note = ((const char *)i_value); break; default: throw DbException("db column number out of range"); } }
wb_db_ohead &wb_db_ohead::get(wb_db_txn *txn) { int rc = 0; m_data.set_ulen(sizeof(m_o)); m_data.set_flags(DB_DBT_USERMEM); rc = m_db->m_t_ohead->get(txn, &m_key, &m_data, 0); if (rc) throw DbException( rc); return *this; }
void LevelDB::checkDbError(leveldb::Status aStatus) throw(DbException) { if (aStatus.ok()) return; if (aStatus.IsNotFound()) return; string ret = Text::toUtf8(aStatus.ToString()); #ifdef _WIN32 if (aStatus.IsCorruption() || aStatus.IsIOError()) { if (ret.back() != '.') ret += "."; ret += " " + STRING_F(DB_ERROR_HINT, STRING(HASHING)); } #endif throw DbException(ret); }
void set(IRowBase * i_row, int i_column, const void * i_value) const { switch (i_column) { case 0: dynamic_cast<WorksetParamRow *>(i_row)->setId = (*(int *)i_value); break; case 1: dynamic_cast<WorksetParamRow *>(i_row)->modelId = (*(int *)i_value); break; case 2: dynamic_cast<WorksetParamRow *>(i_row)->paramId = (*(int *)i_value); break; case 3: dynamic_cast<WorksetParamRow *>(i_row)->subCount = (*(int *)i_value); break; default: throw DbException("db column number out of range"); } }
Record Database::find(const std::string& fileName) const { Dbt key; Dbt data; Dbt fileNameKey(const_cast<char*>(fileName.data()), fileName.size()); const int err = dbFilename_.pget(nullptr, &fileNameKey, &key, &data, 0); if (err == DB_NOTFOUND) { return make_Record(NULL_RECORD_ID, RecordData()); } if (err) { throw DbException("Failed to obtain record by filename key", err); } return make_Record(RecordID(key), RecordData(data)); }
void handle(int rc) const { if (rc != SQLITE_OK) throw DbException(); }