added basic checking of node and interface objects
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 8 Feb 2005 09:32:10 +0000 (09:32 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 8 Feb 2005 09:32:10 +0000 (09:32 +0000)
ChangeLog
src/server/core/node.cpp
src/server/include/nxsrvapi.h
src/server/tools/nxdbmgr/check.cpp
src/server/tools/nxdbmgr/nxdbmgr.cpp
src/server/tools/nxdbmgr/nxdbmgr.h

index ec5f0fc..9887475 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
 *
 
 - Fixed bug which cause server to hang when deleting unreacheable node
+- Added basic checking of node and interface objects to nxdbmgr
 
 
 *
index c3b47ff..43d5375 100644 (file)
@@ -178,18 +178,18 @@ BOOL Node::CreateFromDB(DWORD dwId)
    if (!m_bIsDeleted)
    {
       // Link node to subnets
-      sprintf(szQuery, "SELECT subnet_id FROM nsmap WHERE node_id=%d", dwId);
+      sprintf(szQuery, "SELECT subnet_id FROM nsmap WHERE node_id=%ld", dwId);
       hResult = DBSelect(g_hCoreDB, szQuery);
       if (hResult == NULL)
          return FALSE;     // Query failed
 
-      if (DBGetNumRows(hResult) == 0)
+      iNumRows = DBGetNumRows(hResult);
+      if (iNumRows == 0)
       {
          DBFreeResult(hResult);
          return FALSE;     // No parents - it shouldn't happen if database isn't corrupted
       }
 
-      iNumRows = DBGetNumRows(hResult);
       for(i = 0; i < iNumRows; i++)
       {
          dwSubnetId = DBGetFieldULong(hResult, i, 0);
index f0a57d1..b1fc67e 100644 (file)
@@ -50,7 +50,7 @@
 //
 
 #ifdef _WIN32
-#define DEFAULT_CONFIG_FILE   _T("C:\\NetXMS.conf")
+#define DEFAULT_CONFIG_FILE   _T("C:\\netxmsd.conf")
 #else
 #define DEFAULT_CONFIG_FILE   _T("/etc/netxmsd.conf")
 #endif
index 98b43fb..deb37c3 100644 (file)
@@ -31,6 +31,92 @@ static int m_iNumErrors = 0;
 static int m_iNumFixes = 0;
 
 
+//
+// Check node objects
+//
+
+static void CheckNodes(void)
+{
+   DB_RESULT hResult, hResult2;
+   DWORD i, dwNumObjects, dwId;
+   TCHAR szQuery[256];
+
+   _tprintf(_T("Checking node objects...\n"));
+   hResult = SQLSelect(_T("SELECT id,name,primary_ip FROM nodes WHERE is_deleted=0"));
+   if (hResult != NULL)
+   {
+      dwNumObjects = DBGetNumRows(hResult);
+      for(i = 0; i < dwNumObjects; i++)
+      {
+         dwId = DBGetFieldULong(hResult, i, 0);
+         _sntprintf(szQuery, 256, _T("SELECT subnet_id FROM nsmap WHERE node_id=%ld"), dwId);
+         hResult2 = SQLSelect(szQuery);
+         if (hResult2 != NULL)
+         {
+            if ((DBGetNumRows(hResult2) == 0) && (DBGetFieldIPAddr(hResult, i, 2) != 0))
+            {
+               m_iNumErrors++;
+               _tprintf(_T("Unlinked node object %ld (\"%s\"). Delete? (Y/N) "),
+                        dwId, DBGetField(hResult, i, 1));
+               if (GetYesNo())
+               {
+                  _sntprintf(szQuery, 256, _T("DELETE FROM nodes WHERE id=%ld"), dwId);
+                  if (SQLQuery(szQuery))
+                     m_iNumFixes++;
+               }
+            }
+            DBFreeResult(hResult2);
+         }
+      }
+      DBFreeResult(hResult);
+   }
+}
+
+
+//
+// Check interface objects
+//
+
+static void CheckInterfaces(void)
+{
+   DB_RESULT hResult, hResult2;
+   DWORD i, dwNumObjects, dwId;
+   TCHAR szQuery[256];
+
+   _tprintf(_T("Checking interface objects...\n"));
+   hResult = SQLSelect(_T("SELECT id,name,node_id FROM interfaces WHERE is_deleted=0"));
+   if (hResult != NULL)
+   {
+      dwNumObjects = DBGetNumRows(hResult);
+      for(i = 0; i < dwNumObjects; i++)
+      {
+         // Check if referred node exists
+         _sntprintf(szQuery, 256, _T("SELECT name FROM nodes WHERE id=%ld AND is_deleted=0"),
+                    DBGetFieldULong(hResult, i, 2));
+         hResult2 = SQLSelect(szQuery);
+         if (hResult2 != NULL)
+         {
+            if (DBGetNumRows(hResult2) == 0)
+            {
+               m_iNumErrors++;
+               dwId = DBGetFieldULong(hResult, i, 0);
+               _tprintf(_T("Unlinked interface object %ld (\"%s\"). Delete? (Y/N) "),
+                        dwId, DBGetField(hResult, i, 1));
+               if (GetYesNo())
+               {
+                  _sntprintf(szQuery, 256, _T("DELETE FROM interfaces WHERE id=%ld"), dwId);
+                  if (SQLQuery(szQuery))
+                     m_iNumFixes++;
+               }
+            }
+            DBFreeResult(hResult2);
+         }
+      }
+      DBFreeResult(hResult);
+   }
+}
+
+
 //
 // Check database for errors
 //
@@ -95,13 +181,10 @@ void CheckDatabase(BOOL bForce)
 
       if (bLocked)
       {
-         TCHAR szBuffer[16];
-
          _tprintf(_T("Database is locked by server %s [%s]\n"
-                     "Do you wish to force database unlock? (Y/N)\n"),
+                     "Do you wish to force database unlock? (Y/N) "),
                   szLockStatus, szLockInfo);
-         _fgetts(szBuffer, 16, stdin);
-         if ((szBuffer[0] == _T('y')) || (szBuffer[0] == _T('Y')))
+         if (GetYesNo())
          {
             if (SQLQuery(_T("UPDATE config SET var_value='UNLOCKED' where var_name='DBLockStatus'")))
             {
@@ -113,6 +196,9 @@ void CheckDatabase(BOOL bForce)
 
       if (!bLocked)
       {
+         CheckNodes();
+         CheckInterfaces();
+
          if (m_iNumErrors == 0)
          {
             _tprintf(_T("Database doesn't contain any errors\n"));
index ec277fd..098de24 100644 (file)
 
 #include "nxdbmgr.h"
 
+#ifdef _WIN32
+#include <conio.h>
+#endif
+
 
 //
 // Global variables
@@ -56,6 +60,40 @@ static NX_CFG_TEMPLATE m_cfgTemplate[] =
 };
 
 
+//
+// Get Yes or No answer from keyboard
+//
+
+BOOL GetYesNo(void)
+{
+#ifdef _WIN32
+   int ch;
+
+   while(1)
+   {
+      ch = getch();
+      if ((ch == 'y') || (ch == 'Y'))
+      {
+         printf("Y\n");
+         return TRUE;
+      }
+      if ((ch == 'n') || (ch == 'N'))
+      {
+         printf("N\n");
+         return FALSE;
+      }
+   }
+#else
+   TCHAR szBuffer[16];
+
+   fflush(stdout);
+   _fgetts(szBuffer, 16, stdin);
+   StrStrip(szBuffer);
+   return ((szBuffer[0] == 'y') || (szBuffer[0] == 'Y'));
+#endif
+}
+
+
 //
 // Execute SQL SELECT query and print error message on screen if query failed
 //
index be3a5ef..859224a 100644 (file)
@@ -55,6 +55,7 @@ void UpgradeDatabase(void);
 DB_RESULT SQLSelect(TCHAR *pszQuery);
 BOOL SQLQuery(TCHAR *pszQuery);
 BOOL SQLBatch(TCHAR *pszBatch);
+BOOL GetYesNo(void);
 
 
 //