Added database driver API version checking
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 23 Aug 2006 20:38:40 +0000 (20:38 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 23 Aug 2006 20:38:40 +0000 (20:38 +0000)
src/libnetxms/dload.cpp
src/server/dbdrv/mssql/mssql.cpp
src/server/dbdrv/mysql/mysql.cpp
src/server/dbdrv/odbc/odbc.cpp
src/server/dbdrv/pgsql/pgsql.cpp
src/server/dbdrv/sqlite/sqlite.cpp
src/server/include/dbdrv.h
src/server/libnxsrv/db.cpp
src/server/libnxsrv/messages.mc
src/server/netxmsd/netxmsd.cpp

index 29afacd..dfd316a 100644 (file)
@@ -146,14 +146,15 @@ void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule,
 #else
    pAddr = GetProcAddress(hModule, pszSymbol);
 #endif
-   if (pAddr == NULL)
+   if ((pAddr == NULL) && (pszErrorText != NULL))
       GetSystemErrorText(GetLastError(), pszErrorText, 255);
 #elif defined(_NETWARE)
    pAddr = ImportPublicObject(hModule, pszSymbol);
-   *pszErrorText = 0;
+   if (pszErrorText != NULL)
+      *pszErrorText = 0;
 #else    /* _WIN32 */
    pAddr = dlsym(hModule, pszSymbol);
-   if (pAddr == NULL)
+   if ((pAddr == NULL) && (pszErrorText != NULL))
       nx_strncpy(pszErrorText, dlerror(), 255);
 #endif
    return pAddr;
index 00c6684..122b385 100644 (file)
@@ -99,6 +99,13 @@ static BOOL Reconnect(MSDB_CONN *pConn)
 }
 
 
+//
+// API version
+//
+
+extern "C" int EXPORT drvAPIVersion = DBDRV_API_VERSION;
+
+
 //
 // Initialize driver
 //
index b84b2b0..5613341 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** MySQL Database Driver
-** Copyright (C) 2003, 2004, 2005 Victor Kirhenshtein
+** Copyright (C) 2003, 2004, 2005, 2006 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include "mysqldrv.h"
 
 
+//
+// API version
+//
+
+extern "C" int EXPORT drvAPIVersion = DBDRV_API_VERSION;
+
+
 //
 // Initialize driver
 //
index e43dfc7..f260bb9 100644 (file)
 #define DATA_BUFFER_SIZE      65536
 
 
+//
+// API version
+//
+
+extern "C" int EXPORT drvAPIVersion = DBDRV_API_VERSION;
+
+
 //
 // Convert ODBC state to NetXMS database error code
 //
index aec26e9..28b08df 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: pgsql.cpp,v 1.14 2006-08-21 15:11:57 victor Exp $ */
+/* $Id: pgsql.cpp,v 1.15 2006-08-23 20:38:38 victor Exp $ */
 /* 
 ** PostgreSQL Database Driver
 ** Copyright (C) 2003, 2005 Victor Kirhenshtein and Alex Kirhenshtein
 #include "pgsqldrv.h"
 
 
+//
+// API version
+//
+
+extern "C" int EXPORT drvAPIVersion = DBDRV_API_VERSION;
+
+
 //
 // Initialize driver
 //
index 1d30c5f..14924e6 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** SQLite Database Driver
-** Copyright (C) 2005 Victor Kirhenshtein
+** Copyright (C) 2005, 2006 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include "sqlitedrv.h"
 
 
+//
+// API version
+//
+
+extern "C" int EXPORT drvAPIVersion = DBDRV_API_VERSION;
+
+
 //
 // SELECT callback
 //
index 3046c97..df61212 100644 (file)
 #include <nms_common.h>
 
 
+//
+// API version
+//
+
+#define DBDRV_API_VERSION           1
+
+
 //
 // Datatypes
 //
index 09fc266..c8e6b7d 100644 (file)
@@ -87,7 +87,9 @@ BOOL LIBNXSRV_EXPORTABLE DBInit(BOOL bWriteLog, BOOL bLogErrors, BOOL bDumpSQL,
                                 void (* fpEventHandler)(DWORD, TCHAR *))
 {
    BOOL (* fpDrvInit)(char *);
+   DWORD *pdwAPIVersion;
    char szErrorText[256];
+   static DWORD dwVersionZero = 0;
 
    m_bWriteLog = bWriteLog;
    m_bLogSQLErrors = bLogErrors && bWriteLog;
@@ -105,6 +107,20 @@ BOOL LIBNXSRV_EXPORTABLE DBInit(BOOL bWriteLog, BOOL bLogErrors, BOOL bDumpSQL,
       return FALSE;
    }
 
+   // Check API version supported by driver
+   pdwAPIVersion = (DWORD *)DLGetSymbolAddr(m_hDriver, "drvAPIVersion", NULL);
+   if (pdwAPIVersion == NULL)
+      pdwAPIVersion = &dwVersionZero;
+   if (*pdwAPIVersion != DBDRV_API_VERSION)
+   {
+      if (m_bWriteLog)
+         WriteLog(MSG_DBDRV_API_VERSION_MISMATCH, EVENTLOG_ERROR_TYPE, "sdd",
+                  g_szDbDriver, DBDRV_API_VERSION, *pdwAPIVersion);
+      DLClose(m_hDriver);
+      m_hDriver = NULL;
+      return FALSE;
+   }
+
    // Import symbols
    fpDrvInit = (BOOL (*)(char *))DLGetSymbolAddrEx(m_hDriver, "DrvInit");
    m_fpDrvConnect = (DB_CONNECTION (*)(char *, char *, char *, char *))DLGetSymbolAddrEx(m_hDriver, "DrvConnect");
index 7608d76..31006b2 100644 (file)
@@ -560,4 +560,10 @@ Language=English
 Stalled database lock removed
 .
 
+MessageId=
+SymbolicName=MSG_DBDRV_API_VERSION_MISMATCH
+Language=English
+Database driver "%1" cannot be loaded because of API version mismatch (driver: %3; server: %2)
+.
+
 ;#endif
index 5b3f226..198e3aa 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Server startup module
-** Copyright (C) 2003, 2004 NetXMS Team
+** Copyright (C) 2003, 2004, 2005, 2006 NetXMS Team
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -141,7 +141,7 @@ static BOOL ParseCommandLine(int argc, char *argv[])
       }
       else if (!strcmp(argv[i], "version"))    // Display version and exit
       {
-         printf("NMS Version " NETXMS_VERSION_STRING " Build of " __DATE__ "\n");
+         printf("NetXMS Server Version " NETXMS_VERSION_STRING " Build of " __DATE__ "\n");
          return FALSE;
       }
       else if (!strcmp(argv[i], "--config"))  // Config file
@@ -367,7 +367,7 @@ int main(int argc, char *argv[])
    {
       if (!Initialize())
       {
-         printf("NMS Core initialization failed\n");
+         printf("NetXMS Core initialization failed\n");
 
          // Remove database lock
          if (g_dwFlags & AF_DB_LOCKED)