mirror of
https://bitbucket.org/seefoe/src.git
synced 2026-09-11 21:45:09 -04:00
tidy up
This commit is contained in:
@@ -16,327 +16,322 @@
|
|||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
|
|
||||||
namespace ObjvarBufferNamespace
|
namespace ObjvarBufferNamespace {
|
||||||
{
|
const int ms_maxItemsPerExec = 10000;
|
||||||
const int ms_maxItemsPerExec = 10000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using namespace ObjvarBufferNamespace;
|
using namespace ObjvarBufferNamespace;
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
|
|
||||||
ObjvarBuffer::ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames) :
|
ObjvarBuffer::ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames)
|
||||||
AbstractTableBuffer(),
|
: AbstractTableBuffer(), m_mode(mode), m_data(), m_objectTableBuffer(objectTableBuffer),
|
||||||
m_mode(mode),
|
m_useGoldNames(useGoldNames) {
|
||||||
m_data(),
|
|
||||||
m_objectTableBuffer(objectTableBuffer),
|
|
||||||
m_useGoldNames(useGoldNames)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
ObjvarBuffer::~ObjvarBuffer()
|
ObjvarBuffer::~ObjvarBuffer() {
|
||||||
{
|
m_data.clear();
|
||||||
m_data.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObjvarBuffer::load(DB::Session *session,const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase)
|
bool
|
||||||
{
|
ObjvarBuffer::load(DB::Session *session, const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase) {
|
||||||
int rowsFetched;
|
int rowsFetched;
|
||||||
UNREF(tags); // all objects have objvars
|
UNREF(tags); // all objects have objvars
|
||||||
|
|
||||||
DBQuery::GetAllObjectVariables qry(schema);
|
DBQuery::GetAllObjectVariables qry(schema);
|
||||||
|
|
||||||
if (! (session->exec(&qry)))
|
if (!(session->exec(&qry))) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
while ((rowsFetched = qry.fetch()) > 0)
|
while ((rowsFetched = qry.fetch()) > 0) {
|
||||||
{
|
size_t numRows = qry.getNumRowsFetched();
|
||||||
size_t numRows = qry.getNumRowsFetched();
|
size_t count = 0;
|
||||||
size_t count = 0;
|
const std::vector <DBSchema::ObjectVariableRow> &data = qry.getData();
|
||||||
const std::vector<DBSchema::ObjectVariableRow> &data = qry.getData();
|
|
||||||
|
|
||||||
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row=data.begin(); row!=data.end(); ++row)
|
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row = data.begin(); row != data.end(); ++row) {
|
||||||
{
|
if (++count > numRows) {
|
||||||
if (++count > numRows)
|
break;
|
||||||
{
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
||||||
ObjvarValue value;
|
ObjvarValue value;
|
||||||
value.m_type=row->type.getValue();
|
value.m_type = row->type.getValue();
|
||||||
|
|
||||||
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
||||||
value.m_value=Unicode::wideToNarrow(row->value.getValue());
|
value.m_value = Unicode::wideToNarrow(row->value.getValue());
|
||||||
|
|
||||||
m_data.insert(std::make_pair(key,value));
|
m_data.insert(std::make_pair(key, value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qry.done();
|
qry.done();
|
||||||
if (rowsFetched < 0)
|
if (rowsFetched < 0) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (usingGoldDatabase)
|
if (usingGoldDatabase) {
|
||||||
{
|
// Check for local overrides to the gold data
|
||||||
// Check for local overrides to the gold data
|
DBQuery::GetObjectVariableOverrides qry(DatabaseProcess::getInstance().getSchemaQualifier(), schema);
|
||||||
DBQuery::GetObjectVariableOverrides qry(DatabaseProcess::getInstance().getSchemaQualifier(), schema);
|
if (!(session->exec(&qry))) {
|
||||||
if (! (session->exec(&qry)))
|
return false;
|
||||||
return false;
|
}
|
||||||
|
|
||||||
while ((rowsFetched = qry.fetch()) > 0)
|
while ((rowsFetched = qry.fetch()) > 0) {
|
||||||
{
|
size_t numRows = qry.getNumRowsFetched();
|
||||||
size_t numRows = qry.getNumRowsFetched();
|
size_t count = 0;
|
||||||
size_t count = 0;
|
const std::vector <DBSchema::ObjectVariableRow> &data = qry.getData();
|
||||||
const std::vector<DBSchema::ObjectVariableRow> &data = qry.getData();
|
|
||||||
|
|
||||||
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row=data.begin(); row!=data.end(); ++row)
|
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row = data.begin();
|
||||||
{
|
row != data.end(); ++row) {
|
||||||
if (++count > numRows)
|
if (++count > numRows) {
|
||||||
{
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
||||||
ObjvarValue value;
|
ObjvarValue value;
|
||||||
value.m_type=row->type.getValue();
|
value.m_type = row->type.getValue();
|
||||||
|
|
||||||
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
||||||
value.m_value=Unicode::wideToNarrow(row->value.getValue());
|
value.m_value = Unicode::wideToNarrow(row->value.getValue());
|
||||||
|
|
||||||
value.m_detached=false;
|
value.m_detached = false;
|
||||||
|
|
||||||
m_data.insert(std::make_pair(key,value));
|
m_data.insert(std::make_pair(key, value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qry.done();
|
qry.done();
|
||||||
}
|
}
|
||||||
return (rowsFetched >= 0);
|
return (rowsFetched >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
bool ObjvarBuffer::save(DB::Session *session)
|
bool ObjvarBuffer::save(DB::Session *session) {
|
||||||
{
|
LOG("SaveCounts", ("Objvars: %i saved to db", m_data.size()));
|
||||||
LOG("SaveCounts",("Objvars: %i saved to db",m_data.size()));
|
|
||||||
|
|
||||||
{
|
{
|
||||||
DBQuery::AddObjectVariableQuery addQuery;
|
DBQuery::AddObjectVariableQuery addQuery;
|
||||||
if (!addQuery.setupData(session))
|
if (!addQuery.setupData(session)) {
|
||||||
return false;
|
return false;
|
||||||
for (DataType::iterator i=m_data.begin(); i!=m_data.end(); ++i)
|
}
|
||||||
{
|
for (DataType::iterator i = m_data.begin(); i != m_data.end(); ++i) {
|
||||||
if (!i->second.m_detached && !i->second.m_inDatabase)
|
if (!i->second.m_detached && !i->second.m_inDatabase) {
|
||||||
if (!addQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value))
|
if (!addQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value)) {
|
||||||
return false;
|
return false;
|
||||||
if (addQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec)
|
}
|
||||||
{
|
}
|
||||||
if (! (session->exec(&addQuery)))
|
if (addQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) {
|
||||||
return false;
|
if (!(session->exec(&addQuery))) {
|
||||||
addQuery.clearData();
|
return false;
|
||||||
}
|
}
|
||||||
}
|
addQuery.clearData();
|
||||||
if (addQuery.getNumItems() != 0)
|
}
|
||||||
if (! (session->exec(&addQuery)))
|
}
|
||||||
return false;
|
if (addQuery.getNumItems() != 0) {
|
||||||
addQuery.done();
|
if (!(session->exec(&addQuery))) {
|
||||||
addQuery.freeData();
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
addQuery.done();
|
||||||
|
addQuery.freeData();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
DBQuery::UpdateObjectVariableQuery updateQuery;
|
DBQuery::UpdateObjectVariableQuery updateQuery;
|
||||||
if (!updateQuery.setupData(session))
|
if (!updateQuery.setupData(session)) {
|
||||||
return false;
|
return false;
|
||||||
for (DataType::iterator i=m_data.begin(); i!=m_data.end(); ++i)
|
}
|
||||||
{
|
for (DataType::iterator i = m_data.begin(); i != m_data.end(); ++i) {
|
||||||
if (!i->second.m_detached && i->second.m_inDatabase)
|
if (!i->second.m_detached && i->second.m_inDatabase) {
|
||||||
if (!updateQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value))
|
if (!updateQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value)) {
|
||||||
return false;
|
return false;
|
||||||
if (updateQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec)
|
}
|
||||||
{
|
}
|
||||||
if (! (session->exec(&updateQuery)))
|
if (updateQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) {
|
||||||
return false;
|
if (!(session->exec(&updateQuery))) {
|
||||||
updateQuery.clearData();
|
return false;
|
||||||
}
|
}
|
||||||
}
|
updateQuery.clearData();
|
||||||
if (updateQuery.getNumItems() != 0)
|
}
|
||||||
if (! (session->exec(&updateQuery)))
|
}
|
||||||
return false;
|
if (updateQuery.getNumItems() != 0) {
|
||||||
updateQuery.done();
|
if (!(session->exec(&updateQuery))) {
|
||||||
updateQuery.freeData();
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
updateQuery.done();
|
||||||
|
updateQuery.freeData();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
DBQuery::RemoveObjectVariableQuery removeQuery;
|
DBQuery::RemoveObjectVariableQuery removeQuery;
|
||||||
if (!removeQuery.setupData(session))
|
if (!removeQuery.setupData(session)) {
|
||||||
return false;
|
return false;
|
||||||
for (DataType::iterator i=m_data.begin(); i!=m_data.end(); ++i)
|
}
|
||||||
{
|
for (DataType::iterator i = m_data.begin(); i != m_data.end(); ++i) {
|
||||||
if (i->second.m_detached && i->second.m_inDatabase)
|
if (i->second.m_detached && i->second.m_inDatabase) {
|
||||||
if (!removeQuery.addData(i->first.m_objectId, i->first.m_nameId))
|
if (!removeQuery.addData(i->first.m_objectId, i->first.m_nameId)) {
|
||||||
return false;
|
return false;
|
||||||
if (removeQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec)
|
}
|
||||||
{
|
}
|
||||||
if (! (session->exec(&removeQuery)))
|
if (removeQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) {
|
||||||
return false;
|
if (!(session->exec(&removeQuery))) {
|
||||||
removeQuery.clearData();
|
return false;
|
||||||
}
|
}
|
||||||
}
|
removeQuery.clearData();
|
||||||
if (removeQuery.getNumItems() != 0)
|
}
|
||||||
if (! (session->exec(&removeQuery)))
|
}
|
||||||
return false;
|
if (removeQuery.getNumItems() != 0) {
|
||||||
removeQuery.done();
|
if (!(session->exec(&removeQuery))) {
|
||||||
removeQuery.freeData();
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
}
|
||||||
|
removeQuery.done();
|
||||||
|
removeQuery.freeData();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
void ObjvarBuffer::getObjvarsForObject(const NetworkId &objectId, std::vector<DynamicVariableList::MapType::Command> &commands) const
|
void
|
||||||
{
|
ObjvarBuffer::getObjvarsForObject(const NetworkId &objectId, std::vector <DynamicVariableList::MapType::Command> &commands) const {
|
||||||
DynamicVariableList::MapType::Command c;
|
DynamicVariableList::MapType::Command c;
|
||||||
|
|
||||||
// unpacked object variables
|
// unpacked object variables
|
||||||
|
|
||||||
{
|
{
|
||||||
for (DataType::const_iterator i= m_data.lower_bound(IndexKey(objectId,0)); (i!=m_data.end()) && (i->first.m_objectId==objectId); ++i)
|
for (DataType::const_iterator i = m_data.lower_bound(IndexKey(objectId, 0));
|
||||||
{
|
(i != m_data.end()) && (i->first.m_objectId == objectId); ++i) {
|
||||||
std::string name;
|
std::string name;
|
||||||
bool foundName = false;
|
bool foundName = false;
|
||||||
if (m_useGoldNames)
|
if (m_useGoldNames) {
|
||||||
foundName=ObjvarNameManager::getGoldInstance().getName(i->first.m_nameId, name);
|
foundName = ObjvarNameManager::getGoldInstance().getName(i->first.m_nameId, name);
|
||||||
else
|
} else {
|
||||||
foundName=ObjvarNameManager::getInstance().getName(i->first.m_nameId, name);
|
foundName = ObjvarNameManager::getInstance().getName(i->first.m_nameId, name);
|
||||||
|
}
|
||||||
|
|
||||||
if (foundName)
|
if (foundName) {
|
||||||
{
|
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
||||||
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
c.key = name;
|
||||||
c.key = name;
|
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
||||||
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
|
||||||
|
|
||||||
commands.push_back(c);
|
commands.push_back(c);
|
||||||
}
|
} else {
|
||||||
else
|
WARNING_STRICT_FATAL(true, ("Object %s has an objvar with name_id %i, which was not in the list of names.", objectId.getValueString().c_str(), i->first.m_nameId));
|
||||||
WARNING_STRICT_FATAL(true,("Object %s has an objvar with name_id %i, which was not in the list of names.",objectId.getValueString().c_str(), i->first.m_nameId));
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//packed object variables
|
//packed object variables
|
||||||
|
|
||||||
m_objectTableBuffer->getObjvarsForObject(objectId, commands);
|
m_objectTableBuffer->getObjvarsForObject(objectId, commands);
|
||||||
|
|
||||||
// Apply overrides, if any.
|
// Apply overrides, if any.
|
||||||
// The last objvar sent to the game takes precedence, so we want to send the overrides after the values read in through the regular process
|
// The last objvar sent to the game takes precedence, so we want to send the overrides after the values read in through the regular process
|
||||||
|
|
||||||
{
|
{
|
||||||
for (DataType::const_iterator i= m_data.lower_bound(IndexKey(objectId,0)); (i!=m_data.end()) && (i->first.m_objectId==objectId); ++i)
|
for (DataType::const_iterator i = m_data.lower_bound(IndexKey(objectId, 0));
|
||||||
{
|
(i != m_data.end()) && (i->first.m_objectId == objectId); ++i) {
|
||||||
std::string name;
|
std::string name;
|
||||||
bool foundName = false;
|
bool foundName = false;
|
||||||
foundName=ObjvarNameManager::getInstance().getName(i->first.m_nameId, name); // overrides always use the live names, not the gold names.
|
foundName = ObjvarNameManager::getInstance().getName(i->first.m_nameId, name); // overrides always use the live names, not the gold names.
|
||||||
|
|
||||||
if (foundName)
|
if (foundName) {
|
||||||
{
|
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
||||||
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
c.key = name;
|
||||||
c.key = name;
|
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
||||||
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
|
||||||
|
|
||||||
commands.push_back(c);
|
commands.push_back(c);
|
||||||
}
|
} else {
|
||||||
else
|
WARNING_STRICT_FATAL(true, ("Object %s has an objvar with name_id %i, which was not in the list of names.", objectId.getValueString().c_str(), i->first.m_nameId));
|
||||||
WARNING_STRICT_FATAL(true,("Object %s has an objvar with name_id %i, which was not in the list of names.",objectId.getValueString().c_str(), i->first.m_nameId));
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
void ObjvarBuffer::updateObjvars(const NetworkId &objectId, const std::vector<DynamicVariableList::MapType::Command> &commands)
|
void
|
||||||
{
|
ObjvarBuffer::updateObjvars(const NetworkId &objectId, const std::vector <DynamicVariableList::MapType::Command> &commands) {
|
||||||
bool override=false; // flag that we're dealing with the gold data override case (storing an objvar change in the live database, on an object that came from the gold database)
|
bool override = false; // flag that we're dealing with the gold data override case (storing an objvar change in the live database, on an object that came from the gold database)
|
||||||
if (ConfigServerDatabase::getEnableGoldDatabase() && objectId < ConfigServerDatabase::getMaxGoldNetworkId())
|
if (ConfigServerDatabase::getEnableGoldDatabase() && objectId < ConfigServerDatabase::getMaxGoldNetworkId()) {
|
||||||
override=true;
|
override = true;
|
||||||
|
}
|
||||||
|
|
||||||
for (std::vector<DynamicVariableList::MapType::Command>::const_iterator i=commands.begin(); i!=commands.end(); ++i)
|
for (std::vector<DynamicVariableList::MapType::Command>::const_iterator i = commands.begin();
|
||||||
{
|
i != commands.end(); ++i) {
|
||||||
switch(i->cmd)
|
switch (i->cmd) {
|
||||||
{
|
case DynamicVariableList::MapType::Command::ADD :
|
||||||
case DynamicVariableList::MapType::Command::ADD :
|
case DynamicVariableList::MapType::Command::SET : {
|
||||||
case DynamicVariableList::MapType::Command::SET :
|
std::string packedValue(Unicode::wideToUTF8(i->value.getPackedValueString()));
|
||||||
{
|
|
||||||
std::string packedValue(Unicode::wideToUTF8(i->value.getPackedValueString()));
|
|
||||||
|
|
||||||
if (i->value.getPosition() !=-1 && ConfigServerDatabase::getEnableObjvarPacking() && !override)
|
if (i->value.getPosition() != -1 && ConfigServerDatabase::getEnableObjvarPacking() && !override) {
|
||||||
{
|
m_objectTableBuffer->handlePackedObjvar(objectId, i->value.getPosition(), i->key, i->value.getType(), packedValue);
|
||||||
m_objectTableBuffer->handlePackedObjvar(objectId, i->value.getPosition(), i->key, i->value.getType(), packedValue);
|
} else {
|
||||||
}
|
int nameId = ObjvarNameManager::getInstance().getOrAddNameId(i->key);
|
||||||
else
|
|
||||||
{
|
|
||||||
int nameId = ObjvarNameManager::getInstance().getOrAddNameId(i->key);
|
|
||||||
|
|
||||||
DataType::iterator row=m_data.find(IndexKey(objectId, nameId));
|
DataType::iterator row = m_data.find(IndexKey(objectId, nameId));
|
||||||
if (row==m_data.end())
|
if (row == m_data.end()) {
|
||||||
{
|
row = m_data.insert(std::make_pair(IndexKey(objectId, nameId), ObjvarValue())).first;
|
||||||
row=m_data.insert(std::make_pair(IndexKey(objectId, nameId),ObjvarValue())).first;
|
if (i->cmd == DynamicVariableList::MapType::Command::ADD || override) {
|
||||||
if (i->cmd==DynamicVariableList::MapType::Command::ADD || override)
|
row->second.m_inDatabase = false; // new variable
|
||||||
row->second.m_inDatabase=false; // new variable
|
} else {
|
||||||
else
|
row->second.m_inDatabase = true;
|
||||||
row->second.m_inDatabase=true; // update to existing variable
|
} // update to existing variable
|
||||||
}
|
}
|
||||||
row->second.m_type = i->value.getType();
|
row->second.m_type = i->value.getType();
|
||||||
row->second.m_value = packedValue;
|
row->second.m_value = packedValue;
|
||||||
row->second.m_detached = false;
|
row->second.m_detached = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case DynamicVariableList::MapType::Command::ERASE :
|
case DynamicVariableList::MapType::Command::ERASE : {
|
||||||
{
|
int nameId = ObjvarNameManager::getInstance().getNameId(i->key);
|
||||||
int nameId = ObjvarNameManager::getInstance().getNameId(i->key);
|
if (nameId !=
|
||||||
if (nameId != 0) // It's possible to get an ERASE for a packed objvar where the name was never used in the OBJECT_VARIABLES table. We can safely ignore these.
|
0) // It's possible to get an ERASE for a packed objvar where the name was never used in the OBJECT_VARIABLES table. We can safely ignore these.
|
||||||
{
|
{
|
||||||
DataType::iterator row=m_data.find(IndexKey(objectId, nameId));
|
DataType::iterator row = m_data.find(IndexKey(objectId, nameId));
|
||||||
if (row==m_data.end())
|
if (row == m_data.end()) {
|
||||||
{
|
if (i->value.getPosition() == -1 || override) {
|
||||||
if (i->value.getPosition() == -1 || override)
|
row = m_data.insert(std::make_pair(IndexKey(objectId, nameId), ObjvarValue())).first;
|
||||||
{
|
row->second.m_inDatabase = true; // deleting existing variable
|
||||||
row=m_data.insert(std::make_pair(IndexKey(objectId, nameId),ObjvarValue())).first;
|
}
|
||||||
row->second.m_inDatabase=true; // deleting existing variable
|
// else it was a packed objvar, and no update is necessary
|
||||||
}
|
}
|
||||||
// else it was a packed objvar, and no update is necessary
|
|
||||||
}
|
|
||||||
|
|
||||||
row->second.m_type = i->value.getType();
|
row->second.m_type = i->value.getType();
|
||||||
row->second.m_detached = true; //why the fuck even store it at this point?
|
row->second.m_detached = true; //why the fuck even store it at this point?
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
WARNING_STRICT_FATAL(true,("Unknown command %i unpacked in object variables for object %s.",i->cmd,objectId.getValueString().c_str()));
|
WARNING_STRICT_FATAL(true, ("Unknown command %i unpacked in object variables for object %s.", i->cmd, objectId.getValueString().c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_WARNING(commands.size() > 100,("Object %s has a suspicious number of objvar updates (%i updates).",objectId.getValueString().c_str(),commands.size()));
|
DEBUG_WARNING(commands.size() >
|
||||||
|
100, ("Object %s has a suspicious number of objvar updates (%i updates).", objectId.getValueString().c_str(), commands.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
void ObjvarBuffer::removeObject(const NetworkId &object)
|
void ObjvarBuffer::removeObject(const NetworkId &object) {
|
||||||
{
|
DataType::iterator i = m_data.lower_bound(IndexKey(object, 0));
|
||||||
DataType::iterator i=m_data.lower_bound(IndexKey(object,0));
|
while (i != m_data.end()) {
|
||||||
while (i!=m_data.end())
|
if (i->first.m_objectId == object) {
|
||||||
{
|
i = m_data.erase(i);
|
||||||
if (i->first.m_objectId==object)
|
} else {
|
||||||
i = m_data.erase(i);
|
++i;
|
||||||
else
|
}
|
||||||
++i;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
|
|||||||
@@ -20,9 +20,8 @@
|
|||||||
// ======================================================================
|
// ======================================================================
|
||||||
|
|
||||||
class ObjectTableBuffer;
|
class ObjectTableBuffer;
|
||||||
namespace DBSchema
|
namespace DBSchema {
|
||||||
{
|
struct ObjvarRow;
|
||||||
struct ObjvarRow;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
@@ -39,92 +38,98 @@ namespace DBSchema
|
|||||||
* are loaded for that object.
|
* are loaded for that object.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class ObjvarBuffer : public AbstractTableBuffer
|
class ObjvarBuffer : public AbstractTableBuffer {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
explicit ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames);
|
explicit ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames);
|
||||||
virtual ~ObjvarBuffer(void);
|
|
||||||
|
|
||||||
virtual bool load(DB::Session *session,const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase);
|
virtual ~ObjvarBuffer(void);
|
||||||
virtual bool save(DB::Session *session);
|
|
||||||
virtual void removeObject(const NetworkId &object);
|
|
||||||
|
|
||||||
DBSchema::ObjectVariableRow *findRowByIndex(const NetworkId &objectId, const std::string &name);
|
virtual bool load(DB::Session *session, const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase);
|
||||||
|
|
||||||
void updateObjvars(const NetworkId &objectId, const std::vector<DynamicVariableList::MapType::Command> &commands);
|
virtual bool save(DB::Session *session);
|
||||||
void getObjvarsForObject(const NetworkId &objectId, std::vector<DynamicVariableList::MapType::Command> &commands) const;
|
|
||||||
|
|
||||||
private:
|
virtual void removeObject(const NetworkId &object);
|
||||||
struct IndexKey
|
|
||||||
{
|
|
||||||
const NetworkId m_objectId;
|
|
||||||
int m_nameId;
|
|
||||||
|
|
||||||
IndexKey(const NetworkId &objectId, int nameId);
|
DBSchema::ObjectVariableRow *findRowByIndex(const NetworkId &objectId, const std::string &name);
|
||||||
bool operator==(const IndexKey &rhs) const;
|
|
||||||
bool operator<(const IndexKey &rhs) const;
|
|
||||||
bool operator>(const IndexKey &rhs) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ObjvarValue
|
void updateObjvars(const NetworkId &objectId, const std::vector <DynamicVariableList::MapType::Command> &commands);
|
||||||
{
|
|
||||||
int m_type;
|
|
||||||
std::string m_value;
|
|
||||||
bool m_detached;
|
|
||||||
bool m_inDatabase;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::map<IndexKey,ObjvarValue> DataType;
|
void
|
||||||
|
getObjvarsForObject(const NetworkId &objectId, std::vector <DynamicVariableList::MapType::Command> &commands) const;
|
||||||
|
|
||||||
DB::ModeQuery::Mode m_mode;
|
private:
|
||||||
DataType m_data;
|
struct IndexKey {
|
||||||
ObjectTableBuffer *m_objectTableBuffer;
|
const NetworkId m_objectId;
|
||||||
bool m_useGoldNames;
|
int m_nameId;
|
||||||
|
|
||||||
|
IndexKey(const NetworkId &objectId, int nameId);
|
||||||
|
|
||||||
|
bool operator==(const IndexKey &rhs) const;
|
||||||
|
|
||||||
|
bool operator<(const IndexKey &rhs) const;
|
||||||
|
|
||||||
|
bool operator>(const IndexKey &rhs) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ObjvarValue {
|
||||||
|
int m_type;
|
||||||
|
std::string m_value;
|
||||||
|
bool m_detached;
|
||||||
|
bool m_inDatabase;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map <IndexKey, ObjvarValue> DataType;
|
||||||
|
|
||||||
|
DB::ModeQuery::Mode m_mode;
|
||||||
|
DataType m_data;
|
||||||
|
ObjectTableBuffer *m_objectTableBuffer;
|
||||||
|
bool m_useGoldNames;
|
||||||
|
|
||||||
// typedef std::map<NetworkId,std::vector<DBSchema::ObjectVariableRow*> > LoadIndexType;
|
// typedef std::map<NetworkId,std::vector<DBSchema::ObjectVariableRow*> > LoadIndexType;
|
||||||
// LoadIndexType m_loadIndex;
|
// LoadIndexType m_loadIndex;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ObjvarBuffer(); //disable
|
ObjvarBuffer(); //disable
|
||||||
ObjvarBuffer(const ObjvarBuffer&); //disable
|
ObjvarBuffer(const ObjvarBuffer &); //disable
|
||||||
ObjvarBuffer & operator=(const ObjvarBuffer&); //disable
|
ObjvarBuffer &operator=(const ObjvarBuffer &); //disable
|
||||||
}; //lint !e1712 // IndexKey has no default constructor
|
}; //lint !e1712 // IndexKey has no default constructor
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
|
|
||||||
inline ObjvarBuffer::IndexKey::IndexKey(const NetworkId &objectId, int nameId) : m_objectId(objectId), m_nameId(nameId)
|
inline ObjvarBuffer::IndexKey::IndexKey(const NetworkId &objectId, int nameId)
|
||||||
{
|
: m_objectId(objectId), m_nameId(nameId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
inline bool ObjvarBuffer::IndexKey::operator==(const IndexKey &rhs) const
|
inline bool ObjvarBuffer::IndexKey::operator==(const IndexKey &rhs) const {
|
||||||
{
|
return ((m_objectId == rhs.m_objectId) && (m_nameId == rhs.m_nameId));
|
||||||
return ((m_objectId == rhs.m_objectId) && (m_nameId == rhs.m_nameId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
inline bool ObjvarBuffer::IndexKey::operator<(const IndexKey &rhs) const
|
inline bool ObjvarBuffer::IndexKey::operator<(const IndexKey &rhs) const {
|
||||||
{
|
if (m_objectId < rhs.m_objectId) {
|
||||||
if (m_objectId < rhs.m_objectId)
|
return true;
|
||||||
return true;
|
}
|
||||||
|
|
||||||
if (m_objectId == rhs.m_objectId)
|
if (m_objectId == rhs.m_objectId) {
|
||||||
return (m_nameId < rhs.m_nameId);
|
return (m_nameId < rhs.m_nameId);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool ObjvarBuffer::IndexKey::operator>(const IndexKey &rhs) const
|
inline bool ObjvarBuffer::IndexKey::operator>(const IndexKey &rhs) const {
|
||||||
{
|
if (m_objectId > rhs.m_objectId) {
|
||||||
if (m_objectId > rhs.m_objectId)
|
return true;
|
||||||
return true;
|
}
|
||||||
|
|
||||||
if (m_objectId == rhs.m_objectId)
|
if (m_objectId == rhs.m_objectId) {
|
||||||
return (m_nameId > rhs.m_nameId);
|
return (m_nameId > rhs.m_nameId);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user