Re: Is the linking with -lodbc necessary? (--with-odbc)

Pavel Raiskup <[email protected]> Wed, 13 Nov 2013 11:41:40 +0100
Newsgroups gmane.comp.db.postgresql.odbc,gmane.comp.db.unixodbc.devel
Organization Red Hat
Message-ID <[email protected]>
This is a multi-part message in MIME format.

--nextPart2143267.AoGL4p4ssy
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"

[+cc back psqlodbc]
[+cc unixODBC]

On Tuesday, November 12, 2013 11:46:39 Nick Gorham wrote:
> On 11/11/13 17:50, Pavel Raiskup wrote:
> > Hello all!
> >
> > Long story short: Is there a need to link psqlodbcw.so plugin against
> > libodbc.so?  Principal problem: That library provides ABI for applications
> > - not for plugins; at least it seem to be like that.
> >
> > I tried to remove this linking by following tweak:
>
> Hi,
>
> As you have noticed, there is code in the DM to try and avoid what you
> describe. But AFAIK, a driver would normally link against -lodbcinst to
> gain access to the ini functions SQLGetPrivateProfileString and so on,
> no need to link to the driver manager (-lodbc) that is for application
> land use.

Hello Nick, thanks for looking at the problem from unixODBC perspective!

Would not there be better rather block loading badly linked plugins rather
than just try to expect that the linking is done the same way on all arches?
I attached possible solution.

Pavel

--nextPart2143267.AoGL4p4ssy
Content-Disposition: attachment; filename="0001-DM-Don-t-load-plugins-linked-back-against-libodbc.so.patch"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-patch; charset="UTF-8"; name="0001-DM-Don-t-load-plugins-linked-back-against-libodbc.so.patch"

From 8353fe74b3c79e23f645d9c76826dbc0bf3db3d8 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <[email protected]>
Date: Wed, 13 Nov 2013 10:37:30 +0100
Subject: [PATCH] DM: don't load plugins linked back against libodbc.so

Previously, DM tried to load and work with such plugins.  This
could result on some arm and s390 architectures (linux) to
problems with resolving API symbols.

As a solution we should not try to load such moudules and rather
fail with proper explanation.  This should force plugin developers
to not link against libodbc.so as there should not be any real
need.

For more info look at:
http://www.postgresql.org/message-id/[email protected]
---
 DriverManager/DriverManager.exp |   1 +
 DriverManager/Makefile.am       |   9 +-
 DriverManager/SQLConnect.c      | 228 ++++++++++++++++------------------------
 DriverManager/drivermanager.h   |  16 ++-
 configure.in                    |   2 +
 odbcinst/Makefile.am            |   2 +-
 6 files changed, 108 insertions(+), 150 deletions(-)

diff --git a/DriverManager/DriverManager.exp b/DriverManager/DriverManager.exp
index bb09bdb..39b801f 100644
--- a/DriverManager/DriverManager.exp
+++ b/DriverManager/DriverManager.exp
@@ -159,3 +159,4 @@ uodbc_get_stats
 uodbc_stats_error
 ODBCSetTryWaitValue
 ODBCGetTryWaitValue
+__UNIXODBC_PLUGIN_GUARD
diff --git a/DriverManager/Makefile.am b/DriverManager/Makefile.am
index d5d7421..d7162d9 100644
--- a/DriverManager/Makefile.am
+++ b/DriverManager/Makefile.am
@@ -18,16 +18,17 @@ libodbc_la_LIBADD = \
 	$(LIBICONV)
 
 libodbc_la_LDFLAGS = \
-	-version-info @LIB_VERSION@ \
+	-version-info @LIBINST_VERSION@ \
 	-no-undefined \
 	-export-dynamic \
 	-export-symbols @srcdir@/DriverManager.exp
 
 libodbc_la_DEPENDENCIES = $(LTDLDEPS) \
 	../lst/liblstlc.la \
-    ../log/libloglc.la \
-    ../ini/libinilc.la \
-    ../odbcinst/libodbcinstlc.la 
+	../log/libloglc.la \
+	../ini/libinilc.la \
+	../odbcinst/libodbcinstlc.la \
+	DriverManager.exp
 
 libodbc_la_SOURCES = \
 	SQLAllocConnect.c \
