Ejemplo n.º 1
0
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();
	}
}
Ejemplo n.º 2
0
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);
	}
}
Ejemplo n.º 3
0
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)));
}
Ejemplo n.º 4
0
 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");
     }
 }
Ejemplo n.º 5
0
 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");
     }
 }
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
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);
}
Ejemplo n.º 8
0
 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");
     }
 }
Ejemplo n.º 9
0
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));
}
Ejemplo n.º 10
0
 void handle(int rc) const
 {
     if (rc != SQLITE_OK)
         throw DbException();
 }