summary tables for table DCIs refactoring and minor fixes
authorVictor Kirhenshtein <victor@netxms.org>
Sat, 2 Sep 2017 09:54:47 +0000 (12:54 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 2 Sep 2017 09:54:47 +0000 (12:54 +0300)
21 files changed:
include/netxmsdb.h
include/nms_util.h
sql/schema.in
src/java/client/netxms-client/src/main/java/org/netxms/client/datacollection/DciSummaryTable.java
src/java/client/netxms-client/src/main/java/org/netxms/client/datacollection/DciSummaryTableColumn.java
src/java/client/netxms-client/src/test/java/org/netxms/client/DataCollectionTest.java
src/java/netxms-eclipse/DataCollection/plugin.xml
src/java/netxms-eclipse/DataCollection/src/org/netxms/ui/eclipse/datacollection/DciSummaryTablePropertyTester.java
src/java/netxms-eclipse/DataCollection/src/org/netxms/ui/eclipse/datacollection/propertypages/SummaryTableGeneral.java
src/java/netxms-eclipse/DataCollection/src/org/netxms/ui/eclipse/datacollection/views/SummaryTableManager.java
src/java/netxms-eclipse/DataCollection/src/org/netxms/ui/eclipse/datacollection/widgets/SummaryTableWidget.java
src/libnetxms/table.cpp
src/server/core/dcst.cpp
src/server/core/dctarget.cpp
src/server/include/nms_objects.h
src/server/tools/nxdbmgr/upgrade.cpp
webui/webapp/DataCollection/plugin.xml
webui/webapp/DataCollection/src/org/netxms/ui/eclipse/datacollection/DciSummaryTablePropertyTester.java
webui/webapp/DataCollection/src/org/netxms/ui/eclipse/datacollection/propertypages/SummaryTableGeneral.java
webui/webapp/DataCollection/src/org/netxms/ui/eclipse/datacollection/views/SummaryTableManager.java
webui/webapp/DataCollection/src/org/netxms/ui/eclipse/datacollection/widgets/SummaryTableWidget.java

index c1b9d08..a08eeff 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -23,6 +23,6 @@
 #ifndef _netxmsdb_h
 #define _netxmsdb_h
 
-#define DB_FORMAT_VERSION   502
+#define DB_FORMAT_VERSION   501
 
 #endif
index 19c20a7..55efb54 100644 (file)
@@ -1292,16 +1292,16 @@ private:
 
 public:
    TableColumnDefinition(const TCHAR *name, const TCHAR *displayName, INT32 dataType, bool isInstance);
-   TableColumnDefinition(NXCPMessage *msg, UINT32 baseId);
-   TableColumnDefinition(TableColumnDefinition *src);
+   TableColumnDefinition(const NXCPMessage *msg, UINT32 baseId);
+   TableColumnDefinition(const TableColumnDefinition *src);
    ~TableColumnDefinition();
 
-   void fillMessage(NXCPMessage *msg, UINT32 baseId);
+   void fillMessage(NXCPMessage *msg, UINT32 baseId) const;
 
-   const TCHAR *getName() { return m_name; }
-   const TCHAR *getDisplayName() { return m_displayName; }
-   INT32 getDataType() { return m_dataType; }
-   bool isInstanceColumn() { return m_instanceColumn; }
+   const TCHAR *getName() const { return m_name; }
+   const TCHAR *getDisplayName() const { return m_displayName; }
+   INT32 getDataType() const { return m_dataType; }
+   bool isInstanceColumn() const { return m_instanceColumn; }
 
    void setDataType(INT32 type) { m_dataType = type; }
    void setInstanceColumn(bool isInstance) { m_instanceColumn = isInstance; }
@@ -1416,12 +1416,14 @@ public:
 
    const TCHAR *getColumnName(int col) const { return ((col >= 0) && (col < m_columns->size())) ? m_columns->get(col)->getName() : NULL; }
    INT32 getColumnDataType(int col) const { return ((col >= 0) && (col < m_columns->size())) ? m_columns->get(col)->getDataType() : 0; }
+   const TableColumnDefinition *getColumnDefinition(int col) const { return m_columns->get(col); }
        int getColumnIndex(const TCHAR *name) const;
    ObjectArray<TableColumnDefinition> *getColumnDefinitions() { return m_columns; }
 
        void setTitle(const TCHAR *title) { safe_free(m_title); m_title = _tcsdup_ex(title); }
    void setSource(int source) { m_source = source; }
    int addColumn(const TCHAR *name, INT32 dataType = 0, const TCHAR *displayName = NULL, bool isInstance = false);
+   int addColumn(const TableColumnDefinition *d);
    void setColumnDataType(int col, INT32 dataType) { if ((col >= 0) && (col < m_columns->size())) m_columns->get(col)->setDataType(dataType); }
    int addRow();
 
index ce53cbe..f59b002 100644 (file)
@@ -1634,7 +1634,7 @@ CREATE TABLE dci_summary_tables
   node_filter SQL_TEXT null,
   flags integer not null,
   columns SQL_TEXT null,
-  table_dci_name varchar(256) null,
+  table_dci_name varchar(255) null,
   PRIMARY KEY(id)
 ) TABLE_TYPE;
 
