Implementation of Table Summary DCI tables for desktop console
authorEriks Jenkevics <eriks@netxms.org>
Thu, 31 Aug 2017 16:08:06 +0000 (19:08 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 2 Sep 2017 08:17:12 +0000 (11:17 +0300)
16 files changed:
include/netxmsdb.h
include/nms_cscp.h
include/nms_util.h
sql/schema.in
src/java/client/netxms-base/src/main/java/org/netxms/base/NXCPCodes.java
src/java/client/netxms-client/src/main/java/org/netxms/client/datacollection/DciSummaryTable.java
src/java/netxms-eclipse/DataCollection/plugin.xml
src/java/netxms-eclipse/DataCollection/src/org/netxms/ui/eclipse/datacollection/DciSummaryTablePropertyTester.java [new file with mode: 0644]
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/libnetxms/table.cpp
src/server/core/dcst.cpp
src/server/core/dctarget.cpp
src/server/core/session.cpp
src/server/include/nms_objects.h
src/server/tools/nxdbmgr/upgrade.cpp

index 4d9f284..c1b9d08 100644 (file)
@@ -23,6 +23,6 @@
 #ifndef _netxmsdb_h
 #define _netxmsdb_h
 
-#define DB_FORMAT_VERSION   501
+#define DB_FORMAT_VERSION   502
 
 #endif
index e1cf922..f69e6d9 100644 (file)
@@ -1203,6 +1203,7 @@ typedef struct
 #define VID_LORA_APP_KEY            ((UINT32)597)
 #define VID_LORA_APP_S_KEY          ((UINT32)598)
 #define VID_LORA_NWK_S_KWY          ((UINT32)599)
+#define VID_DCI_NAME                ((UINT32)600)
 
 // Base variabe for single threshold in message
 #define VID_THRESHOLD_BASE          ((UINT32)0x00800000)
index ae54597..19c20a7 100644 (file)
@@ -1407,16 +1407,16 @@ public:
    void copyRow(Table *src, int row);
 
    int getNumRows() { return m_data->size(); }
-   int getNumColumns() { return m_columns->size(); }
+   int getNumColumns() const { return m_columns->size(); }
        const TCHAR *getTitle() { return CHECK_NULL_EX(m_title); }
    int getSource() { return m_source; }
 
    bool isExtendedFormat() { return m_extendedFormat; }
    void setExtendedFormat(bool ext) { m_extendedFormat = ext; }
 
-   const TCHAR *getColumnName(int col) { return ((col >= 0) && (col < m_columns->size())) ? m_columns->get(col)->getName() : NULL; }
-   INT32 getColumnDataType(int col) { return ((col >= 0) && (col < m_columns->size())) ? m_columns->get(col)->getDataType() : 0; }
-       int getColumnIndex(const TCHAR *name);
+   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; }
+       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); }
index 3f422cb..ce53cbe 100644 (file)
@@ -1634,6 +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,
   PRIMARY KEY(id)
 ) TABLE_TYPE;
 
index 1fb5600..2f8fa52 100644 (file)
@@ -980,6 +980,13 @@ public class NXCPCodes
    public static final long VID_FREQUENCY = 591;
    public static final long VID_SENSOR_PROXY = 592;
    public static final long VID_XML_REG_CONFIG = 593;
+   public static final long VID_REG_TYPE = 594;
+   public static final long VID_DECODER = 595;
+   public static final long VID_LORA_APP_EUI = 596;
+   public static final long VID_LORA_APP_KEY = 597;
+   public static final long VID_LORA_APP_S_KEY = 598;
+   public static final long VID_LORA_NWK_S_KWY = 599;
+   public static final long VID_DCI_NAME = 600;
 
        public static final long VID_ACL_USER_BASE = 0x00001000L;
        public static final long VID_ACL_USER_LAST = 0x00001FFFL;
