DB IDO: Use upsert and session token for comment/downtime updates
authorMichael Friedrich <michael.friedrich@netways.de>
Mon, 1 Aug 2016 15:54:03 +0000 (17:54 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Tue, 2 Aug 2016 12:37:16 +0000 (14:37 +0200)
refs #12258
fixes #12288

lib/db_ido/dbevents.cpp
lib/db_ido_mysql/idomysqlconnection.cpp
lib/db_ido_mysql/schema/mysql.sql
lib/db_ido_mysql/schema/upgrade/2.5.0.sql
lib/db_ido_pgsql/idopgsqlconnection.cpp
lib/db_ido_pgsql/schema/pgsql.sql
lib/db_ido_pgsql/schema/upgrade/2.5.0.sql

index 709cc8a3cbb9853984a44cf624a117a351262ee9..847a760162df83aae8c761fd8d07cf1cffea7b24 100644 (file)
@@ -305,17 +305,6 @@ void DbEvents::AddComments(const Checkable::Ptr& checkable)
 
        std::vector<DbQuery> queries;
 
-       /* Ensure to delete all comments and then insert any or none.
-        * We must purge obsolete comments in the database at all cost. */
-
-       DbQuery query1;
-       query1.Table = "comments";
-       query1.Type = DbQueryDelete;
-       query1.Category = DbCatComment;
-       query1.WhereCriteria = new Dictionary();
-       query1.WhereCriteria->Set("object_id", checkable);
-       queries.push_back(query1);
-
        BOOST_FOREACH(const Comment::Ptr& comment, comments) {
                AddCommentInternal(queries, comment, false);
        }
@@ -326,7 +315,6 @@ void DbEvents::AddComments(const Checkable::Ptr& checkable)
 void DbEvents::AddComment(const Comment::Ptr& comment)
 {
        std::vector<DbQuery> queries;
-       RemoveCommentInternal(queries, comment);
        AddCommentInternal(queries, comment, false);
        DbObject::OnMultipleQueries(queries);
 }
@@ -382,10 +370,19 @@ void DbEvents::AddCommentInternal(std::vector<DbQuery>& queries, const Comment::
        DbQuery query1;
        if (!historical) {
                query1.Table = "comments";
+               query1.Type = DbQueryInsert | DbQueryUpdate;
+
+               fields1->Set("session_token", 0); /* DbConnection class fills in real ID */
+
+               query1.WhereCriteria = new Dictionary();
+               query1.WhereCriteria->Set("internal_comment_id", comment->GetLegacyId());
+               query1.WhereCriteria->Set("object_id", checkable);
+               query1.WhereCriteria->Set("comment_time", DbValue::FromTimestamp(entry_time));
+               query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
        } else {
                query1.Table = "commenthistory";
+               query1.Type = DbQueryInsert;
        }
-       query1.Type = DbQueryInsert;
        query1.Category = DbCatComment;
        query1.Fields = fields1;
 
@@ -520,12 +517,22 @@ void DbEvents::AddDowntimeInternal(std::vector<DbQuery>& queries, const Downtime
 
        DbQuery query1;
 
-       if (!historical)
+       if (!historical) {
                query1.Table = "scheduleddowntime";
-       else
+               query1.Type = DbQueryInsert | DbQueryUpdate;
+
+               fields1->Set("session_token", 0); /* DbConnection class fills in real ID */
+
+               query1.WhereCriteria = new Dictionary();
+               query1.WhereCriteria->Set("object_id", checkable);
+               query1.WhereCriteria->Set("internal_downtime_id", downtime->GetLegacyId());
+               query1.WhereCriteria->Set("entry_time", DbValue::FromTimestamp(downtime->GetEntryTime()));
+               query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
+       } else {
                query1.Table = "downtimehistory";
+               query1.Type = DbQueryInsert;
+       }
 
-       query1.Type = DbQueryInsert;
        query1.Category = DbCatDowntime;
        query1.Fields = fields1;
 
index c781d8f2819465eae7dafdb2d8c05a2485e70548..0c7165a696de509d70040f43f9b479bbfbb2c9f9 100644 (file)
@@ -442,6 +442,8 @@ void IdoMysqlConnection::ClearTablesBySession(void)
        ClearTableBySession("hostgroup_members");
        ClearTableBySession("servicegroup_members");
        ClearTableBySession("contactgroup_members");
+       ClearTableBySession("comments");
+       ClearTableBySession("scheduleddowntime");
 }
 
 void IdoMysqlConnection::ClearTableBySession(const String& table)
index 24c8be8a828c45b1b765f341b6ae6dc5da6823d3..b9142c78b7f0702082d9634408d33814edf80781 100644 (file)
@@ -110,6 +110,7 @@ CREATE TABLE IF NOT EXISTS icinga_comments (
   expires smallint default 0,
   expiration_time timestamp  default '0000-00-00 00:00:00',
   name TEXT character set latin1 default NULL,
+  session_token int default NULL,
   PRIMARY KEY  (comment_id),
   UNIQUE KEY instance_id (instance_id,object_id,comment_time,internal_comment_id)
 ) ENGINE=InnoDB  COMMENT='Usercomments on Icinga objects';
@@ -1669,6 +1670,8 @@ CREATE INDEX idx_cg_session_del ON icinga_contactgroup_members (instance_id, ses
 CREATE INDEX idx_cv_session_del ON icinga_customvariables (instance_id, session_token);
 CREATE INDEX idx_cvs_session_del ON icinga_customvariablestatus (instance_id, session_token);
 
+CREATE INDEX idx_comments_session_del ON icinga_comments (instance_id, session_token);
+
 -- #12107
 CREATE INDEX idx_statehistory_cleanup on icinga_statehistory(instance_id, state_time);
 
index 89fc0d873d62e949bb2cf6b7713489ac11137d50..d1ee47bd49814a858d22ab94851c867a6ae98889 100644 (file)
@@ -78,6 +78,15 @@ DROP INDEX cvs_session_del_idx ON icinga_customvariablestatus;
 CREATE INDEX idx_cv_session_del ON icinga_customvariables (instance_id, session_token);
 CREATE INDEX idx_cvs_session_del ON icinga_customvariablestatus (instance_id, session_token);
 
+-- -----------------------------------------
+-- #12258
+-- -----------------------------------------
+ALTER TABLE icinga_comments ADD COLUMN session_token INTEGER default NULL;
+ALTER TABLE icinga_scheduleddowntime ADD COLUMN session_token INTEGER default NULL;
+
+CREATE INDEX idx_comments_session_del ON icinga_comments (instance_id, session_token);
+CREATE INDEX idx_downtimes_session_del ON icinga_scheduleddowntime (instance_id, session_token);
+
 -- -----------------------------------------
 -- set dbversion
 -- -----------------------------------------
index 71a970934a38e5b4a6e15e22246052b878ca8a1b..55e2b98bda35702589e08487f412d0732d3e8c5d 100644 (file)
@@ -413,6 +413,8 @@ void IdoPgsqlConnection::ClearTablesBySession(void)
        ClearTableBySession("hostgroup_members");
        ClearTableBySession("servicegroup_members");
        ClearTableBySession("contactgroup_members");
+       ClearTableBySession("comments");
+       ClearTableBySession("scheduleddowntime");
 }
 
 void IdoPgsqlConnection::ClearTableBySession(const String& table)
index e56f4f95a405206b7fc63e8916211073c23ccf8f..afbdbe0cca3fd51d81949a0ee88e38128a0b9132 100644 (file)
@@ -136,6 +136,7 @@ CREATE TABLE  icinga_comments (
   expires INTEGER  default 0,
   expiration_time timestamp with time zone default '1970-01-01 00:00:00+00',
   name TEXT default NULL,
+  session_token INTEGER default NULL,
   CONSTRAINT PK_comment_id PRIMARY KEY (comment_id) ,
   CONSTRAINT UQ_comments UNIQUE (instance_id,object_id,comment_time,internal_comment_id)
 )  ;
@@ -1005,6 +1006,7 @@ CREATE TABLE  icinga_scheduleddowntime (
   is_in_effect INTEGER  default 0,
   trigger_time timestamp with time zone default '1970-01-01 00:00:00+00',
   name TEXT default NULL,
+  session_token INTEGER default NULL,
   CONSTRAINT PK_scheduleddowntime_id PRIMARY KEY (scheduleddowntime_id) ,
   CONSTRAINT UQ_scheduleddowntime UNIQUE (instance_id,object_id,entry_time,internal_downtime_id)
 ) ;
@@ -1695,6 +1697,9 @@ CREATE INDEX idx_hg_session_del ON icinga_hostgroup_members (instance_id, sessio
 CREATE INDEX idx_sg_session_del ON icinga_servicegroup_members (instance_id, session_token);
 CREATE INDEX idx_cg_session_del ON icinga_contactgroup_members (instance_id, session_token);
 
+CREATE INDEX idx_comments_session_del ON icinga_comments (instance_id, session_token);
+CREATE INDEX idx_downtimes_session_del ON icinga_scheduleddowntime (instance_id, session_token);
+
 CREATE INDEX idx_cv_session_del ON icinga_customvariables (instance_id, session_token);
 CREATE INDEX idx_cvs_session_del ON icinga_customvariablestatus (instance_id, session_token);
 
index ed52b2b566368679dfdb078a72eaa7b648080b4d..a5c2b5859a3e35b87a31bc5d92be984ec55734b7 100644 (file)
@@ -56,6 +56,15 @@ DROP INDEX cvs_session_del_idx;
 CREATE INDEX idx_cv_session_del ON icinga_customvariables (instance_id, session_token);
 CREATE INDEX idx_cvs_session_del ON icinga_customvariablestatus (instance_id, session_token);
 
+-- -----------------------------------------
+-- #12258
+-- -----------------------------------------
+ALTER TABLE icinga_comments ADD COLUMN session_token INTEGER default NULL;
+ALTER TABLE icinga_scheduleddowntime ADD COLUMN session_token INTEGER default NULL;
+
+CREATE INDEX idx_comments_session_del ON icinga_comments (instance_id, session_token);
+CREATE INDEX idx_downtimes_session_del ON icinga_scheduleddowntime (instance_id, session_token);
+
 -- -----------------------------------------
 -- #12107
 -- -----------------------------------------