index a01053b..63082ec 100644 (file)
@@ -29,7 +29,8 @@ import org.netxms.base.NXCPMessage;
  */
 public class DciSummaryTable
 {
-   public static final int SUMMARY_TABLE_TABLE_VALUE = 0x0002;
+   public static final int MULTI_INSTANCE = 0x0001;
+   public static final int TABLE_DCI_SOURCE = 0x0002;
    
        private int id;
    private UUID guid;
@@ -45,20 +46,31 @@ public class DciSummaryTable
         * 
         * @param menuPath The menu path
         * @param title The title
-        * @param isSingleValue if table is single value DCI
+        * @param isTableSource true if summary table's source is table DCIs
         */
-       public DciSummaryTable(String menuPath, String title, boolean isSingleValue)
+       public DciSummaryTable(String menuPath, String title, boolean isTableSource)
        {
                id = 0;
       guid = UUID.randomUUID();
                this.menuPath = menuPath;
                this.title = title;
-               flags = isSingleValue ? 0 : SUMMARY_TABLE_TABLE_VALUE;
+               flags = isTableSource ? TABLE_DCI_SOURCE : 0;
                nodeFilter = "";
                columns = new ArrayList<DciSummaryTableColumn>();
                tableDciName = "";
        }
        
+   /**
+    * Create new empty summary table object for single valued DCIs
+    * 
+    * @param menuPath The menu path
+    * @param title The title
+    */
+   public DciSummaryTable(String menuPath, String title)
+   {
+      this(menuPath, title, false);
+   }
+   
        /**
         * Create full object from NXCP message.
         * 
@@ -235,22 +247,32 @@ public class DciSummaryTable
        }
        
        /**
-        * Check if table is single value or table value
+        * Check if summary table is multi-instance
         * 
-        * @return true if single value
+        * @return true if summary table is multi-instance
         */
-       public boolean isSingleValue()
+       public boolean isMultiInstance()
        {
-          return (flags & SUMMARY_TABLE_TABLE_VALUE) > 0 ? false : true;
+          return (flags & MULTI_INSTANCE) != 0;
        }
        
+   /**
+    * Check if source is table DCI
+    * 
+    * @return true if source is table DCI
+    */
+   public boolean isTableSoure()
+   {
+      return (flags & TABLE_DCI_SOURCE) != 0;
+   }
+   
        /**
         * Return table dci name
         * @return table dci name if set
         */
        public String getTableDciName()
        {
-          return tableDciName;
+          return (tableDciName != null) ? tableDciName : "";
        }
        
        /**
index a077deb..f40f882 100644 (file)
@@ -47,6 +47,25 @@ public class DciSummaryTableColumn
                this.separator = separator;
        }
        
+   /**
+    * @param name The column name
+    * @param dciName The dci name
+    * @param flags The flags
+    */
+   public DciSummaryTableColumn(String name, String dciName, int flags)
+   {
+      this(name, dciName, flags, ";");
+   }
+   
+   /**
+    * @param name The column name
+    * @param dciName The dci name
+    */
+   public DciSummaryTableColumn(String name, String dciName)
+   {
+      this(name, dciName, 0, ";");
+   }
+   
        /**
         * Copy constructor.
         * 
index 5a96f6b..65ea48e 100644 (file)
@@ -146,14 +146,14 @@ public class DataCollectionTest extends AbstractSessionTest
                final NXCSession session = connect();
                
                DciSummaryTable t = new DciSummaryTable("test", "Test Table");
-               t.getColumns().add(new DciSummaryTableColumn("Idle", "System.CPU.Idle", 0, ";"));
-               t.getColumns().add(new DciSummaryTableColumn("I/O Wait", "System.CPU.IOWait", 0, ";"));
+               t.getColumns().add(new DciSummaryTableColumn("Idle", "System.CPU.Idle"));
+               t.getColumns().add(new DciSummaryTableColumn("I/O Wait", "System.CPU.IOWait"));
                
                int id = session.modifyDciSummaryTable(t);
                System.out.println("Assigned ID: " + id);
                t.setId(id);
 
-               t.getColumns().add(new DciSummaryTableColumn("System", "^System\\.CPU\\.Sys.*", DciSummaryTableColumn.REGEXP_MATCH, ";"));
+               t.getColumns().add(new DciSummaryTableColumn("System", "^System\\.CPU\\.Sys.*", DciSummaryTableColumn.REGEXP_MATCH));
                session.modifyDciSummaryTable(t);
                
                List<DciSummaryTableDescriptor> list = session.listDciSummaryTables();
index f01fdd9..dfe9fae 100644 (file)
               name="%page.name.Columns">
            <enabledWhen>
               <and>
-                 <or>
-                    <instanceof
-                          value="org.netxms.client.datacollection.DciSummaryTable">
-                    </instanceof>
-                 </or>
-                 <test
-                       forcePluginActivation="true"
-                       property="org.netxms.ui.eclipse.datacollection.isSingleValue">
-                 </test>
+                 <instanceof
+                       value="org.netxms.client.datacollection.DciSummaryTable">
+                 </instanceof>
+                 <not>
+                    <test
+                          forcePluginActivation="true"
+                          property="org.netxms.ui.eclipse.datacollection.isTableSource">
+                    </test>
+                 </not>
               </and>
            </enabledWhen>
         </page>
             class="org.netxms.ui.eclipse.datacollection.DciSummaryTablePropertyTester"
             id="org.netxms.ui.eclipse.datacollection.SummaryTableDciPropertyTester"
             namespace="org.netxms.ui.eclipse.datacollection"
-            properties="isSingleValue"
+            properties="isTableSource"
             type="org.netxms.client.datacollection.DciSummaryTable">
       </propertyTester>
    </extension>
index 832645c..74ba7e1 100644 (file)
@@ -14,10 +14,9 @@ public class DciSummaryTablePropertyTester extends PropertyTester
       if (!(receiver instanceof DciSummaryTable))
          return false;
       
-      if (property.equals("isSingleValue"))
-         return ((DciSummaryTable)receiver).isSingleValue();
+      if (property.equals("isTableSource"))
+         return ((DciSummaryTable)receiver).isTableSoure();
       
       return false;
    }
-   
 }
index 2b4f78c..2424936 100644 (file)
@@ -21,8 +21,8 @@ package org.netxms.ui.eclipse.datacollection.propertypages;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -48,7 +48,7 @@ public class SummaryTableGeneral extends PropertyPage
        private LabeledText menuPath;
        private LabeledText title;
        private LabeledText dciName;
-       private Button select;
+       private Button importButton;
        
        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
@@ -77,7 +77,7 @@ public class SummaryTableGeneral extends PropertyPage
       title.setText(table.getTitle());
       title.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
       
-      if (!table.isSingleValue())
+      if (table.isTableSoure())
       {         
          dciName = new LabeledText(dialogArea, SWT.NONE);
          dciName.setLabel("DCI name");
@@ -85,31 +85,19 @@ public class SummaryTableGeneral extends PropertyPage
          dciName.setText(table.getTableDciName());
          dciName.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
 
-         select = new Button(dialogArea, SWT.PUSH);
-         select.setText("Select");
-         GridData gd = new GridData(SWT.FILL);
-         gd.verticalIndent = 20;
-         select.setLayoutData(gd);
-         select.addSelectionListener(new SelectionListener() {            
-            /* (non-Javadoc)
-             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-             */
+         importButton = new Button(dialogArea, SWT.PUSH);
+         importButton.setText("Import...");
+         GridData gd = new GridData();
+         gd.verticalAlignment = SWT.BOTTOM;
+         gd.widthHint = WidgetHelper.BUTTON_WIDTH_HINT;
+         importButton.setLayoutData(gd);
+         importButton.addSelectionListener(new SelectionAdapter() {            
             @Override
             public void widgetSelected(SelectionEvent e)
             {
                selectDci();
             }
-            
-            /* (non-Javadoc)
-             * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-             */
-            @Override
-            public void widgetDefaultSelected(SelectionEvent e)
-            {
-               widgetSelected(e);               
-            }
          });
-         
       }
 
       return dialogArea;