index 8282454..896687c 100644 (file)
@@ -29,6 +29,8 @@ import org.netxms.base.NXCPMessage;
  */
 public class DciSummaryTable
 {
+   public static final int SUMMARY_TABLE_TABLE_VALUE = 0x0002;
+   
        private int id;
    private UUID guid;
        private String menuPath;
@@ -36,6 +38,7 @@ public class DciSummaryTable
        private int flags;
        private String nodeFilter;
        private List<DciSummaryTableColumn> columns;
+       private String tableDciName;
        
        /**
         * Create new empty summary table object
@@ -43,15 +46,16 @@ public class DciSummaryTable
         * @param menuPath The menu path
         * @param title The title
         */
-       public DciSummaryTable(String menuPath, String title)
+       public DciSummaryTable(String menuPath, String title, boolean isSingleValue)
        {
                id = 0;
       guid = UUID.randomUUID();
                this.menuPath = menuPath;
                this.title = title;
-               flags = 0;
+               flags = isSingleValue ? 0 : SUMMARY_TABLE_TABLE_VALUE;
                nodeFilter = "";
                columns = new ArrayList<DciSummaryTableColumn>();
+               tableDciName = "";
        }
        
        /**
@@ -67,6 +71,7 @@ public class DciSummaryTable
                title = msg.getFieldAsString(NXCPCodes.VID_TITLE);
                flags = msg.getFieldAsInt32(NXCPCodes.VID_FLAGS);
                nodeFilter = msg.getFieldAsString(NXCPCodes.VID_FILTER);
+               tableDciName = msg.getFieldAsString(NXCPCodes.VID_DCI_NAME);
                
                String s = msg.getFieldAsString(NXCPCodes.VID_COLUMNS);
                if ((s != null) && (s.length() > 0))
@@ -114,6 +119,7 @@ public class DciSummaryTable
                msg.setField(NXCPCodes.VID_TITLE, title);
                msg.setFieldInt32(NXCPCodes.VID_FLAGS, flags);
                msg.setField(NXCPCodes.VID_FILTER, nodeFilter);
+               msg.setField(NXCPCodes.VID_DCI_NAME, tableDciName);
                
                StringBuilder sb = new StringBuilder();
                for(DciSummaryTableColumn c : columns)
@@ -226,4 +232,32 @@ public class DciSummaryTable
        {
                return columns;
        }
+       
+       /**
+        * Check if table is single value or table value
+        * 
+        * @return true if single value
+        */
+       public boolean isSingleValue()
+       {
+          return (flags & SUMMARY_TABLE_TABLE_VALUE) > 0 ? false : true;
+       }
+       
+       /**
+        * Return table dci name
+        * @return table dci name if set
+        */
+       public String getTableDciName()
+       {
+          return tableDciName;
+       }
+       
+       /**
+        * Set table dci name
+        * @param name of table DCI
+        */
+       public void setTableDciName(String name)
+       {
+          tableDciName = name;
+       }
 }
index b1f8eca..f01fdd9 100644 (file)
               id="org.netxms.ui.eclipse.datacollection.propertypages.SummaryTableColumns#10"
               name="%page.name.Columns">
            <enabledWhen>
-              <instanceof
-                    value="org.netxms.client.datacollection.DciSummaryTable">
-              </instanceof>
+              <and>
+                 <or>
+                    <instanceof
+                          value="org.netxms.client.datacollection.DciSummaryTable">
+                    </instanceof>
+                 </or>
+                 <test
+                       forcePluginActivation="true"
+                       property="org.netxms.ui.eclipse.datacollection.isSingleValue">
+                 </test>
+              </and>
            </enabledWhen>
         </page>
         <page
             properties="isClusterObject,isTemplateObject"
             type="org.netxms.client.datacollection.DataCollectionObject">
       </propertyTester>
