Added functions for agent database registry reading, writing deleting
authorTatjana Dubrovica <zev@radensolutions.com>
Thu, 19 May 2016 13:09:55 +0000 (16:09 +0300)
committerTatjana Dubrovica <zev@radensolutions.com>
Thu, 19 May 2016 13:10:03 +0000 (16:10 +0300)
include/nms_agent.h
src/agent/core/nxagentd.cpp
src/agent/libnxagent/bridge.cpp

index 354f328..523e0f4 100644 (file)
@@ -655,5 +655,12 @@ bool LIBNXAGENT_EXPORTABLE AgentSleepAndCheckForShutdown(UINT32 sleepTime);
 const TCHAR LIBNXAGENT_EXPORTABLE *AgentGetDataDirectory();
 
 DB_HANDLE LIBNXAGENT_EXPORTABLE AgentGetLocalDatabaseHandle();
+TCHAR LIBNXAGENT_EXPORTABLE *ReadRegistryAsString(const TCHAR *attr, TCHAR *buffer = NULL, int bufSize = 0, const TCHAR *defaultValue = NULL);
+INT32 LIBNXAGENT_EXPORTABLE ReadRegistryAsInt32(const TCHAR *attr, INT32 defaultValue);
+INT64 LIBNXAGENT_EXPORTABLE ReadRegistryAsInt64(const TCHAR *attr, INT64 defaultValue);
+bool LIBNXAGENT_EXPORTABLE WriteRegistry(const TCHAR *attr, const TCHAR *value);
+bool LIBNXAGENT_EXPORTABLE WriteRegistry(const TCHAR *attr, const TCHAR *value);
+bool LIBNXAGENT_EXPORTABLE WriteRegistry(const TCHAR *attr, INT64 defaultValue);
+bool LIBNXAGENT_EXPORTABLE DeleteRegistryEntry(const TCHAR *attr);
 
 #endif   /* _nms_agent_h_ */
index 52250a8..f0cd887 100644 (file)
@@ -991,22 +991,13 @@ BOOL Initialize()
        }
 
        // Delete file used for upgrade if exists
-       DB_HANDLE hdb = GetLocalDatabaseHandle();
-       if(hdb != NULL)
-   {
-      DB_RESULT hResult = DBSelect(hdb, _T("SELECT value FROM registry WHERE attribute='upgrade.file'"));
-      if (hResult != NULL && DBGetNumRows(hResult) > 0)
-      {
-         TCHAR upgradeFileAnme[MAX_PATH];
-         DBGetField(hResult, 0, 0, upgradeFileAnme, MAX_PATH);
-         if(upgradeFileAnme != NULL)
-         {
-            _tremove(upgradeFileAnme);
-         }
-         DBQuery(hdb, _T("DELETE FROM registry WHERE attribute='upgrade.file'"));
-         DBFreeResult(hResult);
-      }
-   }
+   TCHAR upgradeFileName[MAX_PATH];
+       ReadRegistryAsString(_T("upgrade.file"), upgradeFileName, MAX_PATH, _T(""));
+       if(upgradeFileName[0] != 0)
+       {
+      _tremove(upgradeFileName);
+      DeleteRegistryEntry(_T("upgrade.file"));
+       }
 
    return TRUE;
 }
index b173d31..f015d4c 100644 (file)
@@ -281,3 +281,183 @@ DB_HANDLE LIBNXAGENT_EXPORTABLE AgentGetLocalDatabaseHandle()
 {
    return (s_fpGetLocalDatabaseHandle != NULL) ? s_fpGetLocalDatabaseHandle() : NULL;
 }
