Fix: Separately keep track of whether we've completed config and status updates.

This commit is contained in:
Gunnar Beutner 2013-08-02 15:45:50 +02:00
parent 5977bdee2d
commit 0af6393033
5 changed files with 63 additions and 6 deletions

View File

@ -281,6 +281,9 @@ void MysqlDbConnection::DeactivateObject(const DbObject::Ptr& dbobj)
std::ostringstream qbuf;
qbuf << "UPDATE " + GetTablePrefix() + "objects SET is_active = 0 WHERE object_id = " << static_cast<long>(dbref);
Query(qbuf.str());
/* Note that we're _NOT_ clearing the db refs via SetReference/SetConfigUpdate/SetStatusUpdate
* because the object is still in the database. */
}
/* caller must hold m_ConnectionMutex */
@ -368,9 +371,18 @@ void MysqlDbConnection::ExecuteQuery(const DbQuery& query)
}
if ((query.Type & DbQueryInsert) && (query.Type & DbQueryUpdate)) {
bool hasid;
ASSERT(query.Object);
if (GetInsertID(query.Object).IsValid())
if (query.ConfigUpdate)
hasid = GetConfigUpdate(query.Object);
else if (query.StatusUpdate)
hasid = GetStatusUpdate(query.Object);
else
ASSERT(!"Invalid query flags.");
if (hasid)
type = DbQueryUpdate;
else {
if (query.WhereCriteria)
@ -436,6 +448,13 @@ void MysqlDbConnection::ExecuteQuery(const DbQuery& query)
Query(qbuf.str());
if (type == DbQueryInsert && query.Object && query.UpdateObjectID)
SetInsertID(query.Object, GetLastInsertID());
if (query.Object) {
if (query.ConfigUpdate)
SetConfigUpdate(query.Object, true);
else if (query.StatusUpdate)
SetStatusUpdate(query.Object, true);
if (type == DbQueryInsert && query.ConfigUpdate)
SetInsertID(query.Object, GetLastInsertID());
}
}

View File

@ -131,6 +131,31 @@ DbReference DbConnection::GetInsertID(const DbObject::Ptr& dbobj) const
return it->second;
}
void DbConnection::SetConfigUpdate(const DbObject::Ptr& dbobj, bool hasupdate)
{
if (hasupdate)
m_ConfigUpdates.insert(dbobj);
else
m_ConfigUpdates.erase(dbobj);
}
bool DbConnection::GetConfigUpdate(const DbObject::Ptr& dbobj) const
{
return (m_ConfigUpdates.find(dbobj) != m_ConfigUpdates.end());
}
void DbConnection::SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate)
{
if (hasupdate)
m_StatusUpdates.insert(dbobj);
else
m_StatusUpdates.erase(dbobj);
}
bool DbConnection::GetStatusUpdate(const DbObject::Ptr& dbobj) const
{
return (m_StatusUpdates.find(dbobj) != m_StatusUpdates.end());
}
void DbConnection::ExecuteQuery(const DbQuery&)
{

View File

@ -48,6 +48,12 @@ public:
void SetInsertID(const DbObject::Ptr& dbobj, const DbReference& dbref);
DbReference GetInsertID(const DbObject::Ptr& dbobj) const;
void SetConfigUpdate(const DbObject::Ptr& dbobj, bool hasupdate);
bool GetConfigUpdate(const DbObject::Ptr& dbobj) const;
void SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate);
bool GetStatusUpdate(const DbObject::Ptr& dbobj) const;
String GetTablePrefix(void) const;
protected:
@ -64,6 +70,8 @@ private:
std::map<DbObject::Ptr, DbReference> m_ObjectIDs;
std::map<DbObject::Ptr, DbReference> m_InsertIDs;
std::set<DbObject::Ptr> m_ConfigUpdates;
std::set<DbObject::Ptr> m_StatusUpdates;
static Timer::Ptr m_ProgramStatusTimer;
static void ProgramStatusHandler(void);

View File

@ -89,7 +89,7 @@ void DbObject::SendConfigUpdate(void)
query.WhereCriteria = boost::make_shared<Dictionary>();
query.WhereCriteria->Set(GetType()->GetIDColumn(), GetObject());
query.Object = GetSelf();
query.UpdateObjectID = true;
query.ConfigUpdate = true;
OnQuery(query);
m_LastConfigUpdate = Utility::GetTime();
@ -114,7 +114,7 @@ void DbObject::SendStatusUpdate(void)
query.WhereCriteria = boost::make_shared<Dictionary>();
query.WhereCriteria->Set(GetType()->GetIDColumn(), GetObject());
query.Object = GetSelf();
query.UpdateObjectID = false;
query.StatusUpdate = true;
OnQuery(query);
m_LastStatusUpdate = Utility::GetTime();

View File

@ -41,7 +41,12 @@ struct DbQuery
Dictionary::Ptr Fields;
Dictionary::Ptr WhereCriteria;
boost::shared_ptr<DbObject> Object;
bool UpdateObjectID;
bool ConfigUpdate;
bool StatusUpdate;
DbQuery(void)
: Type(0), ConfigUpdate(false), StatusUpdate(false)
{ }
};
}