diff --git a/DriverManager/SQLConnect.c b/DriverManager/SQLConnect.c
index 306e951..d3cc13d 100644
--- a/DriverManager/SQLConnect.c
+++ b/DriverManager/SQLConnect.c
@@ -614,122 +614,85 @@ static char const rcsid[]= "$RCSfile: SQLConnect.c,v $ $Revision: 1.66 $";
 
 static struct driver_func  template_func[] =
 {
-    /* 00 */ { SQL_API_SQLALLOCCONNECT,      "SQLAllocConnect", (void*)SQLAllocConnect },
-    /* 01 */ { SQL_API_SQLALLOCENV,          "SQLAllocEnv", (void*)SQLAllocEnv  },
-    /* 02 */ { SQL_API_SQLALLOCHANDLE,       "SQLAllocHandle", (void*)SQLAllocHandle },
-    /* 03 */ { SQL_API_SQLALLOCSTMT,         "SQLAllocStmt", (void*)SQLAllocStmt },
-    /* 04 */ { SQL_API_SQLALLOCHANDLESTD,    "SQLAllocHandleStd", (void*)SQLAllocHandleStd },
-    /* 05 */ { SQL_API_SQLBINDCOL,           "SQLBindCol", (void*)SQLBindCol },
-    /* 06 */ { SQL_API_SQLBINDPARAM,         "SQLBindParam", (void*)SQLBindParam },
-    /* 07 */ { SQL_API_SQLBINDPARAMETER,     "SQLBindParameter", (void*)SQLBindParameter },
-    /* 08 */ { SQL_API_SQLBROWSECONNECT,     "SQLBrowseConnect", 
-                (void*)SQLBrowseConnect, (void*)SQLBrowseConnectW },
-    /* 09 */ { SQL_API_SQLBULKOPERATIONS,    "SQLBulkOperations", (void*)SQLBulkOperations },
-    /* 10 */ { SQL_API_SQLCANCEL,            "SQLCancel", (void*)SQLCancel },
-    /* 11 */ { SQL_API_SQLCLOSECURSOR,       "SQLCloseCursor", (void*)SQLCloseCursor },
-    /* 12 */ { SQL_API_SQLCOLATTRIBUTE,      "SQLColAttribute", 
-                (void*)SQLColAttribute, (void*)SQLColAttributeW },
-    /* 13 */ { SQL_API_SQLCOLATTRIBUTES,     "SQLColAttributes", 
-                (void*)SQLColAttributes, (void*)SQLColAttributesW },
-    /* 14 */ { SQL_API_SQLCOLUMNPRIVILEGES,  "SQLColumnPrivileges", 
-                (void*)SQLColumnPrivileges, (void*)SQLColumnPrivilegesW },
-    /* 15 */ { SQL_API_SQLCOLUMNS,           "SQLColumns", 
-                (void*)SQLColumns, (void*)SQLColumnsW },
-    /* 16 */ { SQL_API_SQLCONNECT,           "SQLConnect", 
-                (void*)SQLConnect, (void*)SQLConnectW },
-    /* 17 */ { SQL_API_SQLCOPYDESC,          "SQLCopyDesc", (void*)SQLCopyDesc },
-    /* 18 */ { SQL_API_SQLDATASOURCES,       "SQLDataSources", 
-                (void*)SQLDataSources, (void*)SQLDataSourcesW },
-    /* 19 */ { SQL_API_SQLDESCRIBECOL,       "SQLDescribeCol", 
-                (void*)SQLDescribeCol, (void*)SQLDescribeColW },
-    /* 20 */ { SQL_API_SQLDESCRIBEPARAM,     "SQLDescribeParam", (void*)SQLDescribeParam },
-    /* 21 */ { SQL_API_SQLDISCONNECT,        "SQLDisconnect", (void*)SQLDisconnect },
-    /* 22 */ { SQL_API_SQLDRIVERCONNECT,     "SQLDriverConnect", 
-                (void*)SQLDriverConnect, (void*)SQLDriverConnectW },
-    /* 23 */ { SQL_API_SQLDRIVERS,           "SQLDrivers", 
-                (void*)SQLDrivers, (void*)SQLDriversW },
-    /* 24 */ { SQL_API_SQLENDTRAN,           "SQLEndTran", (void*)SQLEndTran },
-    /* 25 */ { SQL_API_SQLERROR,             "SQLError", 
-                (void*)SQLError, (void*)SQLErrorW },
-    /* 26 */ { SQL_API_SQLEXECDIRECT,        "SQLExecDirect", 
-                (void*)SQLExecDirect, (void*)SQLExecDirectW },
-    /* 27 */ { SQL_API_SQLEXECUTE,           "SQLExecute", (void*)SQLExecute },
-    /* 28 */ { SQL_API_SQLEXTENDEDFETCH,     "SQLExtendedFetch", (void*)SQLExtendedFetch },
-    /* 29 */ { SQL_API_SQLFETCH,             "SQLFetch", (void*)SQLFetch },
-    /* 30 */ { SQL_API_SQLFETCHSCROLL,       "SQLFetchScroll", (void*)SQLFetchScroll },
-    /* 31 */ { SQL_API_SQLFOREIGNKEYS,       "SQLForeignKeys", 
-                (void*)SQLForeignKeys, (void*)SQLForeignKeysW },
-    /* 32 */ { SQL_API_SQLFREEENV,           "SQLFreeEnv", (void*)SQLFreeEnv },
-    /* 33 */ { SQL_API_SQLFREEHANDLE,        "SQLFreeHandle", (void*)SQLFreeHandle },
-    /* 34 */ { SQL_API_SQLFREESTMT,          "SQLFreeStmt", (void*)SQLFreeStmt },
-    /* 35 */ { SQL_API_SQLFREECONNECT,       "SQLFreeConnect", (void*)SQLFreeConnect },
-    /* 36 */ { SQL_API_SQLGETCONNECTATTR,    "SQLGetConnectAttr", 
-                (void*)SQLGetConnectAttr, (void*)SQLGetConnectAttrW },
-    /* 37 */ { SQL_API_SQLGETCONNECTOPTION,  "SQLGetConnectOption", 
-                (void*)SQLGetConnectOption, (void*)SQLGetConnectOptionW },
-    /* 38 */ { SQL_API_SQLGETCURSORNAME,     "SQLGetCursorName", 
-                (void*)SQLGetCursorName, (void*)SQLGetCursorNameW },
-    /* 39 */ { SQL_API_SQLGETDATA,           "SQLGetData", (void*)SQLGetData },
-    /* 40 */ { SQL_API_SQLGETDESCFIELD,      "SQLGetDescField", 
-                (void*)SQLGetDescField, (void*)SQLGetDescFieldW },
-    /* 41 */ { SQL_API_SQLGETDESCREC,        "SQLGetDescRec", 
-                (void*)SQLGetDescRec, (void*)SQLGetDescRecW },
-    /* 42 */ { SQL_API_SQLGETDIAGFIELD,      "SQLGetDiagField", 
-                (void*)SQLGetDiagField, (void*)SQLGetDiagFieldW },
-    /* 43 */ { SQL_API_SQLGETENVATTR,        "SQLGetEnvAttr", (void*)SQLGetEnvAttr },
-    /* 44 */ { SQL_API_SQLGETFUNCTIONS,      "SQLGetFunctions", (void*)SQLGetFunctions },
-    /* 45 */ { SQL_API_SQLGETINFO,           "SQLGetInfo", 
-                (void*)SQLGetInfo, (void*)SQLGetInfoW },
-    /* 46 */ { SQL_API_SQLGETSTMTATTR,       "SQLGetStmtAttr", 
-                (void*)SQLGetStmtAttr, (void*)SQLGetStmtAttrW },
-    /* 47 */ { SQL_API_SQLGETSTMTOPTION,     "SQLGetStmtOption", (void*)SQLGetStmtOption },
-    /* 48 */ { SQL_API_SQLGETTYPEINFO,       "SQLGetTypeInfo", 
-                (void*)SQLGetTypeInfo, (void*)SQLGetTypeInfoW },
-    /* 49 */ { SQL_API_SQLMORERESULTS,       "SQLMoreResults", (void*)SQLMoreResults },
-    /* 50 */ { SQL_API_SQLNATIVESQL,         "SQLNativeSql", 
-                (void*)SQLNativeSql, (void*)SQLNativeSqlW },
-    /* 51 */ { SQL_API_SQLNUMPARAMS,         "SQLNumParams", (void*)SQLNumParams },
-    /* 52 */ { SQL_API_SQLNUMRESULTCOLS,     "SQLNumResultCols", (void*)SQLNumResultCols },
-    /* 53 */ { SQL_API_SQLPARAMDATA,         "SQLParamData", (void*)SQLParamData },
-    /* 54 */ { SQL_API_SQLPARAMOPTIONS,      "SQLParamOptions", (void*)SQLParamOptions },
-    /* 55 */ { SQL_API_SQLPREPARE,           "SQLPrepare", 
-                (void*)SQLPrepare, (void*)SQLPrepareW },
-    /* 56 */ { SQL_API_SQLPRIMARYKEYS,       "SQLPrimaryKeys", 
-                (void*)SQLPrimaryKeys, (void*)SQLPrimaryKeysW },
-    /* 57 */ { SQL_API_SQLPROCEDURECOLUMNS,  "SQLProcedureColumns", 
-                (void*)SQLProcedureColumns, (void*)SQLProcedureColumnsW },
-    /* 58 */ { SQL_API_SQLPROCEDURES,        "SQLProcedures", 
-                (void*)SQLProcedures, (void*)SQLProceduresW },
-    /* 59 */ { SQL_API_SQLPUTDATA,           "SQLPutData", (void*)SQLPutData },
-    /* 60 */ { SQL_API_SQLROWCOUNT,          "SQLRowCount", (void*)SQLRowCount },
-    /* 61 */ { SQL_API_SQLSETCONNECTATTR,    "SQLSetConnectAttr", 
-                (void*)SQLSetConnectAttr, (void*)SQLSetConnectAttrW },
-    /* 62 */ { SQL_API_SQLSETCONNECTOPTION,  "SQLSetConnectOption", 
-                (void*)SQLSetConnectOption, (void*)SQLSetConnectOptionW },
-    /* 63 */ { SQL_API_SQLSETCURSORNAME,     "SQLSetCursorName", 
-                (void*)SQLSetCursorName, (void*)SQLSetCursorNameW },
-    /* 64 */ { SQL_API_SQLSETDESCFIELD,      "SQLSetDescField", 
-                (void*)SQLSetDescField, (void*)SQLSetDescFieldW },
-    /* 65 */ { SQL_API_SQLSETDESCREC,        "SQLSetDescRec", (void*)SQLSetDescRec },
-    /* 66 */ { SQL_API_SQLSETENVATTR,        "SQLSetEnvAttr", (void*)SQLSetEnvAttr },
-    /* 67 */ { SQL_API_SQLSETPARAM,          "SQLSetParam", (void*)SQLSetParam },
-    /* 68 */ { SQL_API_SQLSETPOS,            "SQLSetPos", (void*)SQLSetPos },
-    /* 69 */ { SQL_API_SQLSETSCROLLOPTIONS,  "SQLSetScrollOptions", (void*)SQLSetScrollOptions },
-    /* 70 */ { SQL_API_SQLSETSTMTATTR,       "SQLSetStmtAttr", 
-                (void*)SQLSetStmtAttr, (void*)SQLSetStmtAttrW },
-    /* 71 */ { SQL_API_SQLSETSTMTOPTION,     "SQLSetStmtOption", (void*)SQLSetStmtOption },
-    /* 72 */ { SQL_API_SQLSPECIALCOLUMNS,    "SQLSpecialColumns", 
-                (void*)SQLSpecialColumns, (void*)SQLSpecialColumnsW },
-    /* 73 */ { SQL_API_SQLSTATISTICS,        "SQLStatistics", 
-                (void*)SQLStatistics, (void*)SQLStatisticsW },
-    /* 74 */ { SQL_API_SQLTABLEPRIVILEGES,   "SQLTablePrivileges", 
-                (void*)SQLTablePrivileges, (void*)SQLTablePrivilegesW },
-    /* 75 */ { SQL_API_SQLTABLES,            "SQLTables", 
-                (void*)SQLTables, (void*)SQLTablesW },
-    /* 76 */ { SQL_API_SQLTRANSACT,          "SQLTransact", (void*)SQLTransact },
-    /* 77 */ { SQL_API_SQLGETDIAGREC,        "SQLGetDiagRec", 
-                (void*)SQLGetDiagRec, (void*)SQLGetDiagRecW },
-    /* 78 */ { SQL_API_SQLCANCELHANDLE,      "SQLCancelHandle", (void*)SQLCancelHandle },
+    /* 00 */ { SQL_API_SQLALLOCCONNECT,      "SQLAllocConnect"               },
+    /* 01 */ { SQL_API_SQLALLOCENV,          "SQLAllocEnv"                   },
+    /* 02 */ { SQL_API_SQLALLOCHANDLE,       "SQLAllocHandle"                },
+    /* 03 */ { SQL_API_SQLALLOCSTMT,         "SQLAllocStmt"                  },
+    /* 04 */ { SQL_API_SQLALLOCHANDLESTD,    "SQLAllocHandleStd"             },
+    /* 05 */ { SQL_API_SQLBINDCOL,           "SQLBindCol"                    },
+    /* 06 */ { SQL_API_SQLBINDPARAM,         "SQLBindParam"                  },
+    /* 07 */ { SQL_API_SQLBINDPARAMETER,     "SQLBindParameter"              },
+    /* 08 */ { SQL_API_SQLBROWSECONNECT,     "SQLBrowseConnect",             },
+    /* 09 */ { SQL_API_SQLBULKOPERATIONS,    "SQLBulkOperations"             },
+    /* 10 */ { SQL_API_SQLCANCEL,            "SQLCancel"                     },
+    /* 11 */ { SQL_API_SQLCLOSECURSOR,       "SQLCloseCursor"                },
+    /* 12 */ { SQL_API_SQLCOLATTRIBUTE,      "SQLColAttribute",         TRUE },
+    /* 13 */ { SQL_API_SQLCOLATTRIBUTES,     "SQLColAttributes",        TRUE },
+    /* 14 */ { SQL_API_SQLCOLUMNPRIVILEGES,  "SQLColumnPrivileges",     TRUE },
+    /* 15 */ { SQL_API_SQLCOLUMNS,           "SQLColumns",              TRUE },
+    /* 16 */ { SQL_API_SQLCONNECT,           "SQLConnect",              TRUE },
+    /* 17 */ { SQL_API_SQLCOPYDESC,          "SQLCopyDesc"                   },
+    /* 18 */ { SQL_API_SQLDATASOURCES,       "SQLDataSources",          TRUE },
+    /* 19 */ { SQL_API_SQLDESCRIBECOL,       "SQLDescribeCol",          TRUE },
+    /* 20 */ { SQL_API_SQLDESCRIBEPARAM,     "SQLDescribeParam"              },
+    /* 21 */ { SQL_API_SQLDISCONNECT,        "SQLDisconnect"                 },
+    /* 22 */ { SQL_API_SQLDRIVERCONNECT,     "SQLDriverConnect",        TRUE },
+    /* 23 */ { SQL_API_SQLDRIVERS,           "SQLDrivers",              TRUE },
+    /* 24 */ { SQL_API_SQLENDTRAN,           "SQLEndTran",              TRUE },
+    /* 25 */ { SQL_API_SQLERROR,             "SQLError",                TRUE },
+    /* 26 */ { SQL_API_SQLEXECDIRECT,        "SQLExecDirect",           TRUE },
+    /* 27 */ { SQL_API_SQLEXECUTE,           "SQLExecute"                    },
+    /* 28 */ { SQL_API_SQLEXTENDEDFETCH,     "SQLExtendedFetch"              },
+    /* 29 */ { SQL_API_SQLFETCH,             "SQLFetch"                      },
+    /* 30 */ { SQL_API_SQLFETCHSCROLL,       "SQLFetchScroll"                },
+    /* 31 */ { SQL_API_SQLFOREIGNKEYS,       "SQLForeignKeys",          TRUE },
+    /* 32 */ { SQL_API_SQLFREEENV,           "SQLFreeEnv"                    },
+    /* 33 */ { SQL_API_SQLFREEHANDLE,        "SQLFreeHandle"                 },
+    /* 34 */ { SQL_API_SQLFREESTMT,          "SQLFreeStmt"                   },
+    /* 35 */ { SQL_API_SQLFREECONNECT,       "SQLFreeConnect"                },
+    /* 36 */ { SQL_API_SQLGETCONNECTATTR,    "SQLGetConnectAttr",       TRUE },
+    /* 37 */ { SQL_API_SQLGETCONNECTOPTION,  "SQLGetConnectOption",     TRUE },
+    /* 38 */ { SQL_API_SQLGETCURSORNAME,     "SQLGetCursorName",        TRUE },
+    /* 39 */ { SQL_API_SQLGETDATA,           "SQLGetData"                    },
+    /* 40 */ { SQL_API_SQLGETDESCFIELD,      "SQLGetDescField",         TRUE },
+    /* 41 */ { SQL_API_SQLGETDESCREC,        "SQLGetDescRec",           TRUE },
+    /* 42 */ { SQL_API_SQLGETDIAGFIELD,      "SQLGetDiagField",         TRUE },
+    /* 43 */ { SQL_API_SQLGETENVATTR,        "SQLGetEnvAttr"                 },
+    /* 44 */ { SQL_API_SQLGETFUNCTIONS,      "SQLGetFunctions"               },
+    /* 45 */ { SQL_API_SQLGETINFO,           "SQLGetInfo",              TRUE },
+    /* 46 */ { SQL_API_SQLGETSTMTATTR,       "SQLGetStmtAttr",          TRUE },
+    /* 47 */ { SQL_API_SQLGETSTMTOPTION,     "SQLGetStmtOption"              },
+    /* 48 */ { SQL_API_SQLGETTYPEINFO,       "SQLGetTypeInfo",          TRUE },
+    /* 49 */ { SQL_API_SQLMORERESULTS,       "SQLMoreResults"                },
+    /* 50 */ { SQL_API_SQLNATIVESQL,         "SQLNativeSql",            TRUE },
+    /* 51 */ { SQL_API_SQLNUMPARAMS,         "SQLNumParams"                  },
+    /* 52 */ { SQL_API_SQLNUMRESULTCOLS,     "SQLNumResultCols"              },
+    /* 53 */ { SQL_API_SQLPARAMDATA,         "SQLParamData"                  },
+    /* 54 */ { SQL_API_SQLPARAMOPTIONS,      "SQLParamOptions"               },
+    /* 55 */ { SQL_API_SQLPREPARE,           "SQLPrepare",              TRUE },
+    /* 56 */ { SQL_API_SQLPRIMARYKEYS,       "SQLPrimaryKeys",          TRUE },
+    /* 57 */ { SQL_API_SQLPROCEDURECOLUMNS,  "SQLProcedureColumns",     TRUE },
+    /* 58 */ { SQL_API_SQLPROCEDURES,        "SQLProcedures",           TRUE },
+    /* 59 */ { SQL_API_SQLPUTDATA,           "SQLPutData"                    },
+    /* 60 */ { SQL_API_SQLROWCOUNT,          "SQLRowCount"                   },
+    /* 61 */ { SQL_API_SQLSETCONNECTATTR,    "SQLSetConnectAttr",       TRUE },
+    /* 62 */ { SQL_API_SQLSETCONNECTOPTION,  "SQLSetConnectOption",     TRUE },
+    /* 63 */ { SQL_API_SQLSETCURSORNAME,     "SQLSetCursorName",        TRUE },
+    /* 64 */ { SQL_API_SQLSETDESCFIELD,      "SQLSetDescField",         TRUE },
+    /* 65 */ { SQL_API_SQLSETDESCREC,        "SQLSetDescRec"                 },
+    /* 66 */ { SQL_API_SQLSETENVATTR,        "SQLSetEnvAttr"                 },
+    /* 67 */ { SQL_API_SQLSETPARAM,          "SQLSetParam"                   },
+    /* 68 */ { SQL_API_SQLSETPOS,            "SQLSetPos"                     },
+    /* 69 */ { SQL_API_SQLSETSCROLLOPTIONS,  "SQLSetScrollOptions"           },
+    /* 70 */ { SQL_API_SQLSETSTMTATTR,       "SQLSetStmtAttr",          TRUE },
+    /* 71 */ { SQL_API_SQLSETSTMTOPTION,     "SQLSetStmtOption"              },
+    /* 72 */ { SQL_API_SQLSPECIALCOLUMNS,    "SQLSpecialColumns",       TRUE },
+    /* 73 */ { SQL_API_SQLSTATISTICS,        "SQLStatistics",           TRUE },
+    /* 74 */ { SQL_API_SQLTABLEPRIVILEGES,   "SQLTablePrivileges",      TRUE },
+    /* 75 */ { SQL_API_SQLTABLES,            "SQLTables",               TRUE },
+    /* 76 */ { SQL_API_SQLTRANSACT,          "SQLTransact"                   },
+    /* 77 */ { SQL_API_SQLGETDIAGREC,        "SQLGetDiagRec",           TRUE },
+    /* 78 */ { SQL_API_SQLCANCELHANDLE,      "SQLCancelHandle"               },
 };
 
 /*
@@ -841,10 +804,18 @@ static void *odbc_dlopen( char *libname, char **err )
 
         if ( hand )
         {
+		if ( lt_dlsym( hand, "__UNIXODBC_PLUGIN_GUARD" ))
+		{
+			lt_dlclose( hand );
+			*err = "Plugin is linked back against libodbc.so";
+			mutex_lib_exit();
+			return NULL;
+		}
+
 	        /*
 	        * If only one, then use the static space
 	        */
