fixed bug in deletion of templates and derived objects (not all DCI configuration...
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 12 Nov 2017 18:51:22 +0000 (20:51 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 12 Nov 2017 18:51:22 +0000 (20:51 +0200)
sql/schema.in
src/server/core/dctable.cpp
src/server/core/template.cpp
src/server/include/nms_dcoll.h

index 446b52f..a59cfb3 100644 (file)
@@ -635,6 +635,33 @@ CREATE TABLE items
 
 CREATE INDEX idx_items_node_id ON items(node_id);
 
+/**
+ * Threshold checking rules
+ */
+CREATE TABLE thresholds
+(
+  threshold_id integer not null,
+  item_id integer not null,
+  sequence_number integer not null,
+  fire_value varchar(255) null,
+  rearm_value varchar(255) null,
+  check_function integer not null,
+  check_operation integer not null,
+  sample_count integer not null,
+  script SQL_TEXT null,
+  event_code integer not null,
+  rearm_event_code integer not null,
+  repeat_interval integer not null,
+  current_state integer not null,
+  current_severity integer not null,
+  match_count integer not null,
+  last_event_timestamp integer not null,
+  PRIMARY KEY(threshold_id)
+) TABLE_TYPE;
+
+CREATE INDEX idx_thresholds_item_id ON thresholds(item_id);
+CREATE INDEX idx_thresholds_sequence ON thresholds(sequence_number);
+
 /*
 ** Data collection tables
 */
@@ -737,8 +764,8 @@ CREATE TABLE dct_threshold_instances
 */
 CREATE TABLE dci_schedules
 (
-  schedule_id integer not null,
   item_id integer not null,
+  schedule_id integer not null,
   schedule varchar(255) null,
   PRIMARY KEY(item_id,schedule_id)
 ) TABLE_TYPE;
@@ -929,33 +956,6 @@ CREATE TABLE policy_pstorage_actions
 ) TABLE_TYPE;
 
 /*
-** Threshold checking rules
-*/
-CREATE TABLE thresholds
-(
-  threshold_id integer not null,
-  item_id integer not null,
-  sequence_number integer not null,
-  fire_value varchar(255) null,
-  rearm_value varchar(255) null,
-  check_function integer not null,
-  check_operation integer not null,
-  sample_count integer not null,
-  script SQL_TEXT null,
-  event_code integer not null,
-  rearm_event_code integer not null,
-  repeat_interval integer not null,
-  current_state integer not null,
-  current_severity integer not null,
-  match_count integer not null,
-  last_event_timestamp integer not null,
-  PRIMARY KEY(threshold_id)
-) TABLE_TYPE;
-
-CREATE INDEX idx_thresholds_item_id ON thresholds(item_id);
-CREATE INDEX idx_thresholds_sequence ON thresholds(sequence_number);
-
-/*
 ** Alarms
 */
 CREATE TABLE alarms
index a6ee881..aa858bd 100644 (file)
@@ -1128,3 +1128,21 @@ json_t *DCTable::toJson()
    json_object_set_new(root, "thresholds", json_object_array(m_thresholds));
    return root;
 }
