fixed agent local database initialization bug
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 14 Jun 2016 07:35:03 +0000 (10:35 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 14 Jun 2016 07:35:03 +0000 (10:35 +0300)
src/agent/core/dbupgrade.cpp
src/agent/core/localdb.cpp
src/agent/core/messages.mc

index 106493b..8b8c8bd 100644 (file)
@@ -37,14 +37,12 @@ bool g_ignoreAgentDbErrors = FALSE;
  */
 static DB_HANDLE s_db = NULL;
 
-
 /**
  * Upgrade from V2 to V3
  */
 static BOOL H_UpgradeFromV3(int currVersion, int newVersion)
 {
    CHK_EXEC(Query(_T("ALTER TABLE dc_queue ADD status_code integer")));
-
    CHK_EXEC(WriteMetadata(_T("SchemaVersion"), 4));
    return TRUE;
 }
@@ -131,7 +129,7 @@ static BOOL H_UpgradeFromV1(int currVersion, int newVersion)
 {
    /*
    This upgrade contains:
-     1. check that version and depending on version of DATACOLL_SCHEMA_VERSION apply second or both patchs
+     1. check that version and depending on version of DATACOLL_SCHEMA_VERSION apply second or both patches
         move upgrade of data collection database to this function
      2. remove DATACOLL_SCHEMA_VERSION from metadata
      3. create policy table (guid, type, server, version) unique giud
@@ -141,7 +139,7 @@ static BOOL H_UpgradeFromV1(int currVersion, int newVersion)
      7. Delete registry file (remove unused functions for registry)
    */
 
-   //Data collection upgrade procedure
+   // Data collection upgrade procedure
    const TCHAR *s_upgradeQueries[] =
    {
       _T("CREATE TABLE dc_queue (")
@@ -217,7 +215,7 @@ static BOOL H_UpgradeFromV1(int currVersion, int newVersion)
                _tcscat(regPath, FS_PATH_SEPARATOR);
        _tcscat(regPath, _T("registry.dat"));
        registryExists = registry->loadXmlConfig(regPath, "registry");
-       if(!registryExists)
+       if (!registryExists)
    {
       DebugPrintf(INVALID_INDEX, 1, _T("Registry file doesn't exist. No data will be moved from registry to database\n"));
       CHK_EXEC(WriteMetadata(_T("SchemaVersion"), 2));
@@ -253,12 +251,12 @@ static BOOL H_UpgradeFromV1(int currVersion, int newVersion)
       DBFreeStatement(hStmt);
        }
 
-   //Move upgrade file url variable to database
-   const TCHAR* szFullPath = registry->getValue(_T("/upgrade/file"));
-   if(szFullPath != NULL)
+   // Move upgrade file url variable to database
+   const TCHAR *fullPath = registry->getValue(_T("/upgrade/file"));
+   if (fullPath != NULL)
    {
       TCHAR upgradeFileInsert[256];
-      _sntprintf(upgradeFileInsert, 256, _T("INSERT INTO registry (attribute,value) VALUES ('upgrade.file','%s')"), szFullPath);
+      _sntprintf(upgradeFileInsert, 256, _T("INSERT INTO registry (attribute,value) VALUES ('upgrade.file','%s')"), fullPath);
       CHK_EXEC(Query(upgradeFileInsert));
    }
    delete registry;
index d5769c0..03e12fc 100644 (file)
@@ -86,6 +86,81 @@ bool WriteMetadata(const TCHAR *name, INT32 value)
    return WriteMetadata(name, buffer);
 }
 
+/**
+ * DB init queries
+ */
+static const TCHAR *s_dbInitQueries[] =
+{
+   _T("CREATE TABLE agent_policy (")
+   _T("  guid varchar(36) not null,")
+   _T("  type integer not null,")
+   _T("  server_info varchar(64) null,")
+   _T("  server_id number(20) not null,")
+   _T("  version integer not null,")
+   _T("  PRIMARY KEY(guid))"),
+
+   _T("CREATE TABLE dc_config (")
+   _T("  server_id number(20) not null,")
+   _T("  dci_id integer not null,")
+   _T("  type integer not null,")
+   _T("  origin integer not null,")
+   _T("  name varchar(1023) null,")
+   _T("  polling_interval integer not null,")
+   _T("  last_poll integer not null,")
+   _T("  snmp_port integer not null,")
+   _T("  snmp_target_guid varchar(36) not null,")
+   _T("  snmp_raw_type integer not null,")
+   _T("  PRIMARY KEY(server_id,dci_id))"),
+
+   _T("CREATE TABLE dc_queue (")
+   _T("  server_id number(20) not null,")
+   _T("  dci_id integer not null,")
+   _T("  dci_type integer not null,")
+   _T("  dci_origin integer not null,")
+   _T("  snmp_target_guid varchar(36) not null,")
+   _T("  timestamp integer not null,")
+   _T("  value varchar not null,")
+   _T("  status_code integer not null,")
+   _T("  PRIMARY KEY(server_id,dci_id,timestamp))"),
+
+   _T("CREATE TABLE dc_snmp_targets (")
+   _T("  guid varchar(36) not null,")
+   _T("  server_id number(20) not null,")
+   _T("  ip_address varchar(48) not null,")
+   _T("  snmp_version integer not null,")
+   _T("  port integer not null,")
+   _T("  auth_type integer not null,")
+   _T("  enc_type integer not null,")
+   _T("  auth_name varchar(63),")
+   _T("  auth_pass varchar(63),")
+   _T("  enc_pass varchar(63),")
+   _T("  PRIMARY KEY(guid))"),
+
+   _T("CREATE TABLE registry (")
+   _T("  attribute varchar(63) null,")
+   _T("  value varchar null,")
+   _T("  PRIMARY KEY(attribute))"),
+
+   NULL
+};
+
+/**
+ * Initialize new database
+ */
+static bool InitDatabase()
+{
+   for(int i = 0; s_dbInitQueries[i] != NULL; i++)
+      if (!DBQuery(s_db, s_dbInitQueries[i]))
+         return false;
+   nxlog_debug(1, _T("Empty local database initialized successfully"));
+   return true;
+}
+
+/**
+ * Database tables
+ */
+static const TCHAR *s_dbTables[] = { _T("agent_policy"), _T("dc_config"), _T("dc_queue"), _T("dc_snmp_targets"), _T("registry"), NULL };
+
 /**
  * Check database structure
  */
@@ -96,6 +171,13 @@ static bool CheckDatabaseStructure()
    {
       DBQuery(s_db, _T("CREATE TABLE metadata (attribute varchar(63), value varchar(255), PRIMARY KEY(attribute))"));
 
+      // assume empty database, create tables
+      if (!InitDatabase())
+      {
+         nxlog_write(MSG_LOCAL_DB_CORRUPTED, NXLOG_ERROR, NULL);
+         return false;
+      }
+
       TCHAR query[256];
       _sntprintf(query, 256, _T("INSERT INTO metadata (attribute, value) VALUES ('SchemaVersion', '%d')"), DB_SCHEMA_VERSION);
       DBQuery(s_db, query);
@@ -112,6 +194,22 @@ static bool CheckDatabaseStructure()
       nxlog_write(MSG_LOCAL_DB_CORRUPTED, NXLOG_ERROR, NULL);
       return false;
    }
+
+   bool success = true;
+   for(int i = 0; s_dbTables[i] != NULL; i++)
+   {
+      if (!DBIsTableExist(s_db, s_dbTables[i]))
+      {
+         nxlog_debug(1, _T("Local database table %s does not exist"), s_dbTables[i]);
+         success = false;
+      }
+   }
+   if (!success)
+   {
+      nxlog_write(MSG_LOCAL_DB_CORRUPTED, NXLOG_ERROR, NULL);
+      return false;
+   }
+
    return true;
 }
 
@@ -141,7 +239,7 @@ bool OpenLocalDatabase()
    s_db = DBConnect(s_driver, NULL, dbFile, NULL, NULL, NULL, errorText);
    if (s_db == NULL)
    {
-      DebugPrintf(INVALID_INDEX, 1, _T("Local database open error: %s"), errorText);
+      nxlog_debug(1, _T("Local database open error: %s"), errorText);
           g_failFlags = FAIL_OPEN_DATABASE;
       return false;
    }
index b5f8e6f..6b443c2 100644 (file)
@@ -317,7 +317,7 @@ Unable to open local database
 MessageId=
 SymbolicName=MSG_LOCAL_DB_CORRUPTED
 Language=English
-Local database corrupted and cannot be used
+Local database is corrupted and cannot be used
 .
 
 MessageId=