- misc SLM additions
authorAlex Kalimulin <alex@netxms.org>
Wed, 31 Aug 2011 00:24:54 +0000 (00:24 +0000)
committerAlex Kalimulin <alex@netxms.org>
Wed, 31 Aug 2011 00:24:54 +0000 (00:24 +0000)
sql/schema.in
src/server/core/bizservice.cpp
src/server/core/nodelink.cpp
src/server/core/slmcheck.cpp
src/server/include/nms_objects.h

index 0cdf478..9caa28b 100644 (file)
@@ -1296,6 +1296,7 @@ CREATE TABLE slm_tickets
      ticket_id integer not null,
      service_id integer not null,
      check_id integer not null,
+     parent_id integer not null,
      create_timestamp integer not null,
      close_timestamp integer not null,
      reason varchar(255) not null,
index bba5abc..6b78c78 100644 (file)
@@ -24,6 +24,7 @@
 
 #define QUERY_LENGTH           (512)
 
+long BusinessService::logRecordId = -1;
 
 //
 // Service default constructor
@@ -91,6 +92,9 @@ void BusinessService::calculateCompoundStatus(BOOL bForcedRecalc)
                UnlockParentList();
                Modify();   /* LOCK? */
        }
+
+       if (iOldStatus != m_iStatus)
+               addHistoryRecord();
 }
 
 
@@ -270,3 +274,47 @@ void BusinessService::poll(ClientSession *pSession, DWORD dwRqId, int nPoller)
 
        m_busy = false;
 }
+
+//
+// Add a record to slm_service_history table
+//
+
+BOOL BusinessService::addHistoryRecord()
+{
+       DB_RESULT hResult;
+       DB_STATEMENT hStmt;
+
+       if (BusinessService::logRecordId < 0)
+       {
+               hResult = DBSelect(g_hCoreDB, _T("SELECT max(record_id) FROM slm_service_history"));
+               if (hResult == NULL)
+                       return FALSE;
+               BusinessService::logRecordId = DBGetNumRows(hResult) > 0 ? DBGetFieldLong(hResult, 0, 0) : 0;
+               DBFreeResult(hResult);
+       }
+
+       BusinessService::logRecordId++;
+
+       hStmt = DBPrepare(g_hCoreDB, _T("INSERT INTO slm_service_history (record_id,service_id,change_timestamp,new_status) ")
+               _T("VALUES (?,?,?,?)"));
+       if (hStmt != NULL)
+       {
+               DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, BusinessService::logRecordId);
+               DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, m_dwId);
+               DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, DWORD(time(NULL)));
+               DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, DWORD(m_iStatus));
+               if (!DBExecute(hStmt))
+               {
+                       DBFreeStatement(hStmt);
+                       return FALSE;
+               }
+               DbgPrintf(9, _T("BusinessService::addHistoryRecord() ok with id %ld"), BusinessService::logRecordId);
+       }
+       else
+       {
+               return FALSE;
+       }
+
+       DBFreeStatement(hStmt);
+       return TRUE;
+}
\ No newline at end of file
index b93ae90..bb9f4a3 100644 (file)
@@ -259,4 +259,13 @@ void NodeLink::execute()
    UnlockChildList();
 
        DbgPrintf(9, _T("NodeLink::execute() finished for id %ld"), long(m_dwId));
+}
+
+//
+// Apply templates from the upper level to this nodelink
+//
+
+BOOL NodeLink::applyTemplates()
+{
+       return TRUE;
 }
\ No newline at end of file
index d285778..5cba19d 100644 (file)
@@ -38,6 +38,7 @@ SlmCheck::SlmCheck() : NetObj()
        m_pCompiledScript = NULL;
        m_threshold = NULL;
        m_reason[0] = 0;
+       m_isTemplate = false;
 }
 
 
@@ -53,6 +54,7 @@ SlmCheck::SlmCheck(const TCHAR *name) : NetObj()
        m_pCompiledScript = NULL;
        m_threshold = NULL;
        m_reason[0] = 0;
+       m_isTemplate = false;
 }
 
 
@@ -357,13 +359,14 @@ BOOL SlmCheck::insertTicket()
 
        SlmCheck::ticketId++;
 
-       hStmt = DBPrepare(g_hCoreDB, _T("INSERT INTO slm_tickets (ticket_id,check_id,create_timestamp,close_timestamp,reason) ")
-                                       _T("VALUES (?,?,?,0,'-')"));
+       hStmt = DBPrepare(g_hCoreDB, _T("INSERT INTO slm_tickets (ticket_id,check_id,parent_id,create_timestamp,close_timestamp,reason) ")
+                                       _T("VALUES (?,?,?,?,0,'-')"));
        if (hStmt != NULL)
        {
                DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, SlmCheck::ticketId);
                DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, m_dwId);
-               DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, DWORD(time(NULL)));
+               DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, m_dwParentCount > 0 ? m_pParentList[0]->Id() : 0); // How to handle mutiple parents?
+               DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, DWORD(time(NULL)));
                if (!DBExecute(hStmt))
                {
                        DBFreeStatement(hStmt);
index 6e26116..0772936 100644 (file)
@@ -1576,6 +1576,7 @@ public:
        virtual DWORD ModifyFromMessage(CSCPMessage *pRequest, BOOL bAlreadyLocked = FALSE);
 
        void execute();
+       BOOL applyTemplates();
 };
 
 
@@ -1591,6 +1592,8 @@ protected:
        TCHAR *m_script;
        NXSL_Program *m_pCompiledScript;
        TCHAR m_reason[256];
+       bool m_isTemplate;
+
        static long ticketId;
 
        void setScript(const TCHAR *script);
@@ -1612,6 +1615,7 @@ public:
        void execute();
        BOOL insertTicket();
        void setReason(const TCHAR *reason) { nx_strncpy(m_reason, CHECK_NULL_EX(reason), 256); }
+       bool isTemplate() const { return m_isTemplate; }
        const TCHAR *getReason() { return m_reason; }
 };
 
@@ -1640,6 +1644,8 @@ protected:
        bool m_busy;
        time_t m_lastPollTime;
 
+       static long logRecordId;
+
 public:
        BusinessService();
        BusinessService(const TCHAR *name);
@@ -1658,6 +1664,7 @@ public:
        bool isReadyForPolling();
        void lockForPolling();
        void poll(ClientSession *pSession, DWORD dwRqId, int nPoller);
+       BOOL addHistoryRecord();
 };