-    
+
 	        if ( lib_list == NULL )
 	        {
 		        list = &single_lib_count;
@@ -1238,29 +1209,6 @@ int __connect_part_one( DMHDBC connection, char *driver_lib, char *driver_name,
             connection -> functions[ i ].funcA = 
                 connection -> functions[ i ].funcW = NULL;
         }
-
-        /*
-         * blank out ones that are in the DM to fix a big 
-         * with glib 2.0.6
-         */
-
-		if ( connection -> functions[ i ].func &&
-			(void*)connection -> functions[ i ].func == 
-            (void*)connection -> functions[ i ].dm_func )
-		{	
-			connection -> functions[ i ].func = NULL;
-		}
-
-		if ( connection -> functions[ i ].funcW &&
-			(void*)connection -> functions[ i ].funcW == 
-            (void*)connection -> functions[ i ].dm_funcW )
-		{	
-			connection -> functions[ i ].funcW = NULL;
-		}
-
-        connection -> functions[ i ].can_supply =
-            ( connection -> functions[ i ].func != NULL ) || 
-              ( connection -> functions[ i ].funcW != NULL );
     }
 
     /*
diff --git a/DriverManager/drivermanager.h b/DriverManager/drivermanager.h
index 8aa64f9..9ed8014 100644
--- a/DriverManager/drivermanager.h
+++ b/DriverManager/drivermanager.h
@@ -124,6 +124,16 @@
 #define STATE_D1e       2
 
 /*
+ * We wan't disallow linking moudules back against the libodbc.so.  When this
+ * symbol is found in driver (plugin) corresponding driver is back linked
+ * against libodbc.so;  and it is an mistake.  Back story:
+ *
+ * http://www.postgresql.org/message-id/[email protected]
+ */
+
+SQLINTEGER __UNIXODBC_PLUGIN_GUARD;
+
+/*
  * structure to contain the loaded lib entry points
  */
 