index aac7e62..0a63b01 100644 (file)
@@ -347,19 +347,19 @@ public class SummaryTableManager extends ViewPart
                };
 
                // create add action for single value table
-               actionCreateSingleValue = new Action("Create new single value table", SharedIcons.ADD_OBJECT) {
+               actionCreateSingleValue = new Action("Create new summary table...", SharedIcons.ADD_OBJECT) {
                        @Override
                        public void run()
                        {
-                               createSummaryTable(true);
+                               createSummaryTable(false);
                        }
                };
                
-               actionCreateTableValue = new Action("Create new table value table", Activator.getImageDescriptor("icons/new.png")) {
+               actionCreateTableValue = new Action("Create new summary table for table DCIs...", Activator.getImageDescriptor("icons/new.png")) {
                   @Override
                   public void run()
                   {
-                     createSummaryTable(false);
+                     createSummaryTable(true);
                   }
                };
 
@@ -450,9 +450,9 @@ public class SummaryTableManager extends ViewPart
        /**
         * Create new loyalty program
         */
-       private void createSummaryTable(boolean isSingleValue)
+       private void createSummaryTable(boolean isTableSource)
        {
-               DciSummaryTable t = new DciSummaryTable("", "", isSingleValue); //$NON-NLS-1$ //$NON-NLS-2$
+               DciSummaryTable t = new DciSummaryTable("", "", isTableSource); //$NON-NLS-1$ //$NON-NLS-2$
                PropertyDialog dlg = PropertyDialog.createDialogOn(getSite().getShell(), null, t);
                if (dlg != null)
                {
index 16253f5..58d266d 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * NetXMS - open source network management system
- * Copyright (C) 2003-2015 Victor Kirhenshtein
+ * Copyright (C) 2003-2017 Raden Solutions
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 968f056..72e2097 100644 (file)
@@ -568,6 +568,17 @@ int Table::addColumn(const TCHAR *name, INT32 dataType, const TCHAR *displayName
 }
 
 /**
+ * Add new column
+ */
+int Table::addColumn(const TableColumnDefinition *d)
+{
+   m_columns->add(new TableColumnDefinition(d));
+   for(int i = 0; i < m_data->size(); i++)
+      m_data->get(i)->addColumn();
+   return m_columns->size() - 1;
+}
+
+/**
  * Get column index by name
  *
  * @param name column name
@@ -892,7 +903,7 @@ TableColumnDefinition::TableColumnDefinition(const TCHAR *name, const TCHAR *dis
 /**
  * Create copy of existing table column definition
  */
-TableColumnDefinition::TableColumnDefinition(TableColumnDefinition *src)
+TableColumnDefinition::TableColumnDefinition(const TableColumnDefinition *src)
 {
    m_name = _tcsdup(src->m_name);
    m_displayName = _tcsdup(src->m_displayName);
@@ -903,7 +914,7 @@ TableColumnDefinition::TableColumnDefinition(TableColumnDefinition *src)
 /**
  * Create table column definition from NXCP message
  */
-TableColumnDefinition::TableColumnDefinition(NXCPMessage *msg, UINT32 baseId)
+TableColumnDefinition::TableColumnDefinition(const NXCPMessage *msg, UINT32 baseId)
 {
    m_name = msg->getFieldAsString(baseId);
    if (m_name == NULL)
@@ -927,7 +938,7 @@ TableColumnDefinition::~TableColumnDefinition()
 /**
  * Fill message with table column definition data
  */
-void TableColumnDefinition::fillMessage(NXCPMessage *msg, UINT32 baseId)
+void TableColumnDefinition::fillMessage(NXCPMessage *msg, UINT32 baseId) const
 {
    msg->setField(baseId, m_name);
    msg->setField(baseId + 1, (UINT32)m_dataType);
index e8d5cf9..52a89aa 100644 (file)
@@ -347,7 +347,7 @@ bool SummaryTable::filter(DataCollectionTarget *object)
 /**
  * Create empty result table
  */
-Table *SummaryTable::createEmptyResultTable(const Table *source)
+Table *SummaryTable::createEmptyResultTable()
 {
    Table *result = new Table();
    result->setTitle(m_title);
@@ -356,14 +356,7 @@ Table *SummaryTable::createEmptyResultTable(const Table *source)
    if (m_flags & SUMMARY_TABLE_MULTI_INSTANCE)
       result->addColumn(_T("Instance"), DCI_DT_STRING);
 
-   if (m_flags & SUMMARY_TABLE_TABLE_VALUE)
-   {
-      for(int i = 0; i < source->getNumColumns(); i++)
-      {
-         result->addColumn(source->getColumnName(i), source->getColumnDataType(i));
-      }
-   }
-   else
+   if (!(m_flags & SUMMARY_TABLE_TABLE_DCI_SOURCE))
    {
       for(int i = 0; i < m_columns->size(); i++)
       {
@@ -376,7 +369,7 @@ Table *SummaryTable::createEmptyResultTable(const Table *source)
 /**
  * Create export record
  */
-void SummaryTable::createExportRecord(String &xml)
+void SummaryTable::createExportRecord(String &xml) const
 {
    TCHAR buffer[64];
 
@@ -392,7 +385,9 @@ void SummaryTable::createExportRecord(String &xml)
    xml.appendPreallocated(EscapeStringForXML(m_menuPath, -1));
    xml.append(_T("</path>\n\t\t\t<filter>"));
    xml.appendPreallocated(EscapeStringForXML(m_filterSource, -1));
-   xml.append(_T("</filter>\n\t\t\t<columns>\n"));
+   xml.append(_T("</filter>\n\t\t\t<tableDci>\n"));
+   xml.appendPreallocated(EscapeStringForXML(m_tableDciName, -1));
+   xml.append(_T("</tableDci>\n\t\t\t<columns>\n"));
    for(int i = 0; i < m_columns->size(); i++)
    {
       m_columns->get(i)->createExportRecord(xml, i + 1);
@@ -429,36 +424,11 @@ Table *QuerySummaryTable(LONG tableId, SummaryTable *adHocDefinition, UINT32 bas
       return NULL;
 
    ObjectArray<NetObj> *childObjects = object->getFullChildList(true, true);
-   Table *tableData = NULL, *lastValue = NULL;
-
-   if (tableDefinition->getFlags() & SUMMARY_TABLE_TABLE_VALUE)
-   {
-      for(int i = 0; i < childObjects->size(); i++)
-      {
-         if (((childObjects->get(i)->getObjectClass() == OBJECT_NODE) || (childObjects->get(i)->getObjectClass() == OBJECT_MOBILEDEVICE) ||
-             (childObjects->get(i)->getObjectClass() == OBJECT_SENSOR)) && childObjects->get(i)->checkAccessRights(userId, OBJECT_ACCESS_READ))
-         {
-            DCObject *o = ((DataCollectionTarget *)childObjects->get(i))->getDCObjectByName(tableDefinition->getTableDciName());
-            if (o != NULL && (o->getType() == DCO_TYPE_TABLE))
-            {
-               lastValue = ((DCTable *)o)->getLastValue();
-               if (lastValue != NULL)
-               {
-                  tableData = tableDefinition->createEmptyResultTable(((DCTable *)o)->getLastValue());
-                  break;
-               }
-            }
-         }
-      }
-   }
-   else
-      tableData = tableDefinition->createEmptyResultTable();
-
+   Table *tableData = tableDefinition->createEmptyResultTable();
    for(int i = 0; i < childObjects->size(); i++)
    {
       NetObj *obj = childObjects->get(i);
-      if (((obj->getObjectClass() != OBJECT_NODE) && (obj->getObjectClass() != OBJECT_MOBILEDEVICE) &&
-          (obj->getObjectClass() != OBJECT_SENSOR)) || !obj->checkAccessRights(userId, OBJECT_ACCESS_READ))
+      if (!obj->isDataCollectionTarget() || !obj->checkAccessRights(userId, OBJECT_ACCESS_READ))
       {
          obj->decRefCount();
          continue;
@@ -466,10 +436,7 @@ Table *QuerySummaryTable(LONG tableId, SummaryTable *adHocDefinition, UINT32 bas
 
       if (tableDefinition->filter((DataCollectionTarget *)obj))
       {
-         if (tableDefinition->getFlags() & SUMMARY_TABLE_TABLE_VALUE)
-            ((DataCollectionTarget *)obj)->getDciValuesSummaryTableValue(tableDefinition, tableData);
-         else
-            ((DataCollectionTarget *)obj)->getDciValuesSummarySingleValue(tableDefinition, tableData);
+         ((DataCollectionTarget *)obj)->getDciValuesSummary(tableDefinition, tableData);
       }
       obj->decRefCount();
    }
index 3de570e..5d4f41f 100644 (file)
@@ -838,7 +838,18 @@ UINT32 DataCollectionTarget::getStringMapFromScript(const TCHAR *param, StringMa
 /**
  * Get last (current) DCI values for summary table.
  */
-void DataCollectionTarget::getDciValuesSummarySingleValue(SummaryTable *tableDefinition, Table *tableData)
+void DataCollectionTarget::getDciValuesSummary(SummaryTable *tableDefinition, Table *tableData)
+{
+   if (tableDefinition->isTableDciSource())
+      getTableDciValuesSummary(tableDefinition, tableData);
+   else
+      getItemDciValuesSummary(tableDefinition, tableData);
+}
+
+/**
+ * Get last (current) DCI values for summary table using single-value DCIs
+ */
+void DataCollectionTarget::getItemDciValuesSummary(SummaryTable *tableDefinition, Table *tableData)
 {
    int offset = tableDefinition->isMultiInstance() ? 2 : 1;
    int baseRow = tableData->getNumRows();
@@ -931,57 +942,34 @@ void DataCollectionTarget::getDciValuesSummarySingleValue(SummaryTable *tableDef
    unlockDciAccess();
 }
 
-void DataCollectionTarget::getDciValuesSummaryTableValue(SummaryTable *tableDefinition, Table *tableData)
+/**
+ * Get last (current) DCI values for summary table using table DCIs
+ */
+void DataCollectionTarget::getTableDciValuesSummary(SummaryTable *tableDefinition, Table *tableData)
 {
-   DCObject *o;
-   Table *lastValue;
-   int collIndex;
-
    lockDciAccess(false);
    for(int i = 0; i < m_dcObjects->size(); i++)
    {
-      o = m_dcObjects->get(i);
+      DCObject *o = m_dcObjects->get(i);
       if ((o->getType() == DCO_TYPE_TABLE) && o->hasValue() &&
            (o->getStatus() == ITEM_STATUS_ACTIVE) &&
-           !_tcscmp(o->getName(), tableDefinition->getTableDciName()))
+           !_tcsicmp(o->getName(), tableDefinition->getTableDciName()))
       {
-         lastValue = ((DCTable*)o)->getLastValue();
+         Table *lastValue = ((DCTable*)o)->getLastValue();
          if (lastValue == NULL)
             continue;
 
          for(int j = 0; j < lastValue->getNumRows(); j++)
          {
             tableData->addRow();
+            tableData->setObjectId(m_id);
             tableData->set(0, m_name);
             for(int k = 0; k < lastValue->getNumColumns(); k++)
             {
-               collIndex = tableData->getColumnIndex(lastValue->getColumnName(k));
-               if (collIndex == -1)
-               {
-                  tableData->addColumn(lastValue->getColumnName(k), lastValue->getColumnDataType(k));
-                  collIndex = tableData->getNumColumns() - 1;
-               }
-               switch(lastValue->getColumnDataType(k))
-               {
-                  case DCI_DT_INT:
-                     tableData->set(collIndex, lastValue->getAsInt(j, k));
-                     continue;
-                  case DCI_DT_UINT:
-                     tableData->set(collIndex, lastValue->getAsUInt(j, k));
-                     continue;
-                  case DCI_DT_INT64:
-                     tableData->set(collIndex, lastValue->getAsInt64(j, k));
-                     continue;
-                  case DCI_DT_UINT64:
-                     tableData->set(collIndex, lastValue->getAsUInt64(j, k));
-                     continue;
-                  case DCI_DT_STRING:
-                     tableData->set(collIndex, lastValue->getAsString(j, k));
-                     continue;
-                  case DCI_DT_FLOAT:
-                     tableData->set(collIndex, lastValue->getAsDouble(j, k));
-                     continue;
-               }
+               int columnIndex = tableData->getColumnIndex(lastValue->getColumnName(k));
+               if (columnIndex == -1)
+                  columnIndex = tableData->addColumn(lastValue->getColumnDefinition(k));
+               tableData->set(columnIndex, lastValue->getAsString(j, k));
             }
          }
       }
index f73bee8..497ecfc 100644 (file)
@@ -389,7 +389,7 @@ public:
  * Summary table flags
  */
 #define SUMMARY_TABLE_MULTI_INSTANCE      0x0001
-#define SUMMARY_TABLE_TABLE_VALUE        0x0002
+#define SUMMARY_TABLE_TABLE_DCI_SOURCE    0x0002
 
 /**
  * Summary table column flags
@@ -442,19 +442,18 @@ public:
    ~SummaryTable();
 
    bool filter(DataCollectionTarget *node);
-   Table *createEmptyResultTable(const Table *source = NULL);
+   Table *createEmptyResultTable();
 
-   int getNumColumns() { return m_columns->size(); }
-   SummaryTableColumn *getColumn(int index) { return m_columns->get(index); }
-   AggregationFunction getAggregationFunction() { return m_aggregationFunction; }
-   time_t getPeriodStart() { return m_periodStart; }
-   time_t getPeriodEnd() { return m_periodEnd; }
-   bool isMultiInstance() { return (m_flags & SUMMARY_TABLE_MULTI_INSTANCE) ? true : false; }
-
-   UINT32 getFlags() const { return m_flags; }
+   int getNumColumns() const { return m_columns->size(); }
+   SummaryTableColumn *getColumn(int index) const { return m_columns->get(index); }
+   AggregationFunction getAggregationFunction() const { return m_aggregationFunction; }
    const TCHAR *getTableDciName() const { return m_tableDciName; }
+   time_t getPeriodStart() const { return m_periodStart; }
+   time_t getPeriodEnd() const { return m_periodEnd; }
+   bool isMultiInstance() const { return (m_flags & SUMMARY_TABLE_MULTI_INSTANCE) ? true : false; }
+   bool isTableDciSource() const { return (m_flags & SUMMARY_TABLE_TABLE_DCI_SOURCE) ? true : false; }
 
-   void createExportRecord(String &xml);
+   void createExportRecord(String &xml) const;
 };
 
 /**
@@ -1084,6 +1083,9 @@ protected:
    void applyUserTemplates();
    void updateContainerMembership();
 
+   void getItemDciValuesSummary(SummaryTable *tableDefinition, Table *tableData);
+   void getTableDciValuesSummary(SummaryTable *tableDefinition, Table *tableData);
+
    void addProxyDataCollectionElement(ProxyInfo *info, const DCObject *dco);
    void addProxySnmpTarget(ProxyInfo *info, const Node *node);
    virtual void collectProxyInfo(ProxyInfo *info);
@@ -1116,8 +1118,7 @@ public:
    UINT32 getTableLastValues(UINT32 dciId, NXCPMessage *msg);
        UINT32 getThresholdSummary(NXCPMessage *msg, UINT32 baseId);
        UINT32 getPerfTabDCIList(NXCPMessage *pMsg);
-   void getDciValuesSummarySingleValue(SummaryTable *tableDefinition, Table *tableData);
-   void getDciValuesSummaryTableValue(SummaryTable *tableDefinition, Table *tableData);
+   void getDciValuesSummary(SummaryTable *tableDefinition, Table *tableData);
 
    void updateDciCache();
    void updateDCItemCacheSize(UINT32 dciId, UINT32 conditionId = 0);
index 0003aa8..1c92896 100644 (file)
@@ -600,16 +600,6 @@ static bool SetSchemaVersion(int version)
 }
 
 /**
- * Upgrade from V501 to V502
- */
-static BOOL H_UpgradeFromV501(int currVersion, int newVersion)
-{
-   CHK_EXEC(SQLQuery(_T("ALTER TABLE dci_summary_tables ADD table_dci_name varchar(256) null")));
-   CHK_EXEC(SetSchemaVersion(502));
-   return TRUE;
-}
-
-/**
  * Upgrade from V500 to V501
  */
 static BOOL H_UpgradeFromV500(int currVersion, int newVersion)
@@ -629,9 +619,9 @@ static BOOL H_UpgradeFromV500(int currVersion, int newVersion)
 }
 
 /**
- * Upgrade from V458 to V500
+ * Upgrade from V459 to V500
  */
-static BOOL H_UpgradeFromV458(int currVersion, int newVersion)
+static BOOL H_UpgradeFromV459(int currVersion, int newVersion)
 {
    CHK_EXEC(CreateTable(
       _T("CREATE TABLE sensors (")
@@ -661,6 +651,16 @@ static BOOL H_UpgradeFromV458(int currVersion, int newVersion)
 }
 
 /**
+ * Upgrade from V458 to V459
+ */
+static BOOL H_UpgradeFromV458(int currVersion, int newVersion)
+{
+   CHK_EXEC(SQLQuery(_T("ALTER TABLE dci_summary_tables ADD table_dci_name varchar(255)")));
+   CHK_EXEC(SetSchemaVersion(459));
+   return TRUE;
+}
+
+/**
  * Upgrade from V457 to V458
  */
 static BOOL H_UpgradeFromV457(int currVersion, int newVersion)
@@ -11962,9 +11962,9 @@ static struct
    { 455, 456, H_UpgradeFromV455 },
    { 456, 457, H_UpgradeFromV456 },
    { 457, 458, H_UpgradeFromV457 },
-   { 458, 500, H_UpgradeFromV458 },
+   { 458, 459, H_UpgradeFromV458 },
+   { 459, 500, H_UpgradeFromV459 },
    { 500, 501, H_UpgradeFromV500 },
-   { 501, 502, H_UpgradeFromV501 },
    { 0, 0, NULL }
 };
 
index f01fdd9..dfe9fae 100644 (file)
               name="%page.name.Columns">
            <enabledWhen>
               <and>
-                 <or>
-                    <instanceof
-                          value="org.netxms.client.datacollection.DciSummaryTable">
-                    </instanceof>
-                 </or>
-                 <test
-                       forcePluginActivation="true"
-                       property="org.netxms.ui.eclipse.datacollection.isSingleValue">
-                 </test>
+                 <instanceof
+                       value="org.netxms.client.datacollection.DciSummaryTable">
+                 </instanceof>
+                 <not>
+                    <test
+                          forcePluginActivation="true"
+                          property="org.netxms.ui.eclipse.datacollection.isTableSource">
+                    </test>
+                 </not>
               </and>
            </enabledWhen>
         </page>
             class="org.netxms.ui.eclipse.datacollection.DciSummaryTablePropertyTester"
             id="org.netxms.ui.eclipse.datacollection.SummaryTableDciPropertyTester"
             namespace="org.netxms.ui.eclipse.datacollection"
-            properties="isSingleValue"
+            properties="isTableSource"
             type="org.netxms.client.datacollection.DciSummaryTable">
       </propertyTester>
    </extension>
index 832645c..74ba7e1 100644 (file)
@@ -14,10 +14,9 @@ public class DciSummaryTablePropertyTester extends PropertyTester
       if (!(receiver instanceof DciSummaryTable))
          return false;
       
-      if (property.equals("isSingleValue"))
-         return ((DciSummaryTable)receiver).isSingleValue();
+      if (property.equals("isTableSource"))
+         return ((DciSummaryTable)receiver).isTableSoure();
       
       return false;
    }
-   
 }
index 2b4f78c..2424936 100644 (file)
@@ -21,8 +21,8 @@ package org.netxms.ui.eclipse.datacollection.propertypages;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -48,7 +48,7 @@ public class SummaryTableGeneral extends PropertyPage
        private LabeledText menuPath;
        private LabeledText title;
        private LabeledText dciName;
-       private Button select;
+       private Button importButton;
        
        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
@@ -77,7 +77,7 @@ public class SummaryTableGeneral extends PropertyPage
       title.setText(table.getTitle());
       title.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
       
-      if (!table.isSingleValue())
+      if (table.isTableSoure())
       {         
          dciName = new LabeledText(dialogArea, SWT.NONE);
          dciName.setLabel("DCI name");
@@ -85,31 +85,19 @@ public class SummaryTableGeneral extends PropertyPage
          dciName.setText(table.getTableDciName());
          dciName.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
 
-         select = new Button(dialogArea, SWT.PUSH);
-         select.setText("Select");
-         GridData gd = new GridData(SWT.FILL);
-         gd.verticalIndent = 20;
-         select.setLayoutData(gd);
-         select.addSelectionListener(new SelectionListener() {            
-            /* (non-Javadoc)
-             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-             */
+         importButton = new Button(dialogArea, SWT.PUSH);
+         importButton.setText("Import...");
+         GridData gd = new GridData();
+         gd.verticalAlignment = SWT.BOTTOM;
+         gd.widthHint = WidgetHelper.BUTTON_WIDTH_HINT;
+         importButton.setLayoutData(gd);
+         importButton.addSelectionListener(new SelectionAdapter() {            
             @Override
             public void widgetSelected(SelectionEvent e)
             {
                selectDci();
             }
-            
-            /* (non-Javadoc)
-             * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-             */
-            @Override
-            public void widgetDefaultSelected(SelectionEvent e)
-            {
-               widgetSelected(e);               
-            }
          });
-         
       }
 
       return dialogArea;
index aac7e62..0a63b01 100644 (file)
@@ -347,19 +347,19 @@ public class SummaryTableManager extends ViewPart
                };
 
                // create add action for single value table
-               actionCreateSingleValue = new Action("Create new single value table", SharedIcons.ADD_OBJECT) {
+               actionCreateSingleValue = new Action("Create new summary table...", SharedIcons.ADD_OBJECT) {
                        @Override
                        public void run()
                        {
-                               createSummaryTable(true);
+                               createSummaryTable(false);
                        }
                };
                
-               actionCreateTableValue = new Action("Create new table value table", Activator.getImageDescriptor("icons/new.png")) {
+               actionCreateTableValue = new Action("Create new summary table for table DCIs...", Activator.getImageDescriptor("icons/new.png")) {
                   @Override
                   public void run()
                   {
-                     createSummaryTable(false);
+                     createSummaryTable(true);
                   }
                };
 
@@ -450,9 +450,9 @@ public class SummaryTableManager extends ViewPart
        /**
         * Create new loyalty program
         */
-       private void createSummaryTable(boolean isSingleValue)
+       private void createSummaryTable(boolean isTableSource)
        {
-               DciSummaryTable t = new DciSummaryTable("", "", isSingleValue); //$NON-NLS-1$ //$NON-NLS-2$
+               DciSummaryTable t = new DciSummaryTable("", "", isTableSource); //$NON-NLS-1$ //$NON-NLS-2$
                PropertyDialog dlg = PropertyDialog.createDialogOn(getSite().getShell(), null, t);
                if (dlg != null)
                {
index 16253f5..58d266d 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * NetXMS - open source network management system
- * Copyright (C) 2003-2015 Victor Kirhenshtein
+ * Copyright (C) 2003-2017 Raden Solutions
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by