- Default status calculation algorithm changed to "worst child status"
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 11 Jul 2005 09:24:30 +0000 (09:24 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 11 Jul 2005 09:24:30 +0000 (09:24 +0000)
- Added new object's attribute - status calculation algorithm
- Added new server's configuration parameter - default status calculation algorithm
- Database format changed accordingly
- Windows console: Implemented "Browse" button in export dialog

16 files changed:
include/netxmsdb.h
include/nms_cscp.h
sql/schema.in
sql/setup.in
src/console/win32/DataCollectionEditor.cpp
src/console/win32/DataCollectionEditor.h
src/console/win32/DataExportDlg.cpp
src/console/win32/DataExportDlg.h
src/console/win32/LastValuesView.cpp
src/console/win32/nxcon.clw
src/console/win32/nxcon.cpp
src/server/core/main.cpp
src/server/core/netobj.cpp
src/server/include/nms_core.h
src/server/include/nms_objects.h
src/server/tools/nxdbmgr/upgrade.cpp

index 39a9006..d7ece95 100644 (file)
@@ -23,6 +23,6 @@
 #ifndef _netxms_db_h
 #define _netxms_db_h
 
-#define DB_FORMAT_VERSION      29
+#define DB_FORMAT_VERSION      30
 
 #endif
index 7220902..0a23d1a 100644 (file)
@@ -523,6 +523,7 @@ typedef struct
 #define VID_KEY_LENGTH              ((DWORD)157)
 #define VID_SESSION_IV              ((DWORD)158)
 #define VID_CONFIG_FILE             ((DWORD)159)
+#define VID_STATUS_ALGORITHM        ((DWORD)160)
 
 // Variable ranges for object's ACL
 #define VID_ACL_USER_BASE           ((DWORD)0x00001000)
index e1c82d0..d804cda 100644 (file)
@@ -116,6 +116,7 @@ CREATE TABLE object_properties
        image_id integer,
        last_modified integer not null,
        inherit_access_rights integer not null,
+       status_alg integer not null,
        PRIMARY KEY(object_id)
 ) TABLE_TYPE;
 
index 7cd77d7..666abc0 100644 (file)
@@ -88,6 +88,8 @@ INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
        VALUES ('EnableMultipleDBConnections','1',1,1);
 INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
        VALUES ('NumberOfDatabaseWriters','1',1,1);
