This commit is contained in:
DarthArgus
2016-12-13 20:03:32 -06:00
parent 1b39af27b2
commit 577a2dce4d
3 changed files with 1290 additions and 1444 deletions
@@ -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);
if (! (session->exec(&qry))) DBQuery::GetAllObjectVariables qry(schema);
return false;
while ((rowsFetched = qry.fetch()) > 0) if (!(session->exec(&qry))) {
{ return false;
size_t numRows = qry.getNumRowsFetched(); }
size_t count = 0;
const std::vector<DBSchema::ObjectVariableRow> &data = qry.getData();
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row=data.begin(); row!=data.end(); ++row) while ((rowsFetched = qry.fetch()) > 0) {
{ size_t numRows = qry.getNumRowsFetched();
if (++count > numRows) size_t count = 0;
{ const std::vector <DBSchema::ObjectVariableRow> &data = qry.getData();
break;
}
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
ObjvarValue value;
value.m_type=row->type.getValue();
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row = data.begin(); row != data.end(); ++row) {
value.m_value=Unicode::wideToNarrow(row->value.getValue()); if (++count > numRows) {
break;
}
m_data.insert(std::make_pair(key,value)); IndexKey key(row->object_id.getValue(), row->name_id.getValue());
} ObjvarValue value;
} value.m_type = row->type.getValue();
qry.done();
if (rowsFetched < 0)
return false;
if (usingGoldDatabase) // The string is stored in the database as utf8, so a wide-to-narrow is appropriate
{ value.m_value = Unicode::wideToNarrow(row->value.getValue());
// Check for local overrides to the gold data
DBQuery::GetObjectVariableOverrides qry(DatabaseProcess::getInstance().getSchemaQualifier(), schema);
if (! (session->exec(&qry)))
return false;
while ((rowsFetched = qry.fetch()) > 0) m_data.insert(std::make_pair(key, value));
{ }
size_t numRows = qry.getNumRowsFetched(); }
size_t count = 0;
const std::vector<DBSchema::ObjectVariableRow> &data = qry.getData();
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row=data.begin(); row!=data.end(); ++row) qry.done();
{ if (rowsFetched < 0) {
if (++count > numRows) return false;
{ }
break;
}
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
ObjvarValue value;
value.m_type=row->type.getValue();
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate if (usingGoldDatabase) {
value.m_value=Unicode::wideToNarrow(row->value.getValue()); // Check for local overrides to the gold data
DBQuery::GetObjectVariableOverrides qry(DatabaseProcess::getInstance().getSchemaQualifier(), schema);
if (!(session->exec(&qry))) {
return false;
}
value.m_detached=false; while ((rowsFetched = qry.fetch()) > 0) {
size_t numRows = qry.getNumRowsFetched();
m_data.insert(std::make_pair(key,value)); size_t count = 0;
} const std::vector <DBSchema::ObjectVariableRow> &data = qry.getData();
}
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row = data.begin();
qry.done(); row != data.end(); ++row) {
} if (++count > numRows) {
return (rowsFetched >= 0); break;
}
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
ObjvarValue value;
value.m_type = row->type.getValue();
// 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_detached = false;
m_data.insert(std::make_pair(key, value));
}
}
qry.done();
}
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();
DBQuery::RemoveObjectVariableQuery removeQuery; updateQuery.freeData();
if (!removeQuery.setupData(session)) }
return false;
for (DataType::iterator i=m_data.begin(); i!=m_data.end(); ++i) {
{ DBQuery::RemoveObjectVariableQuery removeQuery;
if (i->second.m_detached && i->second.m_inDatabase) if (!removeQuery.setupData(session)) {
if (!removeQuery.addData(i->first.m_objectId, i->first.m_nameId)) return false;
return false; }
if (removeQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) for (DataType::iterator i = m_data.begin(); i != m_data.end(); ++i) {
{ if (i->second.m_detached && i->second.m_inDatabase) {
if (! (session->exec(&removeQuery))) if (!removeQuery.addData(i->first.m_objectId, i->first.m_nameId)) {
return false; return false;
removeQuery.clearData(); }
} }
} if (removeQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) {
if (removeQuery.getNumItems() != 0) if (!(session->exec(&removeQuery))) {
if (! (session->exec(&removeQuery))) return false;
return false; }
removeQuery.done(); removeQuery.clearData();
removeQuery.freeData(); }
} }
return true; if (removeQuery.getNumItems() != 0) {
if (!(session->exec(&removeQuery))) {
return false;
}
}
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)
{
c.cmd = DynamicVariableList::MapType::Command::ADD;
c.key = name;
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
commands.push_back(c);
}
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));
}
}
//packed object variables
m_objectTableBuffer->getObjvarsForObject(objectId, commands);
// Apply overrides, if any. if (foundName) {
// 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 c.cmd = DynamicVariableList::MapType::Command::ADD;
c.key = name;
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
{ commands.push_back(c);
for (DataType::const_iterator i= m_data.lower_bound(IndexKey(objectId,0)); (i!=m_data.end()) && (i->first.m_objectId==objectId); ++i) } 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));
std::string name; }
bool foundName = false; }
foundName=ObjvarNameManager::getInstance().getName(i->first.m_nameId, name); // overrides always use the live names, not the gold names. }
if (foundName) //packed object variables
{
c.cmd = DynamicVariableList::MapType::Command::ADD; m_objectTableBuffer->getObjvarsForObject(objectId, commands);
c.key = name;
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value)); // 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
commands.push_back(c);
} {
else for (DataType::const_iterator i = m_data.lower_bound(IndexKey(objectId, 0));
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)); (i != m_data.end()) && (i->first.m_objectId == objectId); ++i) {
} std::string name;
} bool foundName = false;
foundName = ObjvarNameManager::getInstance().getName(i->first.m_nameId, name); // overrides always use the live names, not the gold names.
if (foundName) {
c.cmd = DynamicVariableList::MapType::Command::ADD;
c.key = name;
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
commands.push_back(c);
} 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));
}
}
}
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
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)
{
switch(i->cmd)
{
case DynamicVariableList::MapType::Command::ADD :
case DynamicVariableList::MapType::Command::SET :
{
std::string packedValue(Unicode::wideToUTF8(i->value.getPackedValueString()));
if (i->value.getPosition() !=-1 && ConfigServerDatabase::getEnableObjvarPacking() && !override) for (std::vector<DynamicVariableList::MapType::Command>::const_iterator i = commands.begin();
{ i != commands.end(); ++i) {
m_objectTableBuffer->handlePackedObjvar(objectId, i->value.getPosition(), i->key, i->value.getType(), packedValue); switch (i->cmd) {
} case DynamicVariableList::MapType::Command::ADD :
else case DynamicVariableList::MapType::Command::SET : {
{ std::string packedValue(Unicode::wideToUTF8(i->value.getPackedValueString()));
int nameId = ObjvarNameManager::getInstance().getOrAddNameId(i->key);
DataType::iterator row=m_data.find(IndexKey(objectId, nameId));
if (row==m_data.end())
{
row=m_data.insert(std::make_pair(IndexKey(objectId, nameId),ObjvarValue())).first;
if (i->cmd==DynamicVariableList::MapType::Command::ADD || override)
row->second.m_inDatabase=false; // new variable
else
row->second.m_inDatabase=true; // update to existing variable
}
row->second.m_type = i->value.getType();
row->second.m_value = packedValue;
row->second.m_detached = false;
}
break;
}
case DynamicVariableList::MapType::Command::ERASE :
{
int nameId = ObjvarNameManager::getInstance().getNameId(i->key);
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.
{
DataType::iterator row=m_data.find(IndexKey(objectId, nameId));
if (row==m_data.end())
{
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
}
// else it was a packed objvar, and no update is necessary
}
row->second.m_type = i->value.getType(); if (i->value.getPosition() != -1 && ConfigServerDatabase::getEnableObjvarPacking() && !override) {
row->second.m_detached = true; //why the fuck even store it at this point? m_objectTableBuffer->handlePackedObjvar(objectId, i->value.getPosition(), i->key, i->value.getType(), packedValue);
} } else {
int nameId = ObjvarNameManager::getInstance().getOrAddNameId(i->key);
break; DataType::iterator row = m_data.find(IndexKey(objectId, nameId));
} if (row == m_data.end()) {
row = m_data.insert(std::make_pair(IndexKey(objectId, nameId), ObjvarValue())).first;
default: if (i->cmd == DynamicVariableList::MapType::Command::ADD || override) {
WARNING_STRICT_FATAL(true,("Unknown command %i unpacked in object variables for object %s.",i->cmd,objectId.getValueString().c_str())); row->second.m_inDatabase = false; // new variable
} } else {
} row->second.m_inDatabase = true;
} // update to existing variable
}
row->second.m_type = i->value.getType();
row->second.m_value = packedValue;
row->second.m_detached = false;
}
break;
}
DEBUG_WARNING(commands.size() > 100,("Object %s has a suspicious number of objvar updates (%i updates).",objectId.getValueString().c_str(),commands.size())); case DynamicVariableList::MapType::Command::ERASE : {
int nameId = ObjvarNameManager::getInstance().getNameId(i->key);
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.
{
DataType::iterator row = m_data.find(IndexKey(objectId, nameId));
if (row == m_data.end()) {
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
}
// else it was a packed objvar, and no update is necessary
}
row->second.m_type = i->value.getType();
row->second.m_detached = true; //why the fuck even store it at this point?
}
break;
}
default:
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()));
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
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 bool save(DB::Session *session);
virtual void removeObject(const NetworkId &object);
DBSchema::ObjectVariableRow *findRowByIndex(const NetworkId &objectId, const std::string &name);
void updateObjvars(const NetworkId &objectId, const std::vector<DynamicVariableList::MapType::Command> &commands); virtual ~ObjvarBuffer(void);
void getObjvarsForObject(const NetworkId &objectId, std::vector<DynamicVariableList::MapType::Command> &commands) const;
private:
struct IndexKey
{
const NetworkId m_objectId;
int m_nameId;
IndexKey(const NetworkId &objectId, int nameId); virtual bool load(DB::Session *session, const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase);
bool operator==(const IndexKey &rhs) const;
bool operator<(const IndexKey &rhs) const;
bool operator>(const IndexKey &rhs) const;
};
struct ObjvarValue virtual bool save(DB::Session *session);
{
int m_type;
std::string m_value;
bool m_detached;
bool m_inDatabase;
};
typedef std::map<IndexKey,ObjvarValue> DataType; virtual void removeObject(const NetworkId &object);
DB::ModeQuery::Mode m_mode; DBSchema::ObjectVariableRow *findRowByIndex(const NetworkId &objectId, const std::string &name);
DataType m_data;
ObjectTableBuffer *m_objectTableBuffer; void updateObjvars(const NetworkId &objectId, const std::vector <DynamicVariableList::MapType::Command> &commands);
bool m_useGoldNames;
void
getObjvarsForObject(const NetworkId &objectId, std::vector <DynamicVariableList::MapType::Command> &commands) const;
private:
struct IndexKey {
const NetworkId m_objectId;
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