Пример #1
0
std::string Database_Dummy::loadBlock(v3s16 blockpos)
{
	if (m_database.count(getBlockAsString(blockpos)))
		return m_database.get(getBlockAsString(blockpos));
	else
		return "";
}
Пример #2
0
void Database_LevelDB::saveBlock(MapBlock *block)
{
	DSTACK(__FUNCTION_NAME);
	/*
		Dummy blocks are not written
	*/
	if(!block || block->isDummy())
	{
		return;
	}

	// Format used for writing
	u8 version = SER_FMT_VER_HIGHEST_WRITE;
	// Get destination
	v3s16 p3d = block->getPos();

	/*
		[0] u8 serialization version
		[1] data
	*/

	std::ostringstream o(std::ios_base::binary);
	o.write((char*)&version, 1);
	// Write basic data
	block->serialize(o, version, true);
	// Write block to database
	std::string tmp = o.str();

	m_database->Put(leveldb::WriteOptions(), getBlockAsString(p3d), tmp);
	m_database->Delete(leveldb::WriteOptions(), i64tos(getBlockAsInteger(p3d))); // delete old format

	// We just wrote it to the disk so clear modified flag
	block->resetModified();
}
Пример #3
0
void Database_Dummy::saveBlock(MapBlock *block)
{
	DSTACK(__FUNCTION_NAME);
	/*
		Dummy blocks are not written
	*/
	if(block->isDummy())
	{
		return;
	}

	// Format used for writing
	u8 version = SER_FMT_VER_HIGHEST_WRITE;
	// Get destination
	v3s16 p3d = block->getPos();

	/*
		[0] u8 serialization version
		[1] data
	*/

	std::ostringstream o(std::ios_base::binary);
	o.write((char*)&version, 1);
	// Write basic data
	block->serialize(o, version, true);
	// Write block to database
	std::string tmp = o.str();

	m_database[getBlockAsString(p3d)] = tmp;
	// We just wrote it to the disk so clear modified flag
	block->resetModified();
}
Пример #4
0
void Database_Dummy::loadBlock(const v3s16 &pos, std::string *block)
{
	auto i = getBlockAsString(pos);
	auto lock = m_database.lock_shared_rec();
	auto it = m_database.find(i);
	if (it == m_database.end())
		*block = "";
		return;
	*block = it->second;
}
Пример #5
0
MapBlock* Database_LevelDB::loadBlock(v3s16 blockpos)
{
	v2s16 p2d(blockpos.X, blockpos.Z);

	std::string datastr;

	leveldb::Status s = m_database->Get(leveldb::ReadOptions(), getBlockAsString(blockpos), &datastr);

	if (!datastr.length()) {

	s = m_database->Get(leveldb::ReadOptions(), i64tos(getBlockAsInteger(blockpos)), &datastr);
	if (datastr.length() == 0 && s.ok()) {
		errorstream << "Blank block data in database (datastr.length() == 0) ("
			<< blockpos.X << "," << blockpos.Y << "," << blockpos.Z << ")" << std::endl;

		if (g_settings->getBool("ignore_world_load_errors")) {
			errorstream << "Ignoring block load error. Duck and cover! "
				<< "(ignore_world_load_errors)" << std::endl;
		} else {
			throw SerializationError("Blank block data in database");
		}
		return NULL;
	}

	}

	if (s.ok()) {
		try {
			std::istringstream is(datastr, std::ios_base::binary);
			u8 version = SER_FMT_VER_INVALID;
			is.read((char *)&version, 1);

			if (is.fail())
				throw SerializationError("ServerMap::loadBlock(): Failed"
					" to read MapBlock version");

			MapBlock *block = NULL;
			bool created_new = false;
			block = srvmap->getBlockNoCreateNoEx(blockpos);
			if (block == NULL)
			{
				block = srvmap->createBlankBlockNoInsert(blockpos);
				created_new = true;
			}

			// Read basic data
			block->deSerialize(is, version, true);

			// If it's a new block, insert it to the map
			if (created_new)
				srvmap->insertBlock(block);

			/*
				Save blocks loaded in old format in new format
			*/
			//if(version < SER_FMT_VER_HIGHEST || save_after_load)
			// Only save if asked to; no need to update version
			//if(save_after_load)
			//     	saveBlock(block);
			// We just loaded it from, so it's up-to-date.
			block->resetModified();
		}
		catch (SerializationError &e)
		{
			errorstream << "Invalid block data in database"
				<< " (" << blockpos.X << "," << blockpos.Y << "," << blockpos.Z
				<< ") (SerializationError): " << e.what() << std::endl;
			// TODO: Block should be marked as invalid in memory so that it is
			// not touched but the game can run

			if (g_settings->getBool("ignore_world_load_errors")) {
				errorstream << "Ignoring block load error. Duck and cover! "
					<< "(ignore_world_load_errors)" << std::endl;
			} else {
				throw SerializationError("Invalid block data in database");
				//assert(0);
			}
		}

		return srvmap->getBlockNoCreateNoEx(blockpos);  // should not be using this here
	}
	return NULL;
}
Пример #6
0
bool Database_Dummy::deleteBlock(const v3s16 &pos)
{
	m_database.erase(getBlockAsString(pos));
	return true;
}
Пример #7
0
bool Database_Dummy::saveBlock(const v3s16 &pos, const std::string &data)
{
	m_database.set(getBlockAsString(pos), data);
	return true;
}
Пример #8
0
bool Database_Dummy::saveBlock(v3s16 blockpos, std::string &data)
{
	m_database.set(getBlockAsString(blockpos), data);
	return true;
}