@@ -131,11 +141,7 @@ struct driver_func
 {
     int         ordinal;
     char        *name;
-    void        *dm_func;               /* this is to fix what seems a bug in */
-			                            /* some dlopen implemnations where dlsym */
-					                    /* will return the driver manager func */
-					                    /* not the driver one */
-    void        *dm_funcW;
+    int         dm_funcW;
     SQLRETURN   (*func)();
     SQLRETURN   (*funcW)();             /* function with a unicode W */
     SQLRETURN   (*funcA)();             /* function with a unicode A */
diff --git a/configure.in b/configure.in
index e1ce44f..24a02e4 100644
--- a/configure.in
+++ b/configure.in
@@ -498,6 +498,8 @@ AC_DEFINE([UNIXODBC_SOURCE],[],[We are building inside the unixODBC source tree]
 
 LIB_VERSION="2:0:0"
 AC_SUBST(LIB_VERSION)
+LIBINST_VERSION="3:0:0"
+AC_SUBST(LIBINST_VERSION)
 
 AC_CONFIG_HEADERS(config.h)
 AC_CONFIG_HEADERS(unixodbc_conf.h)
diff --git a/odbcinst/Makefile.am b/odbcinst/Makefile.am
index dde0ed5..fb5d9da 100644
--- a/odbcinst/Makefile.am
+++ b/odbcinst/Makefile.am
@@ -8,7 +8,7 @@ EXTRA_DIST = \
 
 libodbcinst_la_LDFLAGS = \
 	-no-undefined  \
-    -version-info @LIB_VERSION@ \
+    -version-info @LIBINST_VERSION@ \
     -export-dynamic \
     -export-symbols @srcdir@/odbcinst.exp
 
-- 
1.8.4.2


--nextPart2143267.AoGL4p4ssy
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0


-- 
Sent via pgsql-odbc mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-odbc

--nextPart2143267.AoGL4p4ssy--