+INSERT INTO config (var_name,var_value,is_visible,need_server_restart)
+       VALUES ('StatusCalculationAlgorithm','0',1,1);
 
 
 /*
index 82c68ed..95bb9ae 100644 (file)
@@ -7,6 +7,7 @@
 #include "DCIPropPage.h"
 #include "DCIThresholdsPage.h"
 #include "DCITransformPage.h"
+#include "DataExportDlg.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -134,6 +135,8 @@ BEGIN_MESSAGE_MAP(CDataCollectionEditor, CMDIChildWnd)
        ON_COMMAND(ID_ITEM_ACTIVATE, OnItemActivate)
        ON_UPDATE_COMMAND_UI(ID_ITEM_ACTIVATE, OnUpdateItemActivate)
        ON_UPDATE_COMMAND_UI(ID_ITEM_DISABLE, OnUpdateItemDisable)
+       ON_COMMAND(ID_ITEM_EXPORTDATA, OnItemExportdata)
+       ON_UPDATE_COMMAND_UI(ID_ITEM_EXPORTDATA, OnUpdateItemExportdata)
        //}}AFX_MSG_MAP
        ON_NOTIFY(NM_DBLCLK, ID_LIST_VIEW, OnListViewDblClk)
        ON_NOTIFY(LVN_COLUMNCLICK, ID_LIST_VIEW, OnListViewColumnClick)
@@ -499,6 +502,11 @@ void CDataCollectionEditor::OnUpdateItemGraph(CCmdUI* pCmdUI)
    pCmdUI->Enable((m_wndListCtrl.GetSelectedCount() > 0) && (!m_bIsTemplate));
 }
 
+void CDataCollectionEditor::OnUpdateItemExportdata(CCmdUI* pCmdUI) 
+{
+   pCmdUI->Enable((m_wndListCtrl.GetSelectedCount() == 1) && (!m_bIsTemplate));
+}
+
 void CDataCollectionEditor::OnUpdateItemCopy(CCmdUI* pCmdUI) 
 {
    pCmdUI->Enable(m_wndListCtrl.GetSelectedCount() > 0);
@@ -932,3 +940,31 @@ void CDataCollectionEditor::OnListViewColumnClick(LPNMLISTVIEW pNMHDR, LRESULT *
    
    *pResult = 0;
 }
+
+
+//
+// WM_COMMAND::ID_ITEM_EXPORTDATA message handler
+//
+
+void CDataCollectionEditor::OnItemExportdata() 
+{
+   CDataExportDlg dlg;
+   DWORD dwItemId, dwTimeFrom, dwTimeTo;
+
+   dwItemId = m_wndListCtrl.GetItemData(m_wndListCtrl.GetSelectionMark());
+   if (dlg.DoModal() == IDOK)
+   {
+      dlg.SaveLastSelection();
+      dwTimeFrom = CTime(dlg.m_dateFrom.GetYear(), dlg.m_dateFrom.GetMonth(),
+                         dlg.m_dateFrom.GetDay(), dlg.m_timeFrom.GetHour(),
+                         dlg.m_timeFrom.GetMinute(),
+                         dlg.m_timeFrom.GetSecond(), -1).GetTime();
+      dwTimeTo = CTime(dlg.m_dateTo.GetYear(), dlg.m_dateTo.GetMonth(),
+                       dlg.m_dateTo.GetDay(), dlg.m_timeTo.GetHour(),
+                       dlg.m_timeTo.GetMinute(),
+                       dlg.m_timeTo.GetSecond(), -1).GetTime();
+      theApp.ExportDCIData(m_pItemList->dwNodeId, dwItemId, dwTimeFrom, dwTimeTo,
+                           dlg.m_iSeparator, dlg.m_iTimeStampFormat,
+                           (LPCTSTR)dlg.m_strFileName);
+   }
+}
index eb04d20..dab2efb 100644 (file)
@@ -71,6 +71,8 @@ protected:
        afx_msg void OnItemActivate();
        afx_msg void OnUpdateItemActivate(CCmdUI* pCmdUI);
        afx_msg void OnUpdateItemDisable(CCmdUI* pCmdUI);
+       afx_msg void OnItemExportdata();
+       afx_msg void OnUpdateItemExportdata(CCmdUI* pCmdUI);
        //}}AFX_MSG
    afx_msg void OnListViewDblClk(LPNMITEMACTIVATE pNMHDR, LRESULT *pResult);
    afx_msg void OnListViewColumnClick(LPNMLISTVIEW pNMHDR, LRESULT *pResult);
index 3d2b9a3..382f7f7 100644 (file)
@@ -60,6 +60,7 @@ void CDataExportDlg::DoDataExchange(CDataExchange* pDX)
 
 BEGIN_MESSAGE_MAP(CDataExportDlg, CDialog)
        //{{AFX_MSG_MAP(CDataExportDlg)
+       ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
        //}}AFX_MSG_MAP
 END_MESSAGE_MAP()
 
@@ -85,3 +86,20 @@ void CDataExportDlg::SaveLastSelection()
    theApp.WriteProfileInt(_T("DataExport"), _T("TimeFrom"), dwTimeFrom);
    theApp.WriteProfileInt(_T("DataExport"), _T("TimeTo"), dwTimeTo);
 }
+
+
+//
+// Handler for "Browse" button
+//
+
+void CDataExportDlg::OnBrowse() 
+{
+   TCHAR szBuffer[MAX_PATH];
+
+   GetDlgItemText(IDC_EDIT_FILE, szBuffer, MAX_PATH);
+   CFileDialog dlg(FALSE, _T(".txt"), szBuffer);
+   if (dlg.DoModal() == IDOK)
+   {
+      SetDlgItemText(IDC_EDIT_FILE, dlg.m_ofn.lpstrFile);
+   }
+}
index bc6bb42..1eaf381 100644 (file)
@@ -42,6 +42,7 @@ protected:
 
        // Generated message map functions
        //{{AFX_MSG(CDataExportDlg)
+       afx_msg void OnBrowse();
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
 };
index 81e73a0..1503028 100644 (file)
@@ -433,6 +433,11 @@ void CLastValuesView::OnDestroy()
        CMDIChildWnd::OnDestroy();
 }
 
+
+//
+// WM_COMMAND::ID_ITEM_EXPORTDATA message handler
+//
+
 void CLastValuesView::OnItemExportdata() 
 {
    CDataExportDlg dlg;
index 2cad74d..8cd1672 100644 (file)
@@ -16,9 +16,9 @@ Class7=CEventBrowser
 Class9=CMapView
 
 ResourceCount=121
-Resource1=IDA_PACKAGE_MGR (English (U.S.))
+Resource1=IDA_NETMAP (English (U.S.))
 Resource2=IDD_OBJECT_NODE_GENERAL
-Resource3=IDD_MIB_BROWSER (English (U.S.))
+Resource3=IDD_GROUP_PROPERTIES (English (U.S.))
 Resource4=IDD_SELECT_OBJECT
 Resource5=IDD_SELECT_ACTION
 Class2=CChildView
@@ -32,9 +32,9 @@ Resource7=IDD_NEW_USER
 Class12=CObjectBrowser
 Resource8=IDD_CREATE_CONTAINER
 Class13=CObjectPropDlg
-Resource9=IDD_GROUP_PROPERTIES (English (U.S.))
-Resource10=IDD_DCI_THRESHOLDS (English (U.S.))
-Resource11=IDD_SELECT_INTERNAL_ITEM (English (U.S.))
+Resource9=IDD_OBJECT_GENERAL (English (U.S.))
+Resource10=IDD_NEW_USER (English (U.S.))
+Resource11=IDD_CREATE_TG (English (U.S.))
 Resource12=IDR_CTRLPANEL (English (U.S.))
 Resource13=IDR_EVENTS (English (U.S.))
 Resource14=IDR_MAPFRAME (English (U.S.))
@@ -42,17 +42,17 @@ Resource15=IDR_OBJECTS (English (U.S.))
 Resource16=IDD_DUMMY (English (U.S.))
 Class14=CEventEditor
 Class15=CEditEventDlg
-Resource17=IDA_EPP (English (U.S.))
+Resource17=IDD_CHANGE_IP
 Class16=CDebugFrame
-Resource18=IDD_DCI_COLLECTION (English (U.S.))
+Resource18=IDD_SELECT_USER (English (U.S.))
 Resource19=IDD_OBJECT_PROPERTIES (English (U.S.))
 Resource20=IDD_SELECT_EVENT
 Class17=CObjectPreview
-Resource21=IDD_SELECT_ACTION (English (U.S.))
+Resource21=IDD_EDIT_RULE_SEVERITY (English (U.S.))
 Class18=CToolBox
 Class19=CObjectInfoBox
 Class20=CObjectSearchBox
-Resource22=IDD_CREATE_NETSRV (English (U.S.))
+Resource22=IDD_EDIT_TRAP (English (U.S.))
 Class21=CEditBox
 Class22=COPGeneral
 Class23=CNodePropsGeneral
@@ -61,14 +61,14 @@ Class24=CObjectPropCaps
 Class25=CObjectPropSheet
 Resource24=IDA_MDI_DEFAULT
 Class26=CRequestProcessingDlg
-Resource25=IDD_SET_PASSWORD (English (U.S.))
+Resource25=IDD_OBJECT_SECURITY (English (U.S.))
 Resource26=IDD_PROGRESS (English (U.S.))
 Resource27=IDD_EDIT_RULE_ALARM
-Resource28=IDD_EDIT_RULE_COMMENT (English (U.S.))
+Resource28=IDD_DCI_COLLECTION (English (U.S.))
 Class27=CObjectPropsGeneral
-Resource29=IDD_SELECT_USER (English (U.S.))
+Resource29=IDD_OBJECT_NODE_GENERAL (English (U.S.))
 Class28=CObjectPropsSecurity
-Resource30=IDD_CREATE_NODE (English (U.S.))
+Resource30=IDD_CP_GENERAL (English (U.S.))
 Resource31=IDD_SELECT_USER
 Resource32=IDD_OBJECT_SECURITY
 Class29=CUserSelectDlg
@@ -79,36 +79,36 @@ Class31=CNewUserDlg
 Resource35=IDD_THRESHOLD
 Resource36=IDA_EPP
 Class32=CUserPropDlg
-Resource37=IDA_TRAP_EDITOR (English (U.S.))
+Resource37=IDA_EPP (English (U.S.))
 Resource38=IDD_ABOUTBOX
 Class33=CGroupPropDlg
 Resource39=IDD_CP_GENERAL
 Resource40=IDA_TRAP_EDITOR
 Resource41=IDM_VIEW_SPECIFIC
-Resource42=IDD_GRAPH_PROP_SETTINGS (English (U.S.))
+Resource42=IDD_CREATE_NETSRV (English (U.S.))
 Class34=CPasswordChangeDlg
 Class35=CNodeSummary
 Class36=CNetSummaryFrame
 Class37=CDataCollectionEditor
-Resource43=IDD_USER_PROPERTIES (English (U.S.))
+Resource43=IDD_REQUEST_PROCESSING (English (U.S.))
 Class38=CDCIPropPage
-Resource44=IDD_LASTVAL_PROP (English (U.S.))
+Resource44=IDD_DESKTOP_SAVE_AS (English (U.S.))
 Class39=CDCIDataView
-Resource45=IDD_CREATE_TG (English (U.S.))
+Resource45=IDD_ACTION_PROPERTIES (English (U.S.))
 Class40=CGraph
 Class41=CGraphFrame
 Class42=CDCIThresholdsPage
-Resource46=IDD_OBJECT_GENERAL (English (U.S.))
-Resource47=IDA_EVENT_EDITOR (English (U.S.))
+Resource46=IDD_LOGIN (English (U.S.))
+Resource47=IDA_MDI_DEFAULT (English (U.S.))
 Resource48=IDM_CONTEXT
 Class43=CThresholdDlg
-Resource49=IDD_DCI_TRANSFORM (English (U.S.))
+Resource49=IDD_NEW_ACTION (English (U.S.))
 Resource50=IDD_EDIT_TRAP_ARG
 Class44=CMIBBrowserDlg
 Class45=CEventPolicyEditor
 Class46=CRuleList
 Class47=CRuleHeader
-Resource51=IDD_OBJECT_NODE_GENERAL (English (U.S.))
+Resource51=IDA_PACKAGE_MGR (English (U.S.))
 Resource52=IDD_CREATE_NODE
 Class48=CObjectSelDlg
 Resource53=IDD_OBJECT_CAPS
@@ -117,22 +117,22 @@ Class49=CRuleCommentDlg
 Resource55=IDD_DCI_COLLECTION
 Class50=CEventSelDlg
 Resource56=IDD_DATA_QUERY
-Resource57=IDD_CREATE_TEMPLATE (English (U.S.))
+Resource57=IDD_SELECT_ACTION (English (U.S.))
 Resource58=IDD_CREATE_TG
-Resource59=IDD_LOGIN (English (U.S.))
-Resource60=IDD_REQUEST_PROCESSING (English (U.S.))
+Resource59=IDA_TRAP_EDITOR (English (U.S.))
+Resource60=IDD_ABOUTBOX (English (U.S.))
 Class51=CObjectPropsPresentation
-Resource61=IDD_INPUT_BOX (English (U.S.))
+Resource61=IDD_DATA_QUERY (English (U.S.))
 Resource62=IDD_EDIT_RULE_COMMENT
 Class52=CRuleSeverityDlg
 Resource63=IDD_ACTION_PROPERTIES
 Class53=CRuleAlarmDlg
 Class54=CAlarmBrowser
-Resource64=IDA_ALARM_BROWSER (English (U.S.))
+Resource64=IDD_LASTVAL_PROP (English (U.S.))
 Resource65=IDD_DCI_TRANSFORM
-Resource66=IDD_GRAPH_PROP_DATA (English (U.S.))
-Resource67=IDD_SELECT_OBJECT (English (U.S.))
-Resource68=IDA_ACTION_EDITOR (English (U.S.))
+Resource66=IDD_OBJECT_NETSRV_GENERAL (English (U.S.))
+Resource67=IDD_SET_PASSWORD (English (U.S.))
+Resource68=IDA_OBJECT_BROWSER (English (U.S.))
 Class55=CConsolePropsGeneral
 Class56=CActionEditor
 Resource69=IDA_ACTION_EDITOR
@@ -143,18 +143,18 @@ Class58=CEditActionDlg
 Resource72=IDA_NETMAP
 Class59=CActionSelDlg
 Resource73=IDD_MIB_BROWSER
-Resource74=IDD_OBJECT_PRESENTATION (English (U.S.))
-Resource75=IDA_LAST_VALUES (English (U.S.))
+Resource74=IDD_THRESHOLD (English (U.S.))
+Resource75=IDA_EVENT_EDITOR (English (U.S.))
 Resource76=IDD_USER_PROPERTIES
 Class60=CCreateObjectDlg
 Class61=CCreateContainerDlg
 Resource77=IDR_MAINFRAME
 Class62=CCreateNodeDlg
-Resource78=IDD_CREATE_CONTAINER (English (U.S.))
-Resource79=IDD_OBJECT_CAPS (English (U.S.))
-Resource80=IDA_MDI_DEFAULT (English (U.S.))
+Resource78=IDD_EDIT_RULE_ALARM (English (U.S.))
+Resource79=IDA_LAST_VALUES (English (U.S.))
+Resource80=IDD_GRAPH_PROP_DATA (English (U.S.))
 Class63=CDCITransformPage
-Resource81=IDD_ABOUTBOX (English (U.S.))
+Resource81=IDA_ACTION_EDITOR (English (U.S.))
 Class64=CPollNodeDlg
 Resource82=IDD_POLL_NODE (English (U.S.))
 Class65=CNodePoller
@@ -179,49 +179,49 @@ Class72=CGraphPropDlg
 Class73=CColorSelector
 Class74=CPackageMgr
 Resource94=IDD_GROUP_PROPERTIES
-Resource95=IDR_MAINFRAME (English (U.S.))
-Resource96=IDD_CHANGE_IP
-Resource97=IDD_OBJECT_SECURITY (English (U.S.))
-Resource98=IDD_THRESHOLD (English (U.S.))
-Resource99=IDD_NEW_ACTION (English (U.S.))
-Resource100=IDD_CP_GENERAL (English (U.S.))
-Resource101=IDD_SELECT_EVENT (English (U.S.))
-Resource102=IDA_NETMAP (English (U.S.))
-Resource103=IDD_DESKTOP_SAVE_AS (English (U.S.))
-Resource104=IDD_NEW_USER (English (U.S.))
-Resource105=IDD_SELECT_AGENT_PARAM (English (U.S.))
-Resource106=IDD_EDIT_RULE_ALARM (English (U.S.))
-Resource107=IDD_REMOVE_TEMPLATE
+Resource95=IDM_VIEW_SPECIFIC (English (U.S.))
+Resource96=IDD_OBJECT_RELATIONS (English (U.S.))
+Resource97=IDD_EDIT_EVENT (English (U.S.))
+Resource98=IDD_USER_PROPERTIES (English (U.S.))
+Resource99=IDD_SELECT_EVENT (English (U.S.))
+Resource100=IDD_EDIT_RULE_COMMENT (English (U.S.))
+Resource101=IDD_DCI_THRESHOLDS (English (U.S.))
+Resource102=IDR_MAINFRAME (English (U.S.))
+Resource103=IDD_INPUT_BOX (English (U.S.))
+Resource104=IDD_OBJECT_CAPS (English (U.S.))
+Resource105=IDD_CREATE_TEMPLATE (English (U.S.))
+Resource106=IDD_SELECT_OBJECT (English (U.S.))
+Resource107=IDD_OBJECT_NODE_POLL (English (U.S.))
 Class75=CInternalItemSelDlg
-Resource108=IDD_OBJECT_NODE_POLL (English (U.S.))
+Resource108=IDD_SELECT_INTERNAL_ITEM (English (U.S.))
 Class76=CAgentParamSelDlg
-Resource109=IDD_EDIT_TRAP_ARG (English (U.S.))
+Resource109=IDD_DCI_TRANSFORM (English (U.S.))
 Class77=CInputBox
-Resource110=IDD_EDIT_TRAP (English (U.S.))
+Resource110=IDD_CREATE_NODE (English (U.S.))
 Class78=CCreateNetSrvDlg
-Resource111=IDD_EDIT_RULE_SEVERITY (English (U.S.))
+Resource111=IDD_MIB_BROWSER (English (U.S.))
 Class79=CNetSrvPropsGeneral
-Resource112=IDD_ACTION_PROPERTIES (English (U.S.))
+Resource112=IDD_OBJECT_PRESENTATION (English (U.S.))
 Class80=CNodePropsPolling
 Class81=CDeploymentView
 Class82=CLastValuesView
 Class83=CValueList
-Resource113=IDD_OBJECT_RELATIONS (English (U.S.))
+Resource113=IDD_SELECT_AGENT_PARAM (English (U.S.))
 Class84=CObjectPropsRelations
-Resource114=IDD_OBJECT_NETSRV_GENERAL (English (U.S.))
+Resource114=IDD_EDIT_TRAP_ARG (English (U.S.))
 Class85=CSaveDesktopDlg
-Resource115=IDA_GRAPH (English (U.S.))
+Resource115=IDA_ALARM_BROWSER (English (U.S.))
 Class86=CGraphSettingsPage
-Resource116=IDD_EDIT_EVENT (English (U.S.))
+Resource116=IDA_GRAPH (English (U.S.))
 Class87=CGraphDataPage
-Resource117=IDM_VIEW_SPECIFIC (English (U.S.))
+Resource117=IDM_CONTEXT (English (U.S.))
 Class88=CRemoveTemplateDlg
-Resource118=IDD_DATA_QUERY (English (U.S.))
+Resource118=IDD_CREATE_CONTAINER (English (U.S.))
 Class89=CAddrChangeDlg
-Resource119=IDA_OBJECT_BROWSER (English (U.S.))
+Resource119=IDD_REMOVE_TEMPLATE
 Class90=CLastValuesPropDlg
 Class91=CAgentCfgEditor
-Resource120=IDM_CONTEXT (English (U.S.))
+Resource120=IDD_GRAPH_PROP_SETTINGS (English (U.S.))
 Class92=CDataExportDlg
 Resource121=IDD_DCI_DATA_EXPORT (English (U.S.))
 
index 198ed01..4520cd4 100644 (file)
@@ -1935,6 +1935,10 @@ static DWORD DoDataExport(DWORD dwNodeId, DWORD dwItemId, DWORD dwTimeFrom,
          }
          close(hFile);
       }
+      else
+      {
+         dwResult = RCC_IO_ERROR;
+      }
       NXCDestroyDCIData(pData);
    }
    return dwResult;
@@ -1956,6 +1960,9 @@ void CConsoleApp::ExportDCIData(DWORD dwNodeId, DWORD dwItemId,
                             (void *)dwTimeFrom, (void *)dwTimeTo,
                             (void *)iSeparator, (void *)iTimeStampFormat,
                             (void *)pszFile, _T("Exporting data..."));
-   if (dwResult != RCC_SUCCESS)
+   if (dwResult == RCC_SUCCESS)
+      m_pMainWnd->MessageBox(_T("Collected DCI data was successfuly exported."),
+                             _T("Information"), MB_OK | MB_ICONINFORMATION);
+   else
       ErrorBox(dwResult, _T("Error exporting DCI data: %s"));
 }
index 2cc829f..5594415 100644 (file)
@@ -67,6 +67,7 @@ DB_HANDLE g_hCoreDB = 0;
 DWORD g_dwDiscoveryPollingInterval;
 DWORD g_dwStatusPollingInterval;
 DWORD g_dwConfigurationPollingInterval;
+int g_iStatusAlgorithm = SA_WORST_STATUS;
 char g_szDataDir[MAX_PATH];
 DWORD g_dwDBSyntax = DB_SYNTAX_GENERIC;
 QWORD g_qwServerId;
@@ -183,6 +184,7 @@ static void LoadGlobalConfig()
    if (ConfigReadInt("EnableMultipleDBConnections", 1))
       g_dwFlags |= AF_ENABLE_MULTIPLE_DB_CONN;
    ConfigReadStr("DataDirectory", g_szDataDir, MAX_PATH, DEFAULT_DATA_DIR);
+   g_iStatusAlgorithm = ConfigReadInt("StatusCalculationAlgorithm", SA_WORST_STATUS);
 }
 
 
index a403c80..a208aee 100644 (file)
@@ -49,6 +49,7 @@ NetObj::NetObj()
    m_bInheritAccessRights = TRUE;
    m_dwImageId = IMG_DEFAULT;    // Default image
    m_pPollRequestor = NULL;
+   m_iStatusAlgorithm = SA_DEFAULT;
 }
 
 
@@ -120,7 +121,7 @@ BOOL NetObj::LoadCommonProperties(void)
 
    // Load access options
    _sntprintf(szQuery, 256, _T("SELECT name,status,is_deleted,image_id,"
-                               "inherit_access_rights,last_modified "
+                               "inherit_access_rights,last_modified,status_alg "
                                "FROM object_properties WHERE object_id=%ld"), m_dwId);
    hResult = DBSelect(g_hCoreDB, szQuery);
    if (hResult != NULL)
@@ -133,6 +134,7 @@ BOOL NetObj::LoadCommonProperties(void)
          m_dwImageId = DBGetFieldULong(hResult, 0, 3);
          m_bInheritAccessRights = DBGetFieldLong(hResult, 0, 4) ? TRUE : FALSE;
          m_dwTimeStamp = DBGetFieldULong(hResult, 0, 5);
+         m_iStatusAlgorithm = DBGetFieldLong(hResult, 0, 6);
          bResult = TRUE;
       }
       DBFreeResult(hResult);
@@ -160,16 +162,16 @@ BOOL NetObj::SaveCommonProperties(DB_HANDLE hdb)
          _sntprintf(szQuery, 512, 
                     _T("UPDATE object_properties SET name='%s',status=%d,"
                        "is_deleted=%d,image_id=%ld,inherit_access_rights=%d,"
-                       "last_modified=%ld WHERE object_id=%ld"),
+                       "last_modified=%ld,status_alg=%d WHERE object_id=%ld"),
                     m_szName, m_iStatus, m_bIsDeleted, m_dwImageId,
-                    m_bInheritAccessRights, m_dwTimeStamp, m_dwId);
+                    m_bInheritAccessRights, m_dwTimeStamp, m_iStatusAlgorithm, m_dwId);
       else
          _sntprintf(szQuery, 512, 
                     _T("INSERT INTO object_properties (object_id,name,status,is_deleted,"
-                       "image_id,inherit_access_rights,last_modified) "
-                       "VALUES (%ld,'%s',%d,%d,%ld,%d,%ld)"),
+                       "image_id,inherit_access_rights,last_modified,status_alg) "
+                       "VALUES (%ld,'%s',%d,%d,%ld,%d,%ld,%d)"),
                     m_dwId, m_szName, m_iStatus, m_bIsDeleted, m_dwImageId,
-                    m_bInheritAccessRights, m_dwTimeStamp);
+                    m_bInheritAccessRights, m_dwTimeStamp, m_iStatusAlgorithm);
       DBFreeResult(hResult);
       bResult = DBQuery(hdb, szQuery);
    }
@@ -416,26 +418,36 @@ const char *NetObj::ParentList(char *szBuffer)
 void NetObj::CalculateCompoundStatus(void)
 {
    DWORD i;
-   int iSum, iCount, iOldStatus = m_iStatus;
+   int iWorstStatus, iCount, iStatusAlg, iOldStatus = m_iStatus;
 
    if (m_iStatus != STATUS_UNMANAGED)
    {
       LockData();
-      /* TODO: probably status calculation algorithm should be changed */
 