+
+/**
+ * Read registry value as a string using provided attribute.
+ *
+ * @return attribute value or default value if no value found
+ */
+TCHAR LIBNXAGENT_EXPORTABLE *ReadRegistryAsString(const TCHAR *attr, TCHAR *buffer, int bufSize, const TCHAR *defaultValue)
+{
+   TCHAR *value = NULL;
+
+       DB_HANDLE hdb = AgentGetLocalDatabaseHandle();
+       if(hdb != NULL && attr != NULL)
+   {
+      DB_STATEMENT hStmt = DBPrepare(hdb, _T("SELECT value FROM registry WHERE attribute='?'"));
+      if (hStmt != NULL)
+      {
+         DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, attr, DB_BIND_STATIC);
+         DB_RESULT hResult = DBSelectPrepared(hStmt);
+         if (hResult != NULL)
+         {
+            if(DBGetNumRows(hResult) > 0)
+               value = DBGetField(hResult, 0, 0, buffer, bufSize);
+            DBFreeResult(hResult);
+         }
+         DBFreeStatement(hStmt);
+      }
+   }
+
+   if(value == NULL)
+   {
+      if(buffer == NULL)
+      {
+         value = defaultValue != NULL ? _tcsdup(defaultValue) : NULL;
+      }
+      else
+         value = defaultValue != NULL ? _tcsncpy(buffer, defaultValue, bufSize) : NULL;
+   }
+   return value;
+}
+
+/**
+ * Read registry value as a INT32 using provided attribute.
+ *
+ * @return attribute value or default value in no value found
+ */
+INT32 LIBNXAGENT_EXPORTABLE ReadRegistryAsInt32(const TCHAR *attr, INT32 defaultValue)
+{
+   TCHAR buffer[MAX_DB_STRING];
+   ReadRegistryAsString(attr, buffer, MAX_DB_STRING, NULL);
+   if(buffer == NULL)
+   {
+      return defaultValue;
+   }
+   else
+   {
+      return _tcstol(buffer, NULL, 0);
+   }
+}
+
+/**
+ * Read registry value as a INT32 using provided attribute.
+ *
+ * @return attribute value or default value in no value found
+ */
+INT64 LIBNXAGENT_EXPORTABLE ReadRegistryAsInt64(const TCHAR *attr, INT64 defaultValue)
+{
+   TCHAR buffer[MAX_DB_STRING];
+   ReadRegistryAsString(attr, buffer, MAX_DB_STRING, NULL);
+   if(buffer == NULL)
+   {
+      return defaultValue;
+   }
+   else
+   {
+      return _tcstoll(buffer, NULL, 0);
+   }
+}
+
+/**
+ * Write registry value as a string. This method inserts new value or update existing.
+ *
+ * @return if this update/insert was successful
+ */
+bool LIBNXAGENT_EXPORTABLE WriteRegistry(const TCHAR *attr, const TCHAR *value)
+{
+   DB_HANDLE hdb = AgentGetLocalDatabaseHandle();
+   if (_tcslen(attr) > 63 || hdb == NULL)
+      return false;
+
+   // Check for variable existence
+       DB_STATEMENT hStmt = DBPrepare(hdb, _T("SELECT value FROM registry WHERE attribute='?'"));
+       if (hStmt == NULL)
+   {
+               return false;
+   }
+       DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, attr, DB_BIND_STATIC);
+       DB_RESULT hResult = DBSelectPrepared(hStmt);
+   bool varExist = false;
+   if (hResult != NULL)
+   {
+      if (DBGetNumRows(hResult) > 0)
+         varExist = true;
+      DBFreeResult(hResult);
+   }
+       DBFreeStatement(hStmt);
+
+   // Create or update variable value
+   if (varExist)
+       {
+               hStmt = DBPrepare(hdb, _T("UPDATE registry SET value=? WHERE attribute='?'"));
+               if (hStmt == NULL)
+      {
+                       return false;
+      }
+      DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, value, DB_BIND_STATIC);
+               DBBind(hStmt, 2, DB_SQLTYPE_VARCHAR, attr, DB_BIND_STATIC);
+       }
+   else
+       {
+               hStmt = DBPrepare(hdb, _T("INSERT INTO metadata (attribute,value) VALUES (?,?)"));
+               if (hStmt == NULL)
+      {
+                       return false;
+      }
+               DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, attr, DB_BIND_STATIC);
+               DBBind(hStmt, 2, DB_SQLTYPE_VARCHAR, value, DB_BIND_STATIC);
+       }
+   bool success = DBExecute(hStmt);
+       DBFreeStatement(hStmt);
+   DBConnectionPoolReleaseConnection(hdb);
+       return success;
+}
+
+/**
+ * Write registry value as a INT32. This method inserts new value or update existing.
+ *
+ * @return if this update/insert was successful
+ */
+bool LIBNXAGENT_EXPORTABLE WriteRegistry(const TCHAR *attr, INT32 *value)
+{
+   TCHAR buffer[64];
+   _sntprintf(buffer, 64, _T("%d"), value);
+   return WriteRegistry(attr, buffer);
+}
+
+/**
+ * Write registry value as a INT64. This method inserts new value or update existing.
+ *
+ * @return if this update/insert was successful
+ */
+bool LIBNXAGENT_EXPORTABLE WriteRegistry(const TCHAR *attr, INT64 value)
+{
+   TCHAR buffer[64];
+   _sntprintf(buffer, 64, INT64_FMT, value);
+   return WriteRegistry(attr, buffer);
+}
+
+/**
+ * Delete registry entry
+ *
+ * @return if this delete was successful
+ */
+bool LIBNXAGENT_EXPORTABLE DeleteRegistryEntry(const TCHAR *attr)
+{
+   bool success = false;
+
+   DB_HANDLE hdb = AgentGetLocalDatabaseHandle();
+       if(hdb == NULL || attr == NULL)
+      return false;
+
+   DB_STATEMENT hStmt = DBPrepare(hdb, _T("DELETE FROM registry WHERE attribute='?'"));
+   if (hStmt != NULL)
+   {
+      DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, attr, DB_BIND_STATIC);
+      success = DBExecute(hStmt);
+      DBFreeStatement(hStmt);
+   }
+   return success;
+}
+