+
+/**
+ * Get list of all threshold IDs
+ */
+IntegerArray<UINT32> *DCTable::getThresholdIdList()
+{
+   IntegerArray<UINT32> *list = new IntegerArray<UINT32>(16, 16);
+   lock();
+   if (m_thresholds != NULL)
+   {
+      for(int i = 0; i < m_thresholds->size(); i++)
+      {
+         list->add(m_thresholds->get(i)->getId());
+      }
+   }
+   unlock();
+   return list;
+}
index 04e9b3f..68d7ea3 100644 (file)
@@ -352,23 +352,102 @@ bool Template::saveToDatabase(DB_HANDLE hdb)
 bool Template::deleteFromDatabase(DB_HANDLE hdb)
 {
    bool success = NetObj::deleteFromDatabase(hdb);
+   if (!success)
+      return false;
+
+   if (getObjectClass() == OBJECT_TEMPLATE)
+   {
+      success = executeQueryOnObject(hdb, _T("DELETE FROM templates WHERE id=?"));
+      if (success)
+         success = executeQueryOnObject(hdb, _T("DELETE FROM dct_node_map WHERE template_id=?"));
+   }
+   else
+   {
+      success = executeQueryOnObject(hdb, _T("DELETE FROM dct_node_map WHERE node_id=?"));
+   }
+
+   // Delete DCI configuration
    if (success)
    {
-      if (getObjectClass() == OBJECT_TEMPLATE)
+      String listItems, listTables, listAll, listTableThresholds;
+      for(int i = 0; i < m_dcObjects->size(); i++)
+      {
+         DCObject *o = m_dcObjects->get(i);
+         if (!listAll.isEmpty())
+            listAll.append(_T(','));
+         listAll.append(o->getId());
+         if (o->getType() == DCO_TYPE_ITEM)
+         {
+            if (!listItems.isEmpty())
+               listItems.append(_T(','));
+            listItems.append(o->getId());
+         }
+         else if (o->getType() == DCO_TYPE_TABLE)
+         {
+            if (!listTables.isEmpty())
+               listTables.append(_T(','));
+            listTables.append(o->getId());
+
+            IntegerArray<UINT32> *idList = static_cast<DCTable*>(o)->getThresholdIdList();
+            for(int j = 0; j < idList->size(); j++)
+            {
+               if (!listTableThresholds.isEmpty())
+                  listTableThresholds.append(_T(','));
+               listTableThresholds.append(idList->get(j));
+            }
+            delete idList;
+         }
+      }
+
+      TCHAR query[8192];
+      if (!listItems.isEmpty())
       {
-         success = executeQueryOnObject(hdb, _T("DELETE FROM templates WHERE id=?"));
+         _sntprintf(query, 8192, _T("DELETE FROM thresholds WHERE item_id IN (%s)"), (const TCHAR *)listItems);
+         success = DBQuery(hdb, query);
          if (success)
-            success = executeQueryOnObject(hdb, _T("DELETE FROM dct_node_map WHERE template_id=?"));
+         {
+            _sntprintf(query, 8192, _T("DELETE FROM raw_dci_values WHERE item_id IN (%s)"), (const TCHAR *)listItems);
+            success = DBQuery(hdb, query);
+         }
       }
-      else
+
+      if (!listTables.isEmpty())
       {
-         success = executeQueryOnObject(hdb, _T("DELETE FROM dct_node_map WHERE node_id=?"));
+         _sntprintf(query, 8192, _T("DELETE FROM dc_table_columns WHERE table_id IN (%s)"), (const TCHAR *)listTables);
+         success = DBQuery(hdb, query);
+         if (success)
+         {
+            _sntprintf(query, 8192, _T("DELETE FROM dct_thresholds WHERE table_id IN (%s)"), (const TCHAR *)listTables);
+            success = DBQuery(hdb, query);
+         }
+      }
+
+      if (!listTableThresholds.isEmpty())
+      {
+         _sntprintf(query, 8192, _T("DELETE FROM dct_threshold_conditions WHERE threshold_id IN (%s)"), (const TCHAR *)listTableThresholds);
+         success = DBQuery(hdb, query);
+         if (success)
+         {
+            _sntprintf(query, 8192, _T("DELETE FROM dct_threshold_instances WHERE threshold_id IN (%s)"), (const TCHAR *)listTableThresholds);
+            success = DBQuery(hdb, query);
+         }
+      }
+
+      if (!listAll.isEmpty())
+      {
+         _sntprintf(query, 8192, _T("DELETE FROM dci_schedules WHERE item_id IN (%s)"), (const TCHAR *)listAll);
+         success = DBQuery(hdb, query);
       }
-      if (success)
-         success = executeQueryOnObject(hdb, _T("DELETE FROM items WHERE node_id=?"));
-      if (success)
-         success = executeQueryOnObject(hdb, _T("UPDATE items SET template_id=0 WHERE template_id=?"));
    }
+
+   if (success)
+      success = executeQueryOnObject(hdb, _T("DELETE FROM items WHERE node_id=?"));
+   if (success)
+      success = executeQueryOnObject(hdb, _T("UPDATE items SET template_id=0,template_item_id=0 WHERE template_id=?"));
+   if (success)
+      success = executeQueryOnObject(hdb, _T("DELETE FROM dc_tables WHERE node_id=?"));
+   if (success)
+      success = executeQueryOnObject(hdb, _T("UPDATE dc_tables SET template_id=0,template_item_id=0 WHERE template_id=?"));
    return success;
 }
 
index ab0d43e..1a0871a 100644 (file)
@@ -645,6 +645,7 @@ public:
    int getColumnDataType(const TCHAR *name);
    ObjectArray<DCTableColumn> *getColumns() { return m_columns; }
    Table *getLastValue();
+   IntegerArray<UINT32> *getThresholdIdList();
 
    void mergeValues(Table *dest, Table *src, int count);