]> granicus.if.org Git - icinga2/commitdiff
Fix: Separately keep track of whether we've completed config and status updates.
authorGunnar Beutner <gunnar.beutner@netways.de>
Fri, 2 Aug 2013 13:45:50 +0000 (15:45 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Fri, 2 Aug 2013 13:45:50 +0000 (15:45 +0200)
components/ido_mysql/mysqldbconnection.cpp
lib/ido/dbconnection.cpp
lib/ido/dbconnection.h
lib/ido/dbobject.cpp
lib/ido/dbquery.h

index 3af6e450d3543f17b2d78bdd035bf9e986a5a242..333c079c4bf45cbb19cb134de739033be31b56d2 100644 (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());
+       }
 }
index 35768e53f94d7e31810d2295fe935b1d45191572..62e3d7894a8f223ea4322ac9f9740ec1f4c8fc1c 100644 (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&)
 {
index 0a7949ca4b5373340b635faa8822a7a56e0740b4..35b3aca4c00b36c64fcc4b2913aa1c6d1aceec87 100644 (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);
index 4f12c524263752912063270cac3484be422f7613..2fc45385d6477bc78007f14ebd8e05e1b0737d02 100644 (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();
index 71b88825e196391050977a57cc20cd46a63d0dac..a91ce70dc3ace2795b2b6c1eb4dd1e5707c5b008 100644 (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)
+       { }
 };
 
 }