DB IDO: Implement notification object insert id cache.

Refs #5103
This commit is contained in:
Michael Friedrich 2014-01-29 10:30:33 +01:00
parent fbdadea24c
commit d31ca31e90
8 changed files with 40 additions and 11 deletions

View File

@ -413,7 +413,7 @@ bool IdoMysqlConnection::FieldToEscapedString(const String& key, const Value& va
return true;
}
if (key == "notification_id") {
*result = static_cast<long>(m_LastNotificationID);
*result = static_cast<long>(GetNotificationInsertID(value));
return true;
}
@ -585,9 +585,9 @@ void IdoMysqlConnection::InternalExecuteQuery(const DbQuery& query)
SetInsertID(query.Object, GetLastInsertID());
}
if (type == DbQueryInsert && query.Table == "notifications") { // FIXME remove hardcoded table name
m_LastNotificationID = GetLastInsertID();
Log(LogDebug, "db_ido", "saving contactnotification notification_id=" + Convert::ToString(static_cast<long>(m_LastNotificationID)));
if (type == DbQueryInsert && query.Table == "notifications" && query.NotificationObject) { // FIXME remove hardcoded table name
SetNotificationInsertID(query.NotificationObject, GetLastInsertID());
Log(LogDebug, "db_ido", "saving contactnotification notification_id=" + Convert::ToString(static_cast<long>(GetLastInsertID())));
}
}

View File

@ -52,7 +52,6 @@ protected:
private:
DbReference m_InstanceID;
DbReference m_LastNotificationID;
WorkQueue m_QueryQueue;

View File

@ -416,7 +416,7 @@ bool IdoPgsqlConnection::FieldToEscapedString(const String& key, const Value& va
return true;
}
if (key == "notification_id") {
*result = static_cast<long>(m_LastNotificationID);
*result = static_cast<long>(GetNotificationInsertID(value));
return true;
}
@ -592,9 +592,11 @@ void IdoPgsqlConnection::InternalExecuteQuery(const DbQuery& query)
SetInsertID(query.Object, GetSequenceValue(GetTablePrefix() + query.Table, idField));
}
}
if (type == DbQueryInsert && query.Table == "notifications") { // FIXME remove hardcoded table name
m_LastNotificationID = GetSequenceValue(GetTablePrefix() + "notifications", "notification_id");
Log(LogDebug, "db_ido", "saving contactnotification notification_id=" + Convert::ToString(static_cast<long>(m_LastNotificationID)));
if (type == DbQueryInsert && query.Table == "notifications" && query.NotificationObject) { // FIXME remove hardcoded table name
String idField = "notification_id";
SetNotificationInsertID(query.NotificationObject, GetSequenceValue(GetTablePrefix() + query.Table, idField));
Log(LogDebug, "db_ido", "saving contactnotification notification_id=" + Convert::ToString(static_cast<long>(GetSequenceValue(GetTablePrefix() + query.Table, idField))));
}
}

View File

@ -52,7 +52,6 @@ protected:
private:
DbReference m_InstanceID;
DbReference m_LastNotificationID;
WorkQueue m_QueryQueue;

View File

@ -201,6 +201,26 @@ DbReference DbConnection::GetInsertID(const DbObject::Ptr& dbobj) const
return it->second;
}
void DbConnection::SetNotificationInsertID(const DynamicObject::Ptr& obj, const DbReference& dbref)
{
if (dbref.IsValid())
m_NotificationInsertIDs[obj] = dbref;
else
m_NotificationInsertIDs.erase(obj);
}
DbReference DbConnection::GetNotificationInsertID(const DynamicObject::Ptr& obj) const
{
std::map<DynamicObject::Ptr, DbReference>::const_iterator it;
it = m_NotificationInsertIDs.find(obj);
if (it == m_NotificationInsertIDs.end())
return DbReference();
return it->second;
}
void DbConnection::SetObjectActive(const DbObject::Ptr& dbobj, bool active)
{
if (active)
@ -218,6 +238,7 @@ void DbConnection::ClearIDCache(void)
{
m_ObjectIDs.clear();
m_InsertIDs.clear();
m_NotificationInsertIDs.clear();
m_ActiveObjects.clear();
m_ConfigUpdates.clear();
m_StatusUpdates.clear();

View File

@ -47,6 +47,9 @@ public:
void SetInsertID(const DbObject::Ptr& dbobj, const DbReference& dbref);
DbReference GetInsertID(const DbObject::Ptr& dbobj) const;
void SetNotificationInsertID(const DynamicObject::Ptr& obj, const DbReference& dbref);
DbReference GetNotificationInsertID(const DynamicObject::Ptr& obj) const;
void SetObjectActive(const DbObject::Ptr& dbobj, bool active);
bool GetObjectActive(const DbObject::Ptr& dbobj) const;
@ -72,6 +75,7 @@ protected:
private:
std::map<DbObject::Ptr, DbReference> m_ObjectIDs;
std::map<DbObject::Ptr, DbReference> m_InsertIDs;
std::map<DynamicObject::Ptr, DbReference> m_NotificationInsertIDs;
std::set<DbObject::Ptr> m_ActiveObjects;
std::set<DbObject::Ptr> m_ConfigUpdates;
std::set<DbObject::Ptr> m_StatusUpdates;

View File

@ -22,6 +22,7 @@
#include "db_ido/i2-db_ido.h"
#include "base/dictionary.h"
#include "base/dynamicobject.h"
namespace icinga
{
@ -65,6 +66,7 @@ struct I2_DB_IDO_API DbQuery
Dictionary::Ptr Fields;
Dictionary::Ptr WhereCriteria;
shared_ptr<DbObject> Object;
shared_ptr<DynamicObject> NotificationObject;
bool ConfigUpdate;
bool StatusUpdate;

View File

@ -773,6 +773,8 @@ void ServiceDbObject::AddNotificationHistory(const Notification::Ptr& notificati
query1.Table = "notifications";
query1.Type = DbQueryInsert;
query1.Category = DbCatNotification;
/* store the object ptr for caching the insert id for this object */
query1.NotificationObject = notification;
Dictionary::Ptr fields1 = make_shared<Dictionary>();
fields1->Set("notification_type", 1); /* service */
@ -821,7 +823,7 @@ void ServiceDbObject::AddNotificationHistory(const Notification::Ptr& notificati
fields2->Set("end_time", DbValue::FromTimestamp(time_bag.first));
fields2->Set("end_time_usec", time_bag.second);
fields2->Set("notification_id", 0); /* DbConnection class fills in real ID */
fields2->Set("notification_id", notification); /* DbConnection class fills in real ID from notification insert id cache */
fields2->Set("instance_id", 0); /* DbConnection class fills in real ID */
query2.Fields = fields2;