+      <propertyTester
+            class="org.netxms.ui.eclipse.datacollection.DciSummaryTablePropertyTester"
+            id="org.netxms.ui.eclipse.datacollection.SummaryTableDciPropertyTester"
+            namespace="org.netxms.ui.eclipse.datacollection"
+            properties="isSingleValue"
+            type="org.netxms.client.datacollection.DciSummaryTable">
+      </propertyTester>
    </extension>
    <extension
          point="org.eclipse.ui.services">
diff --git a/src/java/netxms-eclipse/DataCollection/src/org/netxms/ui/eclipse/datacollection/DciSummaryTablePropertyTester.java b/src/java/netxms-eclipse/DataCollection/src/org/netxms/ui/eclipse/datacollection/DciSummaryTablePropertyTester.java
new file mode 100644 (file)
index 0000000..832645c
--- /dev/null
@@ -0,0 +1,23 @@
+package org.netxms.ui.eclipse.datacollection;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.netxms.client.datacollection.DciSummaryTable;
+
+public class DciSummaryTablePropertyTester extends PropertyTester
+{
+   /* (non-Javadoc)
+    * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
+    */
+   @Override
+   public boolean test(Object receiver, String property, Object[] args, Object expectedValue)
+   {
+      if (!(receiver instanceof DciSummaryTable))
+         return false;
+      
+      if (property.equals("isSingleValue"))
+         return ((DciSummaryTable)receiver).isSingleValue();
+      
+      return false;
+   }
+   
+}
index 35f57dd..3ca4648 100644 (file)
 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.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;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.ui.dialogs.PropertyPage;
@@ -29,6 +33,7 @@ import org.netxms.client.NXCSession;
 import org.netxms.client.datacollection.DciSummaryTable;
 import org.netxms.ui.eclipse.datacollection.Activator;
 import org.netxms.ui.eclipse.datacollection.Messages;
+import org.netxms.ui.eclipse.datacollection.dialogs.SelectDciDialog;
 import org.netxms.ui.eclipse.jobs.ConsoleJob;
 import org.netxms.ui.eclipse.shared.ConsoleSharedData;
 import org.netxms.ui.eclipse.tools.WidgetHelper;
@@ -42,6 +47,8 @@ public class SummaryTableGeneral extends PropertyPage
        private DciSummaryTable table;
        private LabeledText menuPath;
        private LabeledText title;
+       private LabeledText dciName;
+       private Button select;
        
        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
@@ -57,20 +64,66 @@ public class SummaryTableGeneral extends PropertyPage
                layout.verticalSpacing = WidgetHelper.OUTER_SPACING;
                layout.marginWidth = 0;
                layout.marginHeight = 0;
+               layout.numColumns = 2;
       dialogArea.setLayout(layout);
       
       menuPath = new LabeledText(dialogArea, SWT.NONE);
       menuPath.setLabel(Messages.get().SummaryTableGeneral_MenuPath);
       menuPath.setText(table.getMenuPath());
-      menuPath.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+      menuPath.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
 
       title = new LabeledText(dialogArea, SWT.NONE);
       title.setLabel(Messages.get().SummaryTableGeneral_Title);
       title.setText(table.getTitle());
-      title.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+      title.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
+      
+      if (!table.isSingleValue())
+      {         
+         dciName = new LabeledText(dialogArea, SWT.NONE);
+         dciName.setLabel("DCI name");
+         dciName.getTextControl().setTextLimit(255);
+         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)
+             */
+            @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;
        }
