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 */
}
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)
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());
+ }
}
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&)
{
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:
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);
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();
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();
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)
+ { }
};
}