-      LockChildList(FALSE);
-      for(i = 0, iSum = 0, iCount = 0; i < m_dwChildCount; i++)
-         if (m_pChildList[i]->Status() < STATUS_UNKNOWN)
-         {
-            iSum += m_pChildList[i]->Status();
-            iCount++;
-         }
-      UnlockChildList();
+      iStatusAlg = (m_iStatusAlgorithm == SA_DEFAULT) ? g_iStatusAlgorithm : m_iStatusAlgorithm;
 
-      if (iCount > 0)
-         m_iStatus = iSum / iCount;
-      else
-         m_iStatus = STATUS_UNKNOWN;
+      switch(iStatusAlg)
+      {
+         case SA_WORST_STATUS:
+            LockChildList(FALSE);
+            for(i = 0, iCount = 0, iWorstStatus = 0; i < m_dwChildCount; i++)
+               if ((m_pChildList[i]->Status() < STATUS_UNKNOWN) &&
+                   (m_pChildList[i]->Status() > iWorstStatus))
+               {
+                  iWorstStatus = m_pChildList[i]->Status();
+                  iCount++;
+               }
+            UnlockChildList();
+
+            if (iCount > 0)
+               m_iStatus = iWorstStatus;
+            else
+               m_iStatus = STATUS_UNKNOWN;
+            break;
+         default:
+            m_iStatus = STATUS_UNKNOWN;
+            break;
+      }
       UnlockData();
 
       // Cause parent object(s) to recalculate it's status
