Added UINT32 and UINT64 to DCI data types (not tested yet)
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 26 Sep 2004 16:46:34 +0000 (16:46 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 26 Sep 2004 16:46:34 +0000 (16:46 +0000)
TODO
include/nxclapi.h
src/libnxcl/datacoll.cpp
src/server/core/dcitem.cpp
src/server/core/dcithreshold.cpp
src/server/core/discovery.cpp
src/server/core/nms_dcoll.h
src/server/core/np.cpp
src/server/core/session.cpp

diff --git a/TODO b/TODO
index f24af19..6486135 100644 (file)
--- a/TODO
+++ b/TODO
@@ -22,7 +22,6 @@ GENERAL:
 - Allow converting counters to deltas in data collection
 - Change usage of MultiByteToWideChar() and WideCharToMultiByte() to
   wctomb() and mbtowc()
-- Add forced node polls (status and configuration)
 
 
 SERVER:
index 0b4bf41..19c3440 100644 (file)
@@ -305,10 +305,12 @@ typedef unsigned long HREQUEST;
 // Data types
 //
 
-#define DCI_DT_INTEGER     0
-#define DCI_DT_INT64       1
-#define DCI_DT_STRING      2
-#define DCI_DT_FLOAT       3
+#define DCI_DT_INT         0
+#define DCI_DT_UINT        1
+#define DCI_DT_INT64       2
+#define DCI_DT_UINT64      3
+#define DCI_DT_STRING      4
+#define DCI_DT_FLOAT       5
 
 
 //
index 7548308..965d69d 100644 (file)
@@ -77,10 +77,12 @@ void ProcessDCI(CSCPMessage *pMsg)
                m_pItemList->pItems[i].pThresholdList[j].wOperation = ntohs(dct.wOperation);
                switch(m_pItemList->pItems[i].iDataType)
                {
-                  case DCI_DT_INTEGER:
+                  case DCI_DT_INT:
+                  case DCI_DT_UINT:
                      m_pItemList->pItems[i].pThresholdList[j].value.dwInt32 = ntohl(dct.value.dwInt32);
                      break;
                   case DCI_DT_INT64:
+                  case DCI_DT_UINT64:
                      m_pItemList->pItems[i].pThresholdList[j].value.qwInt64 = ntohq(dct.value.qwInt64);
                      break;
                   case DCI_DT_FLOAT:
@@ -263,10 +265,12 @@ DWORD LIBNXCL_EXPORTABLE NXCUpdateDCI(DWORD dwNodeId, NXC_DCI *pItem)
       dct.wOperation = htons(pItem->pThresholdList[i].wOperation);
       switch(pItem->iDataType)
       {
-         case DCI_DT_INTEGER:
+         case DCI_DT_INT:
+         case DCI_DT_UINT:
             dct.value.dwInt32 = htonl(pItem->pThresholdList[i].value.dwInt32);
             break;
          case DCI_DT_INT64:
+         case DCI_DT_UINT64:
             dct.value.qwInt64 = htonq(pItem->pThresholdList[i].value.qwInt64);
             break;
          case DCI_DT_FLOAT:
@@ -422,9 +426,14 @@ DWORD LIBNXCL_EXPORTABLE NXCGetDCIData(DWORD dwNodeId, DWORD dwItemId, DWORD dwM
             pDst->dwTimeStamp = ntohl(pSrc->dwTimeStamp);
             switch((*ppData)->wDataType)
             {
-               case DCI_DT_INTEGER:
+               case DCI_DT_INT:
+               case DCI_DT_UINT:
                   pDst->value.dwInt32 = ntohl(pSrc->value.dwInteger);
                   break;
+               case DCI_DT_INT64:
+               case DCI_DT_UINT64:
+                  pDst->value.qwInt64 = ntohq(pSrc->value.qwInt64);
+                  break;
                case DCI_DT_FLOAT:
                   pDst->value.dFloat = ntohd(pSrc->value.dFloat);
                   break;
index 84c8f53..e3ec89c 100644 (file)
@@ -34,7 +34,7 @@ DCItem::DCItem()
    m_dwNumThresholds = 0;
    m_ppThresholdList = NULL;
    m_iBusy = 0;
-   m_iDataType = DCI_DT_INTEGER;
+   m_iDataType = DCI_DT_INT;
    m_iPollingInterval = 3600;
    m_iRetentionTime = 0;
    m_iDeltaCalculation = DCM_ORIGINAL_VALUE;
@@ -456,12 +456,18 @@ void DCItem::Transform(ItemValue &value)
       case DCM_SIMPLE:
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
+            case DCI_DT_INT:
                value = (long)value - (long)m_prevRawValue;
                break;
+            case DCI_DT_UINT:
+               value = (DWORD)value - (DWORD)m_prevRawValue;
+               break;
             case DCI_DT_INT64:
                value = (INT64)value - (INT64)m_prevRawValue;
                break;
+            case DCI_DT_UINT64:
+               value = (QWORD)value - (QWORD)m_prevRawValue;
+               break;
             case DCI_DT_FLOAT:
                value = (double)value - (double)m_prevRawValue;
                break;
index df189b8..7819c5b 100644 (file)
@@ -64,12 +64,18 @@ Threshold::Threshold(DB_RESULT hResult, int iRow, DCItem *pRelatedItem)
 
    switch(m_iDataType)
    {
-      case DCI_DT_INTEGER:
-         m_value.iInteger = strtol(m_pszValueStr, NULL, 0);
+      case DCI_DT_INT:
+         m_value.iInt = strtol(m_pszValueStr, NULL, 0);
+         break;
+      case DCI_DT_UINT:
+         m_value.dwUInt = strtoul(m_pszValueStr, NULL, 0);
          break;
       case DCI_DT_INT64:
          /* TODO: add 64-bit string to binary conversion */
          break;
+      case DCI_DT_UINT64:
+         /* TODO: add 64-bit string to binary conversion */
+         break;
       case DCI_DT_FLOAT:
          m_value.dFloat = strtod(m_pszValueStr, NULL);
          break;
@@ -151,8 +157,10 @@ int Threshold::Check(ItemValue &value)
    union
    {
       const char *pszStr;
-      int iInteger;
-      INT64 qwInt64;
+      long iInt;
+      DWORD dwUInt;
+      INT64 iInt64;
+      QWORD qwUInt64;
       double dFloat;
    } fvalue;
 
@@ -162,11 +170,17 @@ int Threshold::Check(ItemValue &value)
       case F_LAST:         // Check last value only
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
-               fvalue.iInteger = (long)value;
+            case DCI_DT_INT:
+               fvalue.iInt = (long)value;
+               break;
+            case DCI_DT_UINT:
+               fvalue.dwUInt = (DWORD)value;
                break;
             case DCI_DT_INT64:
-               fvalue.qwInt64 = (INT64)value;
+               fvalue.iInt64 = (INT64)value;
+               break;
+            case DCI_DT_UINT64:
+               fvalue.qwUInt64 = (QWORD)value;
                break;
             case DCI_DT_FLOAT:
                fvalue.dFloat = (double)value;
@@ -195,11 +209,17 @@ int Threshold::Check(ItemValue &value)
       case OP_LE:    // Less
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
-               bMatch = (fvalue.iInteger < m_value.iInteger);
+            case DCI_DT_INT:
+               bMatch = (fvalue.iInt < m_value.iInt);
+               break;
+            case DCI_DT_UINT:
+               bMatch = (fvalue.dwUInt < m_value.dwUInt);
                break;
             case DCI_DT_INT64:
-               bMatch = (fvalue.qwInt64 < m_value.qwInt64);
+               bMatch = (fvalue.iInt64 < m_value.iInt64);
+               break;
+            case DCI_DT_UINT64:
+               bMatch = (fvalue.qwUInt64 < m_value.qwUInt64);
                break;
             case DCI_DT_FLOAT:
                bMatch = (fvalue.dFloat < m_value.dFloat);
@@ -209,11 +229,17 @@ int Threshold::Check(ItemValue &value)
       case OP_LE_EQ: // Less or equal
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
-               bMatch = (fvalue.iInteger <= m_value.iInteger);
+            case DCI_DT_INT:
+               bMatch = (fvalue.iInt <= m_value.iInt);
+               break;
+            case DCI_DT_UINT:
+               bMatch = (fvalue.dwUInt <= m_value.dwUInt);
                break;
             case DCI_DT_INT64:
-               bMatch = (fvalue.qwInt64 <= m_value.qwInt64);
+               bMatch = (fvalue.iInt64 <= m_value.iInt64);
+               break;
+            case DCI_DT_UINT64:
+               bMatch = (fvalue.qwUInt64 <= m_value.qwUInt64);
                break;
             case DCI_DT_FLOAT:
                bMatch = (fvalue.dFloat <= m_value.dFloat);
@@ -223,11 +249,17 @@ int Threshold::Check(ItemValue &value)
       case OP_EQ:    // Equal
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
-               bMatch = (fvalue.iInteger == m_value.iInteger);
+            case DCI_DT_INT:
+               bMatch = (fvalue.iInt == m_value.iInt);
+               break;
+            case DCI_DT_UINT:
+               bMatch = (fvalue.dwUInt == m_value.dwUInt);
                break;
             case DCI_DT_INT64:
-               bMatch = (fvalue.qwInt64 == m_value.qwInt64);
+               bMatch = (fvalue.iInt64 == m_value.iInt64);
+               break;
+            case DCI_DT_UINT64:
+               bMatch = (fvalue.qwUInt64 == m_value.qwUInt64);
                break;
             case DCI_DT_FLOAT:
                bMatch = (fvalue.dFloat == m_value.dFloat);
@@ -240,11 +272,17 @@ int Threshold::Check(ItemValue &value)
       case OP_GT_EQ: // Greater or equal
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
-               bMatch = (fvalue.iInteger >= m_value.iInteger);
+            case DCI_DT_INT:
+               bMatch = (fvalue.iInt >= m_value.iInt);
+               break;
+            case DCI_DT_UINT:
+               bMatch = (fvalue.dwUInt >= m_value.dwUInt);
                break;
             case DCI_DT_INT64:
-               bMatch = (fvalue.qwInt64 >= m_value.qwInt64);
+               bMatch = (fvalue.iInt64 >= m_value.iInt64);
+               break;
+            case DCI_DT_UINT64:
+               bMatch = (fvalue.qwUInt64 >= m_value.qwUInt64);
                break;
             case DCI_DT_FLOAT:
                bMatch = (fvalue.dFloat >= m_value.dFloat);
@@ -254,11 +292,17 @@ int Threshold::Check(ItemValue &value)
       case OP_GT:    // Greater
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
-               bMatch = (fvalue.iInteger > m_value.iInteger);
+            case DCI_DT_INT:
+               bMatch = (fvalue.iInt > m_value.iInt);
+               break;
+            case DCI_DT_UINT:
+               bMatch = (fvalue.dwUInt > m_value.dwUInt);
                break;
             case DCI_DT_INT64:
-               bMatch = (fvalue.qwInt64 > m_value.qwInt64);
+               bMatch = (fvalue.iInt64 > m_value.iInt64);
+               break;
+            case DCI_DT_UINT64:
+               bMatch = (fvalue.qwUInt64 > m_value.qwUInt64);
                break;
             case DCI_DT_FLOAT:
                bMatch = (fvalue.dFloat > m_value.dFloat);
@@ -268,11 +312,17 @@ int Threshold::Check(ItemValue &value)
       case OP_NE:    // Not equal
          switch(m_iDataType)
          {
-            case DCI_DT_INTEGER:
-               bMatch = (fvalue.iInteger != m_value.iInteger);
+            case DCI_DT_INT:
+               bMatch = (fvalue.iInt != m_value.iInt);
+               break;
+            case DCI_DT_UINT:
+               bMatch = (fvalue.dwUInt != m_value.dwUInt);
                break;
             case DCI_DT_INT64:
-               bMatch = (fvalue.qwInt64 != m_value.qwInt64);
+               bMatch = (fvalue.iInt64 != m_value.iInt64);
+               break;
+            case DCI_DT_UINT64:
+               bMatch = (fvalue.qwUInt64 != m_value.qwUInt64);
                break;
             case DCI_DT_FLOAT:
                bMatch = (fvalue.dFloat != m_value.dFloat);
@@ -317,11 +367,17 @@ void Threshold::CreateMessage(DCI_THRESHOLD *pData)
    pData->dwArg2 = htonl(m_iParam2);
    switch(m_iDataType)
    {
-      case DCI_DT_INTEGER:
-         pData->value.dwInt32 = htonl(m_value.iInteger);
+      case DCI_DT_INT:
+         pData->value.dwInt32 = htonl(m_value.iInt);
+         break;
+      case DCI_DT_UINT:
+         pData->value.dwInt32 = htonl(m_value.dwUInt);
          break;
       case DCI_DT_INT64:
-         pData->value.qwInt64 = htonq(m_value.qwInt64);
+         pData->value.qwInt64 = htonq(m_value.iInt64);
+         break;
+      case DCI_DT_UINT64:
+         pData->value.qwInt64 = htonq(m_value.qwUInt64);
          break;
       case DCI_DT_FLOAT:
          pData->value.dFloat = htond(m_value.dFloat);
@@ -349,18 +405,32 @@ void Threshold::UpdateFromMessage(DCI_THRESHOLD *pData)
    safe_free(m_pszValueStr);
    switch(m_iDataType)
    {
-      case DCI_DT_INTEGER:
-         m_value.iInteger = ntohl(pData->value.dwInt32);
+      case DCI_DT_INT:
+         m_value.iInt = (long)ntohl(pData->value.dwInt32);
          m_pszValueStr = (char *)malloc(32);
-         sprintf(m_pszValueStr, "%ld", m_value.iInteger);
+         sprintf(m_pszValueStr, "%ld", m_value.iInt);
+         break;
+      case DCI_DT_UINT:
+         m_value.dwUInt = ntohl(pData->value.dwInt32);
+         m_pszValueStr = (char *)malloc(32);
+         sprintf(m_pszValueStr, "%lu", m_value.dwUInt);
          break;
       case DCI_DT_INT64:
-         m_value.qwInt64 = ntohq(pData->value.qwInt64);
+         m_value.iInt64 = (UINT64)ntohq(pData->value.qwInt64);
+         m_pszValueStr = (char *)malloc(32);
+#ifdef _WIN32
+         sprintf(m_pszValueStr, "%I64d", m_value.iInt64);
+#else
+         sprintf(m_pszValueStr, "%lld", m_value.iInt64);
+#endif
+         break;
+      case DCI_DT_UINT64:
+         m_value.iInt64 = (UINT64)ntohq(pData->value.qwInt64);
          m_pszValueStr = (char *)malloc(32);
 #ifdef _WIN32
-         sprintf(m_pszValueStr, "%64I", m_value.qwInt64);
+         sprintf(m_pszValueStr, "%I64u", m_value.qwUInt64);
 #else
-         sprintf(m_pszValueStr, "%lld", m_value.qwInt64);
+         sprintf(m_pszValueStr, "%llu", m_value.qwUInt64);
 #endif
          break;
       case DCI_DT_FLOAT:
index 6672669..0a37d82 100644 (file)
@@ -61,7 +61,7 @@ void CheckForMgmtNode(void)
                {
                   g_dwMgmtNode = pNode->Id();   // Set local management node ID
                   /* DEBUG */
-                  pNode->AddItem(new DCItem(CreateUniqueId(IDG_ITEM), "Status", DS_INTERNAL, DCI_DT_INTEGER, 60, 30, pNode));
+                  pNode->AddItem(new DCItem(CreateUniqueId(IDG_ITEM), "Status", DS_INTERNAL, DCI_DT_INT, 60, 30, pNode));
                }
                break;
             }
index 5fcd000..04c50aa 100644 (file)
@@ -95,8 +95,10 @@ private:
    char *m_pszValueStr;
    union
    {
-      long iInteger;
-      INT64 qwInt64;
+      long iInt;
+      DWORD dwUInt;
+      INT64 iInt64;
+      QWORD qwUInt64;
       double dFloat;
    } m_value;
    BYTE m_iFunction;          // Function code
index a8ba895..ee9f79b 100644 (file)
@@ -60,7 +60,7 @@ NetObj *PollNewNode(DWORD dwIpAddr, DWORD dwNetMask, DWORD dwFlags, TCHAR *pszNa
       pNode->SetName(pszName);
 
    // DEBUG
-   pNode->AddItem(new DCItem(CreateUniqueId(IDG_ITEM), "Status", DS_INTERNAL, DCI_DT_INTEGER, 60, 30, pNode));
+   pNode->AddItem(new DCItem(CreateUniqueId(IDG_ITEM), "Status", DS_INTERNAL, DCI_DT_INT, 60, 30, pNode));
    return pNode;
 }
 
index 4c959c9..bcc8a16 100644 (file)
@@ -1579,7 +1579,7 @@ void ClientSession::ModifyNodeDCI(CSCPMessage *pRequest)
                   case CMD_CREATE_NEW_DCI:
                      // Create dummy DCI
                      pItem = new DCItem(CreateUniqueId(IDG_ITEM), "no name", DS_INTERNAL, 
-                                        DCI_DT_INTEGER, 60, 30, (Node *)pObject);
+                                        DCI_DT_INT, 60, 30, (Node *)pObject);
                      pItem->SetStatus(ITEM_STATUS_DISABLED);
                      if (((Node *)pObject)->AddItem(pItem))
                      {
@@ -1736,9 +1736,15 @@ void ClientSession::GetCollectedData(CSCPMessage *pRequest)
                pCurr->dwTimeStamp = htonl(DBGetFieldAsyncULong(hResult, 0));
                switch(iType)
                {
-                  case DCI_DT_INTEGER:
+                  case DCI_DT_INT:
+                  case DCI_DT_UINT:
                      pCurr->value.dwInteger = htonl(DBGetFieldAsyncULong(hResult, 1));
                      break;
+                  case DCI_DT_INT64:
+                  case DCI_DT_UINT64:
+                     /* TODO: add 64-bit conversion */
+                     pCurr->value.qwInt64 = htonl(DBGetFieldAsyncULong(hResult, 1));
+                     break;
                   case DCI_DT_FLOAT:
                      pCurr->value.dFloat = htond(DBGetFieldAsyncDouble(hResult, 1));
                      break;