+       
+       private void selectDci()
+       {
+          SelectDciDialog dlg = new SelectDciDialog(getShell(), 0);
+          if (dlg.open() == Window.OK)
+          {
+             table.setTableDciName(dlg.getSelection().get(0).getName());
+             dciName.setText(table.getTableDciName());
+          }
+       }
 
        /**
         * Apply changes
index bcd3615..aac7e62 100644 (file)
@@ -90,7 +90,8 @@ public class SummaryTableManager extends ViewPart
        private Map<Integer, DciSummaryTableDescriptor> descriptors = new HashMap<Integer, DciSummaryTableDescriptor>();
        
        private Action actionRefresh;
-       private Action actionCreate;
+       private Action actionCreateSingleValue;
+   private Action actionCreateTableValue;
        private Action actionEdit;
        private Action actionDelete;
        private Action actionShowFilter;
@@ -345,14 +346,22 @@ public class SummaryTableManager extends ViewPart
                        }
                };
 
-               // create add action
-               actionCreate = new Action(Messages.get().SummaryTableManager_ActionNew, SharedIcons.ADD_OBJECT) {
+               // create add action for single value table
+               actionCreateSingleValue = new Action("Create new single value table", SharedIcons.ADD_OBJECT) {
                        @Override
                        public void run()
                        {
-                               createSummaryTable();
+                               createSummaryTable(true);
                        }
                };
+               
+               actionCreateTableValue = new Action("Create new table value table", Activator.getImageDescriptor("icons/new.png")) {
+                  @Override
+                  public void run()
+                  {
+                     createSummaryTable(false);
+                  }
+               };
 
                // create edit action
                actionEdit = new Action(Messages.get().SummaryTableManager_ActionEdit, SharedIcons.EDIT) {
@@ -392,7 +401,8 @@ public class SummaryTableManager extends ViewPart
         */
        private void fillLocalPullDown(IMenuManager manager)
        {
-               manager.add(actionCreate);
+               manager.add(actionCreateSingleValue);
+      manager.add(actionCreateTableValue);
                manager.add(actionShowFilter);
                manager.add(new Separator());
                manager.add(actionRefresh);
@@ -405,7 +415,8 @@ public class SummaryTableManager extends ViewPart
         */
        private void fillLocalToolBar(IToolBarManager manager)
        {
-               manager.add(actionCreate);
+      manager.add(actionCreateSingleValue);
+      manager.add(actionCreateTableValue);
                manager.add(new Separator());
                manager.add(actionRefresh);
        }
@@ -421,7 +432,8 @@ public class SummaryTableManager extends ViewPart
                menuMgr.addMenuListener(new IMenuListener() {
                        public void menuAboutToShow(IMenuManager mgr)
                        {
-                                       mgr.add(actionCreate);
+                                       mgr.add(actionCreateSingleValue);
+                                       mgr.add(actionCreateTableValue);
                                        mgr.add(actionEdit);
                                        mgr.add(actionDelete);
                        }
@@ -438,9 +450,9 @@ public class SummaryTableManager extends ViewPart
        /**
         * Create new loyalty program
         */
-       private void createSummaryTable()
+       private void createSummaryTable(boolean isSingleValue)
        {
-               DciSummaryTable t = new DciSummaryTable("", ""); //$NON-NLS-1$ //$NON-NLS-2$
+               DciSummaryTable t = new DciSummaryTable("", "", isSingleValue); //$NON-NLS-1$ //$NON-NLS-2$
                PropertyDialog dlg = PropertyDialog.createDialogOn(getSite().getShell(), null, t);
                if (dlg != null)
                {
index 3aa0312..968f056 100644 (file)
@@ -573,7 +573,7 @@ int Table::addColumn(const TCHAR *name, INT32 dataType, const TCHAR *displayName
  * @param name column name
  * @return column index or -1 if there are no such column
  */
-int Table::getColumnIndex(const TCHAR *name)
+int Table::getColumnIndex(const TCHAR *name) const
 {
    for(int i = 0; i < m_columns->size(); i++)
       if (!_tcsicmp(name, m_columns->get(i)->getName()))
index 917fa79..98d4fca 100644 (file)
@@ -42,11 +42,11 @@ UINT32 ModifySummaryTable(NXCPMessage *msg, LONG *newId)
    DB_STATEMENT hStmt;
    if (isNew)
    {
-      hStmt = DBPrepare(hdb, _T("INSERT INTO dci_summary_tables (menu_path,title,node_filter,flags,columns,id,guid) VALUES (?,?,?,?,?,?,?)"));
+      hStmt = DBPrepare(hdb, _T("INSERT INTO dci_summary_tables (menu_path,title,node_filter,flags,columns,table_dci_name,id,guid) VALUES (?,?,?,?,?,?,?,?)"));
    }
    else
    {
-      hStmt = DBPrepare(hdb, _T("UPDATE dci_summary_tables SET menu_path=?,title=?,node_filter=?,flags=?,columns=? WHERE id=?"));
+      hStmt = DBPrepare(hdb, _T("UPDATE dci_summary_tables SET menu_path=?,title=?,node_filter=?,flags=?,columns=?,table_dci_name=? WHERE id=?"));
    }
 
    UINT32 rcc;
@@ -57,11 +57,12 @@ UINT32 ModifySummaryTable(NXCPMessage *msg, LONG *newId)
       DBBind(hStmt, 3, DB_SQLTYPE_TEXT, msg->getFieldAsString(VID_FILTER), DB_BIND_DYNAMIC);
       DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, msg->getFieldAsUInt32(VID_FLAGS));
       DBBind(hStmt, 5, DB_SQLTYPE_TEXT, msg->getFieldAsString(VID_COLUMNS), DB_BIND_DYNAMIC);
-      DBBind(hStmt, 6, DB_SQLTYPE_INTEGER, id);
+      DBBind(hStmt, 6, DB_SQLTYPE_VARCHAR, msg->getFieldAsString(VID_DCI_NAME), DB_BIND_DYNAMIC);
+      DBBind(hStmt, 7, DB_SQLTYPE_INTEGER, id);
 
       if (isNew)
       {
-         DBBind(hStmt, 7, DB_SQLTYPE_VARCHAR, uuid::generate());
+         DBBind(hStmt, 8, DB_SQLTYPE_VARCHAR, uuid::generate());
       }
 
       rcc = DBExecute(hStmt) ? RCC_SUCCESS : RCC_DB_FAILURE;
@@ -200,6 +201,7 @@ SummaryTable::SummaryTable(NXCPMessage *msg)
       m_columns->add(new SummaryTableColumn(msg, id));
       id += 10;
    }
+   msg->getFieldAsString(VID_DCI_NAME, m_tableDciName, MAX_PARAM_NAME);
 }
 
 /**
@@ -261,6 +263,7 @@ SummaryTable::SummaryTable(INT32 id, DB_RESULT hResult)
       }
       free(config);
    }
+   DBGetField(hResult, 0, 6, m_tableDciName, MAX_PARAM_NAME);
 }
 
 /**
@@ -271,7 +274,7 @@ SummaryTable *SummaryTable::loadFromDB(INT32 id, UINT32 *rcc)
    nxlog_debug(4, _T("Loading configuration for DCI summary table %d"), id);
    SummaryTable *table = NULL;
    DB_HANDLE hdb = DBConnectionPoolAcquireConnection();
-   DB_STATEMENT hStmt = DBPrepare(hdb, _T("SELECT title,flags,guid,menu_path,node_filter,columns FROM dci_summary_tables WHERE id=?"));
+   DB_STATEMENT hStmt = DBPrepare(hdb, _T("SELECT title,flags,guid,menu_path,node_filter,columns,table_dci_name FROM dci_summary_tables WHERE id=?"));
    if (hStmt != NULL)
    {
       DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, id);
@@ -344,7 +347,7 @@ bool SummaryTable::filter(DataCollectionTarget *object)
 /**
  * Create empty result table
  */
-Table *SummaryTable::createEmptyResultTable()
+Table *SummaryTable::createEmptyResultTable(const Table *source)
 {
    Table *result = new Table();
    result->setTitle(m_title);
@@ -352,9 +355,20 @@ Table *SummaryTable::createEmptyResultTable()
    result->addColumn(_T("Node"), DCI_DT_STRING);
    if (m_flags & SUMMARY_TABLE_MULTI_INSTANCE)
       result->addColumn(_T("Instance"), DCI_DT_STRING);
-   for(int i = 0; i < m_columns->size(); i++)
+
+   if (m_flags & SUMMARY_TABLE_TABLE_VALUE)
    {
-      result->addColumn(m_columns->get(i)->m_name, DCI_DT_STRING);
+      for(int i = 0; i < source->getNumColumns(); i++)
+      {
+         result->addColumn(source->getColumnName(i), source->getColumnDataType(i));
+      }
+   }
+   else
+   {
+      for(int i = 0; i < m_columns->size(); i++)
+      {
+         result->addColumn(m_columns->get(i)->m_name, DCI_DT_STRING);
+      }
    }
    return result;
 }
@@ -415,7 +429,15 @@ Table *QuerySummaryTable(LONG tableId, SummaryTable *adHocDefinition, UINT32 bas
       return NULL;
 
    ObjectArray<NetObj> *childObjects = object->getFullChildList(true, true);
-   Table *tableData = tableDefinition->createEmptyResultTable();
+   Table *tableData = NULL;
+   if (tableDefinition->getFlags() & SUMMARY_TABLE_TABLE_VALUE)
+   {
+      DCObject *o = ((DataCollectionTarget *)childObjects->get(0))->getDCObjectByName(tableDefinition->getTableDciName());
+      if (o != NULL && (o->getType() == DCO_TYPE_TABLE))
+         tableData = tableDefinition->createEmptyResultTable(((DCTable *)o)->getLastValue());
+   }
+   else
+      tableData = tableDefinition->createEmptyResultTable();
 
    for(int i = 0; i < childObjects->size(); i++)
    {
@@ -429,7 +451,10 @@ Table *QuerySummaryTable(LONG tableId, SummaryTable *adHocDefinition, UINT32 bas
 
       if (tableDefinition->filter((DataCollectionTarget *)obj))
       {
-         ((DataCollectionTarget *)obj)->getDciValuesSummary(tableDefinition, tableData);
+         if (tableDefinition->getFlags() & SUMMARY_TABLE_TABLE_VALUE)
+            ((DataCollectionTarget *)obj)->getDciValuesSummaryTableValue(tableDefinition, tableData);
+         else
+            ((DataCollectionTarget *)obj)->getDciValuesSummarySingleValue(tableDefinition, tableData);
       }
       obj->decRefCount();
    }
index 2c06cae..edb4067 100644 (file)
@@ -838,7 +838,7 @@ UINT32 DataCollectionTarget::getStringMapFromScript(const TCHAR *param, StringMa
 /**
  * Get last (current) DCI values for summary table.
  */
-void DataCollectionTarget::getDciValuesSummary(SummaryTable *tableDefinition, Table *tableData)
+void DataCollectionTarget::getDciValuesSummarySingleValue(SummaryTable *tableDefinition, Table *tableData)
 {
    int offset = tableDefinition->isMultiInstance() ? 2 : 1;
    int baseRow = tableData->getNumRows();
@@ -931,6 +931,60 @@ void DataCollectionTarget::getDciValuesSummary(SummaryTable *tableDefinition, Ta
    unlockDciAccess();
 }
 
+void DataCollectionTarget::getDciValuesSummaryTableValue(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);
+      if ((o->getType() == DCO_TYPE_TABLE) && o->hasValue() &&
+           (o->getStatus() == ITEM_STATUS_ACTIVE) &&
+           !_tcscmp(o->getName(), tableDefinition->getTableDciName()))
+      {
+         lastValue = ((DCTable*)o)->getLastValue();
+         for(int j = 0; j < lastValue->getNumRows(); j++)
+         {
+            tableData->addRow();
+            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;
+               }
+            }
+         }
+      }
+   }
+}
+
 /**
  * Must return true if object is a possible event source
  */
index 1a7072f..2b3d046 100644 (file)
@@ -12847,7 +12847,7 @@ void ClientSession::getSummaryTableDetails(NXCPMessage *request)
        {
       LONG id = (LONG)request->getFieldAsUInt32(VID_SUMMARY_TABLE_ID);
       DB_HANDLE hdb = DBConnectionPoolAcquireConnection();
-      DB_STATEMENT hStmt = DBPrepare(hdb, _T("SELECT menu_path,title,node_filter,flags,columns,guid FROM dci_summary_tables WHERE id=?"));
+      DB_STATEMENT hStmt = DBPrepare(hdb, _T("SELECT menu_path,title,node_filter,flags,columns,guid,table_dci_name FROM dci_summary_tables WHERE id=?"));
       if (hStmt != NULL)
       {
          DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, id);
@@ -12875,6 +12875,7 @@ void ClientSession::getSummaryTableDetails(NXCPMessage *request)
                }
                uuid guid = DBGetFieldGUID(hResult, 0, 5);
                msg.setField(VID_GUID, guid);
+               msg.setField(VID_DCI_NAME, DBGetField(hResult, 0, 6, buffer, 256));
             }
             else
             {
index 0c7c5c8..f73bee8 100644 (file)
@@ -389,6 +389,7 @@ public:
  * Summary table flags
  */
 #define SUMMARY_TABLE_MULTI_INSTANCE      0x0001
+#define SUMMARY_TABLE_TABLE_VALUE        0x0002
 
 /**
  * Summary table column flags
@@ -430,6 +431,7 @@ private:
    time_t m_periodStart;
    time_t m_periodEnd;
    TCHAR m_menuPath[MAX_DB_STRING];
+   TCHAR m_tableDciName[MAX_PARAM_NAME];
 
    SummaryTable(INT32 id, DB_RESULT hResult);
 
@@ -440,7 +442,7 @@ public:
    ~SummaryTable();
 
    bool filter(DataCollectionTarget *node);
-   Table *createEmptyResultTable();
+   Table *createEmptyResultTable(const Table *source = NULL);
 
    int getNumColumns() { return m_columns->size(); }
    SummaryTableColumn *getColumn(int index) { return m_columns->get(index); }
@@ -449,6 +451,9 @@ public:
    time_t getPeriodEnd() { return m_periodEnd; }
    bool isMultiInstance() { return (m_flags & SUMMARY_TABLE_MULTI_INSTANCE) ? true : false; }
 
+   UINT32 getFlags() const { return m_flags; }
+   const TCHAR *getTableDciName() const { return m_tableDciName; }
+
    void createExportRecord(String &xml);
 };
 
@@ -1111,7 +1116,8 @@ public:
    UINT32 getTableLastValues(UINT32 dciId, NXCPMessage *msg);
        UINT32 getThresholdSummary(NXCPMessage *msg, UINT32 baseId);
        UINT32 getPerfTabDCIList(NXCPMessage *pMsg);
-   void getDciValuesSummary(SummaryTable *tableDefinition, Table *tableData);
+   void getDciValuesSummarySingleValue(SummaryTable *tableDefinition, Table *tableData);
+   void getDciValuesSummaryTableValue(SummaryTable *tableDefinition, Table *tableData);
 
    void updateDciCache();
    void updateDCItemCacheSize(UINT32 dciId, UINT32 conditionId = 0);
index f96f4c3..0003aa8 100644 (file)
@@ -600,6 +600,16 @@ 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)
@@ -11954,6 +11964,7 @@ static struct
    { 457, 458, H_UpgradeFromV457 },
    { 458, 500, H_UpgradeFromV458 },
    { 500, 501, H_UpgradeFromV500 },
+   { 501, 502, H_UpgradeFromV501 },
    { 0, 0, NULL }
 };