using namespace icinga;
-REGISTER_DBTYPE(CheckCommand, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
-REGISTER_DBTYPE(EventCommand, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
-REGISTER_DBTYPE(NotificationCommand, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
+REGISTER_DBTYPE(Command, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
CommandDbObject::CommandDbObject(const DbType::Ptr& type, const String& name1, const String& name2)
: DbObject(type, name1, name2)
boost::once_flag DbConnection::m_OnceFlag = BOOST_ONCE_INIT;
DbConnection::DbConnection(void)
- : m_QueryStats(15 * 60), m_PendingQueries(0), m_PendingQueriesTimestamp(0)
+ : m_QueryStats(15 * 60), m_PendingQueries(0), m_PendingQueriesTimestamp(0), m_IDCacheValid(false)
{ }
void DbConnection::OnConfigLoaded(void)
void DbConnection::ClearIDCache(void)
{
+ SetIDCacheValid(false);
+
m_ObjectIDs.clear();
m_InsertIDs.clear();
m_ActiveObjects.clear();
boost::mutex::scoped_lock lock(m_StatsMutex);
return m_QueryStats.GetValues(span);
}
+
+bool DbConnection::IsIDCacheValid(void) const
+{
+ return m_IDCacheValid;
+}
+
+void DbConnection::SetIDCacheValid(bool valid)
+{
+ m_IDCacheValid = valid;
+}
void IncreaseQueryCount(void);
+ bool IsIDCacheValid(void) const;
+ void SetIDCacheValid(bool valid);
+
static void UpdateProgramStatus(void);
private:
+ bool m_IDCacheValid;
std::map<DbObject::Ptr, DbReference> m_ObjectIDs;
std::map<std::pair<DbType::Ptr, DbReference>, DbReference> m_InsertIDs;
std::set<DbObject::Ptr> m_ActiveObjects;
DbType::Ptr DbType::GetByName(const String& name)
{
+ String typeName;
+
+ if (name == "CheckCommand" || name == "NotificationCommand" || name == "EventCommand")
+ typeName = "Command";
+ else
+ typeName = name;
+
boost::mutex::scoped_lock lock(GetStaticMutex());
- DbType::TypeMap::const_iterator it = GetTypes().find(name);
+ DbType::TypeMap::const_iterator it = GetTypes().find(typeName);
if (it == GetTypes().end())
return DbType::Ptr();
if (!name2.IsEmpty())
objName += "!" + name2;
- dbobj->SetObject(ConfigObject::GetObject(m_Name, objName));
+ String objType = m_Name;
+
+ if (m_TypeID == DbObjectTypeCommand) {
+ if (objName.SubStr(0, 6) == "check_") {
+ objType = "CheckCommand";
+ objName = objName.SubStr(6);
+ } else if (objName.SubStr(0, 13) == "notification_") {
+ objType = "NotificationCommand";
+ objName = objName.SubStr(13);
+ } else if (objName.SubStr(0, 6) == "event_") {
+ objType = "EventCommand";
+ objName = objName.SubStr(6);
+ }
+ }
+
+ dbobj->SetObject(ConfigObject::GetObject(objType, objName));
return dbobj;
}
activeDbObjs.push_back(dbobj);
}
+ SetIDCacheValid(true);
+
BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
if (dbobj->GetObject() == NULL) {
Log(LogNotice, "IdoMysqlConnection")
return true;
}
+ if (!IsIDCacheValid())
+ return false;
+
DbReference dbrefcol;
if (DbValue::IsObjectInsertID(value)) {
bool IdoMysqlConnection::CanExecuteQuery(const DbQuery& query)
{
+ if (query.Object && !IsIDCacheValid())
+ return false;
+
if (query.WhereCriteria) {
ObjectLock olock(query.WhereCriteria);
Value value;
return;
}
+ if (!CanExecuteQuery(query)) {
+ m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, typeOverride), query.Priority);
+ return;
+ }
+
if (GetCategoryFilter() != DbCatEverything && (query.Category & GetCategoryFilter()) == 0)
return;
activeDbObjs.push_back(dbobj);
}
+ SetIDCacheValid(true);
+
BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
if (dbobj->GetObject() == NULL) {
Log(LogNotice, "IdoPgsqlConnection")
return true;
}
+ if (!IsIDCacheValid())
+ return false;
+
DbReference dbrefcol;
if (DbValue::IsObjectInsertID(value)) {
bool IdoPgsqlConnection::CanExecuteQuery(const DbQuery& query)
{
+ if (query.Object && !IsIDCacheValid())
+ return false;
+
if (query.WhereCriteria) {
ObjectLock olock(query.WhereCriteria);
Value value;
return;
}
+ if (!CanExecuteQuery(query)) {
+ m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, typeOverride), query.Priority);
+ return;
+ }
+
if (GetCategoryFilter() != DbCatEverything && (query.Category & GetCategoryFilter()) == 0)
return;