@@ -552,6 +564,7 @@ void NetObj::CreateMessage(CSCPMessage *pMsg)
       pMsg->SetVariable(dwId, m_pChildList[i]->Id());
    pMsg->SetVariable(VID_INHERIT_RIGHTS, (WORD)m_bInheritAccessRights);
    pMsg->SetVariable(VID_IMAGE_ID, m_dwImageId);
+   pMsg->SetVariable(VID_STATUS_ALGORITHM, (WORD)m_iStatusAlgorithm);
    m_pAccessList->CreateMessage(pMsg);
 }
 
@@ -603,6 +616,10 @@ DWORD NetObj::ModifyFromMessage(CSCPMessage *pRequest, BOOL bAlreadyLocked)
    if (pRequest->IsVariableExist(VID_IMAGE_ID))
       m_dwImageId = pRequest->GetVariableLong(VID_IMAGE_ID);
 
+   // Change object's status calculation algorithm
+   if (pRequest->IsVariableExist(VID_STATUS_ALGORITHM))
+      m_iStatusAlgorithm = (int)pRequest->GetVariableShort(VID_STATUS_ALGORITHM);
+
    // Change object's ACL
    if (pRequest->IsVariableExist(VID_ACL_SIZE))
    {
index 06c1383..3ef985d 100644 (file)
@@ -521,6 +521,7 @@ extern char NXCORE_EXPORTABLE g_szPIDFile[];
 extern char g_szDataDir[];
 extern QWORD g_qwServerId;
 extern RSA *g_pServerKey;
+extern int g_iStatusAlgorithm;
 
 extern DB_HANDLE g_hCoreDB;
 extern Queue *g_pLazyRequestQueue;
index 9a599ed..aed1390 100644 (file)
@@ -121,6 +121,14 @@ extern DWORD g_dwConfigurationPollingInterval;
 
 
 //
+// Status calculation algorithms
+//
+
+#define SA_DEFAULT            -1
+#define SA_WORST_STATUS       0
+
+
+//
 // Queued template update information
 //
 
@@ -145,6 +153,7 @@ protected:
    DWORD m_dwRefCount;        // Number of references. Object can be destroyed only when this counter is zero
    char m_szName[MAX_OBJECT_NAME];
    int m_iStatus;
+   int m_iStatusAlgorithm;    // Status calculation algorithm
    BOOL m_bIsModified;
    BOOL m_bIsDeleted;
    BOOL m_bIsHidden;
index 02b5ac1..fcb7fcb 100644 (file)
@@ -77,6 +77,53 @@ static BOOL CreateConfigParam(TCHAR *pszName, TCHAR *pszValue, int iVisible, int
 
 
 //
+// Upgrade from V29 to V30
+//
+
+static BOOL H_UpgradeFromV29(void)
+{
+   static TCHAR m_szBatch[] =
+      "ALTER TABLE object_properties ADD status_alg integer\n"
+      "UPDATE object_properties SET status_alg=-1\n"
+      "<END>";
+
+   if (!SQLBatch(m_szBatch))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   if (!CreateConfigParam(_T("StatusCalculationAlgorithm"), _T("0"), 1, 1))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   if (!CreateConfigParam(_T("EnableMultipleDBConnections"), _T("1"), 1, 1))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   if (!CreateConfigParam(_T("NumberOfDatabaseWriters"), _T("1"), 1, 1))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   if (!CreateConfigParam(_T("DefaultEncryptionPolicy"), _T("1"), 1, 1))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   if (!CreateConfigParam(_T("AllowedCiphers"), _T("15"), 1, 1))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   if (!CreateConfigParam(_T("KeepAliveInterval"), _T("60"), 1, 1))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   if (!SQLQuery(_T("UPDATE config SET var_value='30' WHERE var_name='DBFormatVersion'")))
+      if (!g_bIgnoreErrors)
+         return FALSE;
+
+   return TRUE;
+}
+
+
+//
 // Upgrade from V28 to V29
 //
 
@@ -1139,6 +1186,7 @@ static struct
    { 26, H_UpgradeFromV26 },
    { 27, H_UpgradeFromV27 },
    { 28, H_UpgradeFromV28 },
+   { 29, H_UpgradeFromV29 },
    { 0, NULL }
 };