Re: unixODBC again :-(

Started by Bruce Momjianover 25 years ago1 messagespatches
Jump to latest
#1Bruce Momjian
bruce@momjian.us

Here is the actual ODBC patch he is suggesting.

Bruce Momjian wrote:

Sure, send them over, but I recommend getting the most recent snapshot.
I think some of your changes did make it in, so I bet your job will be
easier.

Hello Bruce,

Sorry to bother you again, the state of the patches I sent some time ago
never seemed to be resolved, I did appear to break things, so I guess
from the lack of response you don't want to intergrate the changes into
your CVS. I can understand that considering the chaos it seemed to
produce, but I have had a couple of people who want to use the driver in
7.0.2 with unixODBC, what would you suggest. I can provide them the
patches I made against 7.0.2, would you prefer me to do that ?

--
Nick Gorham
Easysoft Ltd

--
Bruce Momjian                        |  http://candle.pha.pa.us
pgman@candle.pha.pa.us               |  (610) 853-3000
+  If your life is a hard drive,     |  830 Blythe Avenue
+  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Ok, here it is, against todays snapshot.

--
Nick Gorham
Easysoft Ltd

diff -u -r pgsql/configure.in pgsql.new/configure.in
--- pgsql/configure.in	Fri Jul 28 08:00:07 2000
+++ pgsql.new/configure.in	Tue Aug  1 15:55:17 2000
@@ -608,8 +608,65 @@
AC_MSG_RESULT(no)
fi],
[AC_MSG_RESULT(no)])
+
+dnl check if we want to use unixODBC to provide access to the odbc.ini
+dnl files
+
+use_unixODBC=no
+AC_MSG_CHECKING(setting USE_UNIXODBC)
+AC_ARG_WITH(
+    unixODBC,
+    [  --with-unixODBC[=DIR]   Use unixODBC located in DIR],
+    [
+        use_unixODBC=yes;
+        unixODBC="$withval";
+        USE_ODBC=true;
+        enable_odbc=yes;
+        AC_MSG_RESULT(enabled);
+    ],
+    [ USE_ODBC=false; use_unixODBC=no; AC_MSG_RESULT(disabled) ]
+)
+
AC_SUBST(enable_odbc)
+AC_SUBST(use_unixODBC)
+
+dnl check for unixODBC libs
+
+if test "x$use_unixODBC" = "xyes"
+then
+
+  # default to /usr/local if not specified
+  if test "x$unixODBC" = "x"
+  then
+      unixODBC="/usr/local";
+  fi
+  
+  unixODBC_libs="$unixODBC/lib"
+  unixODBC_includes="$unixODBC/include"
+
+  CPPFLAGS="$CPPFLAGS -I$unixODBC_includes"
+  AC_CHECK_HEADERS(sql.h sqlext.h odbcinst.h,
+          unixODBC_ok=yes;
+          odbc_headers="$odbc_headers $ac_hdr",
+          unixODBC_ok=no )
+  
+  if test "x$unixODBC_ok" != "xyes"
+  then
+      AC_MSG_ERROR([Unable to find the unixODBC headers in $1])
+  fi
+ 
+  save_LIBS="$LIBS"
+  LIBS="-L$unixODBC_libs $LIBS"
+  
+  AC_CHECK_LIB(odbcinst,SQLGetPrivateProfileString,
+    [AC_DEFINE(HAVE_SQLGETPRIVATEPROFILESTRING)
+    SHLIB_ODBC="$SHFLAGS_ODBC -L$unixODBC_libs -lodbcinst" ],
+    [LIBS="$save_LIBS"] )
+
+  echo "using SHLIB_ODBC=$SHLIB_ODBC"
+fi

+AC_SUBST(SHLIB_ODBC)

dnl Allow for overriding the default location of the odbcinst.ini
dnl file which is normally ${datadir} (i.e., ${prefix}/share).
diff -u -r pgsql/src/Makefile.global.in pgsql.new/src/Makefile.global.in
--- pgsql/src/Makefile.global.in	Sat Jul 22 08:00:18 2000
+++ pgsql.new/src/Makefile.global.in	Tue Aug  1 15:53:37 2000
@@ -129,6 +129,8 @@
with_perl = @with_perl@
enable_odbc = @enable_odbc@
+SHLIB_ODBC = @SHLIB_ODBC@
+
with_python = @with_python@
PYTHON = @PYTHON@
python_extmakefile = @python_extmakefile@
@@ -181,7 +183,7 @@
CFLAGS = -I$(SRCDIR)/include $(CPPFLAGS) @CFLAGS@
CFLAGS_SL= @SHARED_LIB@
LIBS= @LIBS@
-LDFLAGS= @LDFLAGS@ $(LIBS)
+LDFLAGS= @LDFLAGS@ $(LIBS) $(SHLIB_ODBC)
KRB_LIBS = @KRB_LIBS@
LDREL= -r
LDOUT= -o
diff -u -r pgsql/src/Makefile.shlib pgsql.new/src/Makefile.shlib
--- pgsql/src/Makefile.shlib	Fri Jul  7 08:00:26 2000
+++ pgsql.new/src/Makefile.shlib	Tue Aug  1 15:29:53 2000
@@ -145,7 +145,7 @@
shlib			:= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
LD			:= $(CC)
LDFLAGS_SL		:= -shared -Wl,-soname,$(shlib)
-  LDFLAGS_ODBC		:= -lm
+  LDFLAGS_ODBC		:= -lm $(SHLIB_ODBC)
CFLAGS		+= $(CFLAGS_SL)
endif
diff -u -r pgsql/src/include/config.h.in pgsql.new/src/include/config.h.in
--- pgsql/src/include/config.h.in	Fri Jul 28 08:00:20 2000
+++ pgsql.new/src/include/config.h.in	Tue Aug  1 15:13:16 2000
@@ -545,6 +545,9 @@
/* Define if C++ compiler accepts "#include <string>" */
#undef HAVE_CXX_STRING_HEADER
+/* Can we support SQLGetPrivateProfileString */
+#undef HAVE_SQLGETPRIVATEPROFILESTRING
+
/*
*------------------------------------------------------------------------
diff -u -r pgsql/src/interfaces/odbc/Makefile.global pgsql.new/src/interfaces/odbc/Makefile.global
--- pgsql/src/interfaces/odbc/Makefile.global	Mon Jun 19 08:01:26 2000
+++ pgsql.new/src/interfaces/odbc/Makefile.global	Tue Aug  1 15:46:25 2000
@@ -128,7 +128,7 @@
AROPT= cq
CFLAGS= -I$(ODBCSRCDIR)   -O2 -m486 -pipe 
CFLAGS_SL= -fpic -DPIC
-LDFLAGS=   -lcrypt -lcompat -lln -lm -lutil -lreadline -ltermcap -lncurses 
+LDFLAGS=   -lcrypt -lcompat -lln -lm -lutil -lreadline -ltermcap -lncurses $(SHLIB_ODBC)
DLSUFFIX= .so
LN_S = ln -s
diff -u -r pgsql/src/interfaces/odbc/bind.c pgsql.new/src/interfaces/odbc/bind.c
--- pgsql/src/interfaces/odbc/bind.c	Tue May 30 08:00:29 2000
+++ pgsql.new/src/interfaces/odbc/bind.c	Tue Aug  1 15:08:50 2000
@@ -36,7 +36,7 @@

/* Bind parameters on a statement handle */

-RETCODE SQL_API SQLBindParameter(
+RETCODE SQL_API PG__SQLBindParameter(
HSTMT hstmt,
UWORD ipar,
SWORD fParamType,
@@ -140,10 +140,34 @@
return SQL_SUCCESS;
}

+RETCODE SQL_API SQLBindParameter(
+        HSTMT      hstmt,
+        UWORD      ipar,
+        SWORD      fParamType,
+        SWORD      fCType,
+        SWORD      fSqlType,
+        UDWORD     cbColDef,
+        SWORD      ibScale,
+        PTR        rgbValue,
+        SDWORD     cbValueMax,
+        SDWORD FAR *pcbValue)
+{
+    return PG__SQLBindParameter( hstmt,
+            ipar,
+            fParamType,
+            fCType,
+            fSqlType,
+            cbColDef,
+            ibScale,
+            rgbValue,
+            cbValueMax,
+            pcbValue );
+}
+
/*      -       -       -       -       -       -       -       -       - */

/* Associate a user-supplied buffer with a database column. */
-RETCODE SQL_API SQLBindCol(
+RETCODE SQL_API PG__SQLBindCol(
HSTMT hstmt,
UWORD icol,
SWORD fCType,
@@ -232,6 +256,22 @@
}

return SQL_SUCCESS;
+}
+
+RETCODE SQL_API SQLBindCol(
+        HSTMT      hstmt,
+        UWORD      icol,
+        SWORD      fCType,
+        PTR        rgbValue,
+        SDWORD     cbValueMax,
+        SDWORD FAR *pcbValue)
+{
+    return PG__SQLBindCol( hstmt,
+            icol,
+            fCType,
+            rgbValue,
+            cbValueMax,
+            pcbValue );
}
/*      -       -       -       -       -       -       -       -       - */
diff -u -r pgsql/src/interfaces/odbc/connection.c pgsql.new/src/interfaces/odbc/connection.c
--- pgsql/src/interfaces/odbc/connection.c	Sat May 27 08:00:25 2000
+++ pgsql.new/src/interfaces/odbc/connection.c	Tue Aug  1 14:38:10 2000
@@ -1223,7 +1223,7 @@
has not transitioned to "connected" yet.
*/
-	result = SQLAllocStmt( self, &hstmt);
+	result = PG__SQLAllocStmt( self, &hstmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
return FALSE;
}
@@ -1232,7 +1232,7 @@
stmt->internal = TRUE;	/* ensure no BEGIN/COMMIT/ABORT stuff */
/*	Set the Datestyle to the format the driver expects it to be in */
-	result = SQLExecDirect(hstmt, "set DateStyle to 'ISO'", SQL_NTS);
+	result = PG__SQLExecDirect(hstmt, "set DateStyle to 'ISO'", SQL_NTS);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
status = FALSE;

@@ -1240,7 +1240,7 @@

/*	Disable genetic optimizer based on global flag */
if (globals.disable_optimizer) {
-		result = SQLExecDirect(hstmt, "set geqo to 'OFF'", SQL_NTS);
+		result = PG__SQLExecDirect(hstmt, "set geqo to 'OFF'", SQL_NTS);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
status = FALSE;

@@ -1250,7 +1250,7 @@

/*	KSQO */
if (globals.ksqo) {
-		result = SQLExecDirect(hstmt, "set ksqo to 'ON'", SQL_NTS);
+		result = PG__SQLExecDirect(hstmt, "set ksqo to 'ON'", SQL_NTS);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
status = FALSE;
@@ -1263,7 +1263,7 @@
cs = strdup(globals.conn_settings);
ptr = strtok(cs, ";");
while (ptr) {
-			result = SQLExecDirect(hstmt, ptr, SQL_NTS);
+			result = PG__SQLExecDirect(hstmt, ptr, SQL_NTS);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
status = FALSE;
@@ -1280,7 +1280,7 @@
cs = strdup(ci->conn_settings);
ptr = strtok(cs, ";");
while (ptr) {
-			result = SQLExecDirect(hstmt, ptr, SQL_NTS);
+			result = PG__SQLExecDirect(hstmt, ptr, SQL_NTS);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
status = FALSE;

@@ -1293,7 +1293,7 @@
}

-	SQLFreeStmt(hstmt, SQL_DROP);
+	PG__SQLFreeStmt(hstmt, SQL_DROP);
return status;
}
@@ -1315,34 +1315,34 @@
/*	This function must use the local odbc API functions since the odbc state 
has not transitioned to "connected" yet.
*/
-	result = SQLAllocStmt( self, &hstmt);
+	result = PG__SQLAllocStmt( self, &hstmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
return;
}
stmt = (StatementClass *) hstmt;
-	result = SQLExecDirect(hstmt, "select oid from pg_type where typname='" PG_TYPE_LO_NAME "'", SQL_NTS);
+	result = PG__SQLExecDirect(hstmt, "select oid from pg_type where typname='" PG_TYPE_LO_NAME "'", SQL_NTS);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
-		SQLFreeStmt(hstmt, SQL_DROP);
+		PG__SQLFreeStmt(hstmt, SQL_DROP);
return;
}
-	result = SQLFetch(hstmt);
+	result = PG__SQLFetch(hstmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
-		SQLFreeStmt(hstmt, SQL_DROP);
+		PG__SQLFreeStmt(hstmt, SQL_DROP);
return;
}
-	result = SQLGetData(hstmt, 1, SQL_C_SLONG, &self->lobj_type, sizeof(self->lobj_type), NULL);
+	result = PG__SQLGetData(hstmt, 1, SQL_C_SLONG, &self->lobj_type, sizeof(self->lobj_type), NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
-		SQLFreeStmt(hstmt, SQL_DROP);
+		PG__SQLFreeStmt(hstmt, SQL_DROP);
return;
}

mylog("Got the large object oid: %d\n", self->lobj_type);
qlog(" [ Large Object oid = %d ]\n", self->lobj_type);

-	result = SQLFreeStmt(hstmt, SQL_DROP);
+	result = PG__SQLFreeStmt(hstmt, SQL_DROP);
}
void
diff -u -r pgsql/src/interfaces/odbc/dlg_specific.c pgsql.new/src/interfaces/odbc/dlg_specific.c
--- pgsql/src/interfaces/odbc/dlg_specific.c	Tue Jun 20 08:00:21 2000
+++ pgsql.new/src/interfaces/odbc/dlg_specific.c	Tue Aug  1 14:44:04 2000
@@ -23,8 +23,10 @@
#ifndef WIN32
# include <string.h>
# include "gpps.h"
+#ifndef HAVE_SQLGETPRIVATEPROFILESTRING
# define SQLGetPrivateProfileString(a,b,c,d,e,f) GetPrivateProfileString(a,b,c,d,e,f)
# define SQLWritePrivateProfileString(a,b,c,d) WritePrivateProfileString(a,b,c,d)
+#endif
# ifndef HAVE_STRICMP
#  define stricmp(s1,s2)      strcasecmp(s1,s2)
#  define strnicmp(s1,s2,n)   strncasecmp(s1,s2,n)
diff -u -r pgsql/src/interfaces/odbc/execute.c pgsql.new/src/interfaces/odbc/execute.c
--- pgsql/src/interfaces/odbc/execute.c	Sat May 27 08:00:25 2000
+++ pgsql.new/src/interfaces/odbc/execute.c	Tue Aug  1 15:58:38 2000
@@ -125,7 +125,7 @@

/* Performs the equivalent of SQLPrepare, followed by SQLExecute. */

-RETCODE SQL_API SQLExecDirect(
+RETCODE SQL_API PG__SQLExecDirect(
HSTMT     hstmt,
UCHAR FAR *szSqlStr,
SDWORD    cbSqlStr)
@@ -176,14 +176,14 @@

mylog("%s: calling SQLExecute...\n", func);

-	result = SQLExecute(hstmt);
+	result = PG__SQLExecute(hstmt);

mylog("%s: returned %hd from SQLExecute\n", func, result);
return result;
}

/* Execute a prepared SQL statement */
-RETCODE SQL_API SQLExecute(
+RETCODE SQL_API PG__SQLExecute(
HSTMT hstmt)
{
static char *func="SQLExecute";
@@ -293,11 +293,23 @@

}

-
-
+RETCODE SQL_API SQLExecDirect(
+        HSTMT     hstmt,
+        UCHAR FAR *szSqlStr,
+        SDWORD    cbSqlStr )
+{
+    return PG__SQLExecDirect( hstmt, szSqlStr, cbSqlStr );
+}
+ 
+RETCODE SQL_API SQLExecute(
+        HSTMT     hstmt )
+{
+    return PG__SQLExecute( hstmt );
+}
+ 

/* - - - - - - - - - */
-RETCODE SQL_API SQLTransact(
+RETCODE SQL_API PG__SQLTransact(
HENV henv,
HDBC hdbc,
UWORD fType)
@@ -324,7 +336,7 @@
conn = conns[lf];

if (conn && conn->henv == henv)
-				if ( SQLTransact(henv, (HDBC) conn, fType) != SQL_SUCCESS)
+				if ( PG__SQLTransact(henv, (HDBC) conn, fType) != SQL_SUCCESS)
return SQL_ERROR;

}
@@ -371,6 +383,14 @@
return SQL_SUCCESS;
}

+RETCODE SQL_API SQLTransact(
+        HENV    henv,
+        HDBC    hdbc,
+        UWORD   fType)
+{
+    return PG__SQLTransact( henv, hdbc, fType );
+}
+
/*      -       -       -       -       -       -       -       -       - */
RETCODE SQL_API SQLCancel(
@@ -411,10 +431,10 @@
result = addr( (char *) (stmt->phstmt) - 96, SQL_CLOSE);
}
else {
-			result = SQLFreeStmt( hstmt, SQL_CLOSE);
+			result = PG__SQLFreeStmt( hstmt, SQL_CLOSE);
}
#else
-		result = SQLFreeStmt( hstmt, SQL_CLOSE);
+		result = PG__SQLFreeStmt( hstmt, SQL_CLOSE);
#endif
mylog("SQLCancel:  SQLFreeStmt returned %d\n", result);
diff -u -r pgsql/src/interfaces/odbc/info.c pgsql.new/src/interfaces/odbc/info.c
--- pgsql/src/interfaces/odbc/info.c	Sat May 27 08:00:26 2000
+++ pgsql.new/src/interfaces/odbc/info.c	Tue Aug  1 14:49:54 2000
@@ -926,7 +926,7 @@

ci = &stmt->hdbc->connInfo;

-	result = SQLAllocStmt( stmt->hdbc, &htbl_stmt);
+	result = PG__SQLAllocStmt( stmt->hdbc, &htbl_stmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't allocate statement for SQLTables result.";
@@ -1014,41 +1014,41 @@

/* ********************************************************************** */

-	result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
+	result = PG__SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR,
+    result = PG__SQLBindCol(htbl_stmt, 1, SQL_C_CHAR,
table_name, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(htbl_stmt, 2, SQL_C_CHAR,
+    result = PG__SQLBindCol(htbl_stmt, 2, SQL_C_CHAR,
table_owner, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(htbl_stmt, 3, SQL_C_CHAR,
+    result = PG__SQLBindCol(htbl_stmt, 3, SQL_C_CHAR,
relhasrules, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -1057,7 +1057,7 @@
stmt->errormsg = "Couldn't allocate memory for SQLTables result.";
stmt->errornumber = STMT_NO_MEMORY_ERROR;
SC_log_error(func, "", stmt);
- SQLFreeStmt(htbl_stmt, SQL_DROP);
+ PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -1074,7 +1074,7 @@
QR_set_field_info(stmt->result, 4, "REMARKS", PG_TYPE_TEXT, 254);

/* add the tuples */
-	result = SQLFetch(htbl_stmt);
+	result = PG__SQLFetch(htbl_stmt);
while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) {

/* Determine if this table name is a system table.
@@ -1133,13 +1133,13 @@

QR_add_tuple(stmt->result, row);
}
- result = SQLFetch(htbl_stmt);
+ result = PG__SQLFetch(htbl_stmt);
}
if(result != SQL_NO_DATA_FOUND) {
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
- SQLFreeStmt(htbl_stmt, SQL_DROP);
+ PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -1152,7 +1152,7 @@
stmt->rowset_start = -1;
stmt->current_col = -1;

-	SQLFreeStmt(htbl_stmt, SQL_DROP);
+	PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
mylog("SQLTables(): EXIT,  stmt=%u\n", stmt);
return SQL_SUCCESS;
}
@@ -1160,7 +1160,7 @@

-RETCODE SQL_API SQLColumns(
+RETCODE SQL_API PG__SQLColumns(
HSTMT hstmt,
UCHAR FAR * szTableQualifier,
SWORD cbTableQualifier,
@@ -1217,7 +1217,7 @@
strcat(columns_query, " order by attnum");
/* ********************************************************************** */

-    result = SQLAllocStmt( stmt->hdbc, &hcol_stmt);
+    result = PG__SQLAllocStmt( stmt->hdbc, &hcol_stmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't allocate statement for SQLColumns result.";
@@ -1228,113 +1228,113 @@

mylog("SQLColumns: hcol_stmt = %u, col_stmt = %u\n", hcol_stmt, col_stmt);

-    result = SQLExecDirect(hcol_stmt, columns_query,
+    result = PG__SQLExecDirect(hcol_stmt, columns_query,
strlen(columns_query));
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = SC_create_errormsg(hcol_stmt);
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 1, SQL_C_CHAR,
+    result = PG__SQLBindCol(hcol_stmt, 1, SQL_C_CHAR,
table_owner, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 2, SQL_C_CHAR,
+    result = PG__SQLBindCol(hcol_stmt, 2, SQL_C_CHAR,
table_name, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 3, SQL_C_CHAR,
+    result = PG__SQLBindCol(hcol_stmt, 3, SQL_C_CHAR,
field_name, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 4, SQL_C_LONG,
+    result = PG__SQLBindCol(hcol_stmt, 4, SQL_C_LONG,
&field_type, 4, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 5, SQL_C_CHAR,
+    result = PG__SQLBindCol(hcol_stmt, 5, SQL_C_CHAR,
field_type_name, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 6, SQL_C_SHORT,
+    result = PG__SQLBindCol(hcol_stmt, 6, SQL_C_SHORT,
&field_number, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 7, SQL_C_LONG,
+    result = PG__SQLBindCol(hcol_stmt, 7, SQL_C_LONG,
&field_length, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 8, SQL_C_LONG,
+    result = PG__SQLBindCol(hcol_stmt, 8, SQL_C_LONG,
&mod_length, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 9, SQL_C_CHAR,
+    result = PG__SQLBindCol(hcol_stmt, 9, SQL_C_CHAR,
not_null, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 10, SQL_C_CHAR,
+    result = PG__SQLBindCol(hcol_stmt, 10, SQL_C_CHAR,
relhasrules, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -1343,7 +1343,7 @@
stmt->errormsg = "Couldn't allocate memory for SQLColumns result.";
stmt->errornumber = STMT_NO_MEMORY_ERROR;
SC_log_error(func, "", stmt);
- SQLFreeStmt(hcol_stmt, SQL_DROP);
+ PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -1372,7 +1372,7 @@
QR_set_field_info(stmt->result, 13, "FIELD_TYPE", PG_TYPE_INT4, 4);

-	result = SQLFetch(hcol_stmt);
+	result = PG__SQLFetch(hcol_stmt);

/* Only show oid if option AND there are other columns AND
@@ -1503,14 +1503,14 @@
QR_add_tuple(stmt->result, row);

-        result = SQLFetch(hcol_stmt);
+        result = PG__SQLFetch(hcol_stmt);

}
if(result != SQL_NO_DATA_FOUND) {
stmt->errormsg = SC_create_errormsg(hcol_stmt);
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
- SQLFreeStmt(hcol_stmt, SQL_DROP);
+ PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -1550,11 +1550,33 @@
stmt->rowset_start = -1;
stmt->current_col = -1;

- SQLFreeStmt(hcol_stmt, SQL_DROP);
+ PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
mylog("SQLColumns(): EXIT, stmt=%u\n", stmt);
return SQL_SUCCESS;
}

+RETCODE SQL_API SQLColumns(
+                           HSTMT        hstmt,
+                           UCHAR FAR *  szTableQualifier,
+                           SWORD        cbTableQualifier,
+                           UCHAR FAR *  szTableOwner,
+                           SWORD        cbTableOwner,
+                           UCHAR FAR *  szTableName,
+                           SWORD        cbTableName,
+                           UCHAR FAR *  szColumnName,
+                           SWORD        cbColumnName)
+{
+    return PG__SQLColumns( hstmt,
+            szTableQualifier,
+            cbTableQualifier,
+            szTableOwner,
+            cbTableOwner,
+            szTableName,
+            cbTableName,
+            szColumnName,
+            cbColumnName );
+}
+
RETCODE SQL_API SQLSpecialColumns(
HSTMT        hstmt,
UWORD        fColType,
@@ -1601,7 +1623,7 @@
my_strcat(columns_query, " and u.usename like '%.*s'", szTableOwner, cbTableOwner);
-    result = SQLAllocStmt( stmt->hdbc, &hcol_stmt);
+    result = PG__SQLAllocStmt( stmt->hdbc, &hcol_stmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't allocate statement for SQLSpecialColumns result.";
@@ -1612,28 +1634,28 @@

mylog("SQLSpecialColumns: hcol_stmt = %u, col_stmt = %u\n", hcol_stmt, col_stmt);

-    result = SQLExecDirect(hcol_stmt, columns_query,
+    result = PG__SQLExecDirect(hcol_stmt, columns_query,
strlen(columns_query));
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = SC_create_errormsg(hcol_stmt);
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(hcol_stmt, 1, SQL_C_CHAR,
+    result = PG__SQLBindCol(hcol_stmt, 1, SQL_C_CHAR,
relhasrules, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = col_stmt->errormsg;
stmt->errornumber = col_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(hcol_stmt, SQL_DROP);
+		PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
return SQL_ERROR;
}
-	result = SQLFetch(hcol_stmt);
-	SQLFreeStmt(hcol_stmt, SQL_DROP);
+	result = PG__SQLFetch(hcol_stmt);
+	PG__SQLFreeStmt(hcol_stmt, SQL_DROP);

stmt->result = QR_Constructor();
extend_bindings(stmt, 8);
@@ -1815,7 +1837,7 @@

}

-	result = SQLFetch(hcol_stmt);
+	result = PG__SQLFetch(hcol_stmt);
while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) {
total_columns++;

@@ -1828,7 +1850,7 @@

mylog("SQLStatistics: column_name = '%s'\n", column_name);

-		result = SQLFetch(hcol_stmt);
+		result = PG__SQLFetch(hcol_stmt);
}
if(result != SQL_NO_DATA_FOUND || total_columns == 0) {
stmt->errormsg = SC_create_errormsg(hcol_stmt); /* "Couldn't get column names in SQLStatistics."; */
@@ -1838,10 +1860,10 @@

}

-	SQLFreeStmt(hcol_stmt, SQL_DROP);
+	PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
/* get a list of indexes on this table */
-    result = SQLAllocStmt( stmt->hdbc, &hindx_stmt);
+    result = PG__SQLAllocStmt( stmt->hdbc, &hindx_stmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = "SQLAllocStmt failed in SQLStatistics for indices.";
stmt->errornumber = STMT_NO_MEMORY_ERROR;
@@ -1856,7 +1878,7 @@
" where c.oid = i.indexrelid and d.relname = '%s'"
" and d.oid = i.indrelid", table_name);
-    result = SQLExecDirect(hindx_stmt, index_query, strlen(index_query));
+    result = PG__SQLExecDirect(hindx_stmt, index_query, strlen(index_query));
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = SC_create_errormsg(hindx_stmt); /* "Couldn't execute index query (w/SQLExecDirect) in SQLStatistics."; */
stmt->errornumber = indx_stmt->errornumber;
@@ -1866,7 +1888,7 @@
}
/* bind the index name column */
-    result = SQLBindCol(hindx_stmt, 1, SQL_C_CHAR,
+    result = PG__SQLBindCol(hindx_stmt, 1, SQL_C_CHAR,
index_name, MAX_INFO_STRING, &index_name_len);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column in SQLStatistics."; */
@@ -1876,7 +1898,7 @@
}
/* bind the vector column */
-    result = SQLBindCol(hindx_stmt, 2, SQL_C_DEFAULT,
+    result = PG__SQLBindCol(hindx_stmt, 2, SQL_C_DEFAULT,
fields_vector, 16, &fields_vector_len);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = indx_stmt->errormsg;  /* "Couldn't bind column in SQLStatistics."; */
@@ -1886,7 +1908,7 @@
}
/* bind the "is unique" column */
-    result = SQLBindCol(hindx_stmt, 3, SQL_C_CHAR,
+    result = PG__SQLBindCol(hindx_stmt, 3, SQL_C_CHAR,
isunique, sizeof(isunique), NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = indx_stmt->errormsg;  /* "Couldn't bind column in SQLStatistics."; */
@@ -1896,7 +1918,7 @@
}
/* bind the "is clustered" column */
-    result = SQLBindCol(hindx_stmt, 4, SQL_C_CHAR,
+    result = PG__SQLBindCol(hindx_stmt, 4, SQL_C_CHAR,
isclustered, sizeof(isclustered), NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = indx_stmt->errormsg;  /* "Couldn't bind column in SQLStatistics."; */
@@ -1906,7 +1928,7 @@

}

-    result = SQLBindCol(hindx_stmt, 5, SQL_C_CHAR,
+    result = PG__SQLBindCol(hindx_stmt, 5, SQL_C_CHAR,
relhasrules, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = indx_stmt->errormsg;
@@ -1948,7 +1970,7 @@
QR_add_tuple(stmt->result, row);
}
-    result = SQLFetch(hindx_stmt);
+    result = PG__SQLFetch(hindx_stmt);
while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) {

/* If only requesting unique indexs, then just return those. */
@@ -2004,7 +2026,7 @@
}
}

-        result = SQLFetch(hindx_stmt);
+        result = PG__SQLFetch(hindx_stmt);
}
if(result != SQL_NO_DATA_FOUND) {
stmt->errormsg = SC_create_errormsg(hindx_stmt); /* "SQLFetch failed in SQLStatistics."; */
@@ -2013,7 +2035,7 @@
goto SEEYA;
}
-	SQLFreeStmt(hindx_stmt, SQL_DROP);
+	PG__SQLFreeStmt(hindx_stmt, SQL_DROP);

/* also, things need to think that this statement is finished so */
/* the results can be retrieved. */
@@ -2069,7 +2091,7 @@
/* SQLPrimaryKeys()
* Retrieve the primary key columns for the specified table.
*/
-RETCODE SQL_API SQLPrimaryKeys(
+RETCODE SQL_API PG__SQLPrimaryKeys(
HSTMT hstmt,
UCHAR FAR * szTableQualifier,
SWORD cbTableQualifier,
@@ -2123,7 +2145,7 @@
QR_set_field_info(stmt->result, 5, "PK_NAME", PG_TYPE_TEXT, MAX_INFO_STRING);

-    result = SQLAllocStmt( stmt->hdbc, &htbl_stmt);
+    result = PG__SQLAllocStmt( stmt->hdbc, &htbl_stmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't allocate statement for Primary Key result.";
@@ -2138,7 +2160,7 @@
stmt->errormsg = "No Table specified to SQLPrimaryKeys.";
stmt->errornumber = STMT_INTERNAL_ERROR;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -2162,26 +2184,26 @@

mylog("SQLPrimaryKeys: tables_query='%s'\n", tables_query);

-    result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
+    result = PG__SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR,
+    result = PG__SQLBindCol(htbl_stmt, 1, SQL_C_CHAR,
attname, MAX_INFO_STRING, &attname_len);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-    result = SQLFetch(htbl_stmt);
+    result = PG__SQLFetch(htbl_stmt);

while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) {

@@ -2204,18 +2226,18 @@

mylog(">> primaryKeys: pktab = '%s', attname = '%s', seq = %d\n", pktab, attname, seq);

-        result = SQLFetch(htbl_stmt);
+        result = PG__SQLFetch(htbl_stmt);
}

if(result != SQL_NO_DATA_FOUND) {
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
- SQLFreeStmt(htbl_stmt, SQL_DROP);
+ PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}

-	SQLFreeStmt(htbl_stmt, SQL_DROP);
+	PG__SQLFreeStmt(htbl_stmt, SQL_DROP);

/* also, things need to think that this statement is finished so */
@@ -2231,7 +2253,25 @@
return SQL_SUCCESS;
}

-RETCODE SQL_API SQLForeignKeys(
+RETCODE SQL_API SQLPrimaryKeys(
+                               HSTMT         hstmt,
+                               UCHAR FAR *   szTableQualifier,
+                               SWORD         cbTableQualifier,
+                               UCHAR FAR *   szTableOwner,
+                               SWORD         cbTableOwner,
+                               UCHAR FAR *   szTableName,
+                               SWORD         cbTableName)
+{
+    return PG__SQLPrimaryKeys( hstmt,
+            szTableQualifier,
+            cbTableQualifier,
+            szTableOwner,
+            cbTableOwner,
+            szTableName,
+            cbTableName );
+}
+
+RETCODE SQL_API PG__SQLForeignKeys(
HSTMT         hstmt,
UCHAR FAR *   szPkTableQualifier,
SWORD         cbPkTableQualifier,
@@ -2277,7 +2317,7 @@
stmt->errormsg = "Couldn't allocate memory for SQLForeignKeys result.";
stmt->errornumber = STMT_NO_MEMORY_ERROR;
SC_log_error(func, "", stmt);
-		SQLFreeStmt(htbl_stmt, SQL_DROP);
+		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -2313,7 +2353,7 @@
stmt->current_col = -1;

-    result = SQLAllocStmt( stmt->hdbc, &htbl_stmt);
+    result = PG__SQLAllocStmt( stmt->hdbc, &htbl_stmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't allocate statement for SQLForeignKeys result.";
@@ -2341,46 +2381,46 @@
" AND pg_proc.proname = 'check_primary_key' AND pg_class.relname = '%s'",
fktab);
-		result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
+		result = PG__SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-    		SQLFreeStmt(htbl_stmt, SQL_DROP);
+    		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLBindCol(htbl_stmt, 1, SQL_C_BINARY,
+		result = PG__SQLBindCol(htbl_stmt, 1, SQL_C_BINARY,
args, MAX_INFO_STRING, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLBindCol(htbl_stmt, 2, SQL_C_SHORT,
+		result = PG__SQLBindCol(htbl_stmt, 2, SQL_C_SHORT,
&nargs, 0, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLBindCol(htbl_stmt, 3, SQL_C_CHAR,
+		result = PG__SQLBindCol(htbl_stmt, 3, SQL_C_CHAR,
tgname, sizeof(tgname), NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLFetch(htbl_stmt);
+		result = PG__SQLFetch(htbl_stmt);
if (result == SQL_NO_DATA_FOUND)
return SQL_SUCCESS;
@@ -2388,11 +2428,11 @@
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		keyresult = SQLAllocStmt( stmt->hdbc, &hpkey_stmt);
+		keyresult = PG__SQLAllocStmt( stmt->hdbc, &hpkey_stmt);
if((keyresult != SQL_SUCCESS) && (keyresult != SQL_SUCCESS_WITH_INFO)) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't allocate statement for SQLForeignKeys (pkeys) result.";
@@ -2400,13 +2440,13 @@
return SQL_ERROR;
}
-		keyresult = SQLBindCol(hpkey_stmt, 4, SQL_C_CHAR,
+		keyresult = PG__SQLBindCol(hpkey_stmt, 4, SQL_C_CHAR,
pkey, sizeof(pkey), NULL);
if (keyresult != SQL_SUCCESS) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't bindcol for primary keys for SQLForeignKeys result.";
SC_log_error(func, "", stmt);
-			SQLFreeStmt(hpkey_stmt, SQL_DROP);
+			PG__SQLFreeStmt(hpkey_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -2432,23 +2472,23 @@

/* If it doesn't match, then continue */
if ( strcmp(prel, pktab)) {
- result = SQLFetch(htbl_stmt);
+ result = PG__SQLFetch(htbl_stmt);
continue;
}
}

-			keyresult = SQLPrimaryKeys(hpkey_stmt, NULL, 0, NULL, 0, prel, SQL_NTS);
+			keyresult = PG__SQLPrimaryKeys(hpkey_stmt, NULL, 0, NULL, 0, prel, SQL_NTS);
if (keyresult != SQL_SUCCESS) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't get primary keys for SQLForeignKeys result.";
SC_log_error(func, "", stmt);
-				SQLFreeStmt(hpkey_stmt, SQL_DROP);
+				PG__SQLFreeStmt(hpkey_stmt, SQL_DROP);
return SQL_ERROR;
}
/*	Check that the key listed is the primary key */
-			keyresult = SQLFetch(hpkey_stmt);
+			keyresult = PG__SQLFetch(hpkey_stmt);
for (k = 0; k < pkeys; k++) {
ptr += strlen(ptr) + 1;
@@ -2456,7 +2496,7 @@
pkeys = 0;
break;
}
-				keyresult = SQLFetch(hpkey_stmt);
+				keyresult = PG__SQLFetch(hpkey_stmt);
}
ptr = prel;

@@ -2504,7 +2544,7 @@

}

-			result = SQLFetch(htbl_stmt);
+			result = PG__SQLFetch(htbl_stmt);
}
}

@@ -2520,56 +2560,56 @@
" AND pg_proc.proname = 'check_foreign_key' AND pg_class.relname = '%s'",
pktab);

-		result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
+		result = PG__SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-    		SQLFreeStmt(htbl_stmt, SQL_DROP);
+    		PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLBindCol(htbl_stmt, 1, SQL_C_BINARY,
+		result = PG__SQLBindCol(htbl_stmt, 1, SQL_C_BINARY,
args, sizeof(args), NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLBindCol(htbl_stmt, 2, SQL_C_SHORT,
+		result = PG__SQLBindCol(htbl_stmt, 2, SQL_C_SHORT,
&nargs, 0, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLBindCol(htbl_stmt, 3, SQL_C_SHORT,
+		result = PG__SQLBindCol(htbl_stmt, 3, SQL_C_SHORT,
&rule_type, 0, NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLBindCol(htbl_stmt, 4, SQL_C_CHAR,
+		result = PG__SQLBindCol(htbl_stmt, 4, SQL_C_CHAR,
tgname, sizeof(tgname), NULL);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = tbl_stmt->errormsg;
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		result = SQLFetch(htbl_stmt);
+		result = PG__SQLFetch(htbl_stmt);
if (result == SQL_NO_DATA_FOUND)
return SQL_SUCCESS;
@@ -2577,11 +2617,11 @@
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
-			SQLFreeStmt(htbl_stmt, SQL_DROP);
+			PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
-		keyresult = SQLAllocStmt( stmt->hdbc, &hpkey_stmt);
+		keyresult = PG__SQLAllocStmt( stmt->hdbc, &hpkey_stmt);
if((keyresult != SQL_SUCCESS) && (keyresult != SQL_SUCCESS_WITH_INFO)) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't allocate statement for SQLForeignKeys (pkeys) result.";
@@ -2589,22 +2629,22 @@
return SQL_ERROR;
}
-		keyresult = SQLPrimaryKeys(hpkey_stmt, NULL, 0, NULL, 0, pktab, SQL_NTS);
+		keyresult = PG__SQLPrimaryKeys(hpkey_stmt, NULL, 0, NULL, 0, pktab, SQL_NTS);
if (keyresult != SQL_SUCCESS) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't get primary keys for SQLForeignKeys result.";
SC_log_error(func, "", stmt);
-			SQLFreeStmt(hpkey_stmt, SQL_DROP);
+			PG__SQLFreeStmt(hpkey_stmt, SQL_DROP);
return SQL_ERROR;
}
-		keyresult = SQLBindCol(hpkey_stmt, 4, SQL_C_CHAR,
+		keyresult = PG__SQLBindCol(hpkey_stmt, 4, SQL_C_CHAR,
pkey, sizeof(pkey), NULL);
if (keyresult != SQL_SUCCESS) {
stmt->errornumber = STMT_NO_MEMORY_ERROR;
stmt->errormsg = "Couldn't bindcol for primary keys for SQLForeignKeys result.";
SC_log_error(func, "", stmt);
-			SQLFreeStmt(hpkey_stmt, SQL_DROP);
+			PG__SQLFreeStmt(hpkey_stmt, SQL_DROP);
return SQL_ERROR;
}

@@ -2639,7 +2679,7 @@
pkey_ptr = ptr;

-			keyresult = SQLExtendedFetch(hpkey_stmt, SQL_FETCH_FIRST, -1, NULL, NULL);
+			keyresult = PG__SQLExtendedFetch(hpkey_stmt, SQL_FETCH_FIRST, -1, NULL, NULL);
if ( keyresult != SQL_SUCCESS || strcmp(pkey, ptr)) {
ntabs = 0;
}
@@ -2654,7 +2694,7 @@
}
ptr += strlen(ptr) + 1;
-				keyresult = SQLExtendedFetch(hpkey_stmt, SQL_FETCH_NEXT, -1, NULL, NULL);
+				keyresult = PG__SQLExtendedFetch(hpkey_stmt, SQL_FETCH_NEXT, -1, NULL, NULL);
}

mylog("Foreign Key Case#1: nargs = %d, ntabs = %d, pkeys = %d\n", nargs, ntabs, pkeys);
@@ -2712,24 +2752,53 @@

}

- result = SQLFetch(htbl_stmt);
+ result = PG__SQLFetch(htbl_stmt);
}
}
else {
stmt->errormsg = "No tables specified to SQLForeignKeys.";
stmt->errornumber = STMT_INTERNAL_ERROR;
SC_log_error(func, "", stmt);
- SQLFreeStmt(htbl_stmt, SQL_DROP);
+ PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}

-	SQLFreeStmt(htbl_stmt, SQL_DROP);
-	SQLFreeStmt(hpkey_stmt, SQL_DROP);
+	PG__SQLFreeStmt(htbl_stmt, SQL_DROP);
+	PG__SQLFreeStmt(hpkey_stmt, SQL_DROP);

mylog("SQLForeignKeys(): EXIT, stmt=%u\n", stmt);
return SQL_SUCCESS;
}

+RETCODE SQL_API SQLForeignKeys(
+                               HSTMT         hstmt,
+                               UCHAR FAR *   szPkTableQualifier,
+                               SWORD         cbPkTableQualifier,
+                               UCHAR FAR *   szPkTableOwner,
+                               SWORD         cbPkTableOwner,
+                               UCHAR FAR *   szPkTableName,
+                               SWORD         cbPkTableName,
+                               UCHAR FAR *   szFkTableQualifier,
+                               SWORD         cbFkTableQualifier,
+                               UCHAR FAR *   szFkTableOwner,
+                               SWORD         cbFkTableOwner,
+                               UCHAR FAR *   szFkTableName,
+                               SWORD         cbFkTableName)
+{
+    return PG__SQLForeignKeys( hstmt,
+            szPkTableQualifier,
+            cbPkTableQualifier,
+            szPkTableOwner,
+            cbPkTableOwner,
+            szPkTableName,
+            cbPkTableName,
+            szFkTableQualifier,
+            cbFkTableQualifier,
+            szFkTableOwner,
+            cbFkTableOwner,
+            szFkTableName,
+            cbFkTableName );
+}
RETCODE SQL_API SQLProcedureColumns(
diff -u -r pgsql/src/interfaces/odbc/misc.h pgsql.new/src/interfaces/odbc/misc.h
--- pgsql/src/interfaces/odbc/misc.h	Tue Jun 20 08:00:21 2000
+++ pgsql.new/src/interfaces/odbc/misc.h	Tue Aug  1 14:54:32 2000
@@ -16,8 +16,10 @@

#ifndef WIN32
#include "gpps.h"
+#ifndef HAVE_SQLGETPRIVATEPROFILESTRING
#define SQLGetPrivateProfileString(a,b,c,d,e,f) GetPrivateProfileString(a,b,c,d,e,f)
#endif
+#endif

#include <stdio.h>

@@ -101,4 +103,114 @@

int my_strcpy(char *dst, int dst_len, char *src, int src_len);

+
+/*
+ * prototypes for the internal versions of ODBC functions. 
+ * We need to do this because when used under a unix driver manager the DM exports
+ * the same function entry points, so the application calls SQLExecDirect in the DM
+ * the DM calls SQLExecDirect in the driver, which then calls SQLPrepare, this 
+ * however calls SQLPrepare in the DM not the driver. Prefixing all the calls used
+ * internally by PG__ fixes this problem. Both unixODBC and iODBC will show this
+ * problem
+ */
+
+#ifndef WIN32
+#include "iodbc.h"
+#include "isqlext.h"
+#else
+#include <windows.h>
+#include <sqlext.h>
+#endif
+
+RETCODE SQL_API PG__SQLExecDirect(
+        HSTMT     hstmt,
+        UCHAR FAR *szSqlStr,
+        SDWORD    cbSqlStr);
+
+RETCODE SQL_API PG__SQLAllocStmt(HDBC      hdbc,
+	    HSTMT FAR *phstmt);
+
+RETCODE SQL_API PG__SQLExecute(
+        HSTMT   hstmt);
+
+RETCODE SQL_API PG__SQLTransact(
+        HENV    henv,
+        HDBC    hdbc,
+        UWORD   fType);
+
+RETCODE SQL_API PG__SQLFreeStmt(HSTMT     hstmt,
+	    UWORD     fOption);
+
+RETCODE SQL_API PG__SQLBindParameter(
+        HSTMT      hstmt,
+        UWORD      ipar,
+        SWORD      fParamType,
+        SWORD      fCType,
+        SWORD      fSqlType,
+        UDWORD     cbColDef,
+        SWORD      ibScale,
+        PTR        rgbValue,
+        SDWORD     cbValueMax,
+        SDWORD FAR *pcbValue);
+
+RETCODE SQL_API PG__SQLBindCol(
+        HSTMT      hstmt,
+        UWORD      icol,
+        SWORD      fCType,
+        PTR        rgbValue,
+        SDWORD     cbValueMax,
+        SDWORD FAR *pcbValue);
+
+RETCODE SQL_API PG__SQLColumns(
+        HSTMT        hstmt,
+        UCHAR FAR *  szTableQualifier,
+        SWORD        cbTableQualifier,
+        UCHAR FAR *  szTableOwner,
+        SWORD        cbTableOwner,
+        UCHAR FAR *  szTableName,
+        SWORD        cbTableName,
+        UCHAR FAR *  szColumnName,
+        SWORD        cbColumnName);
+
+RETCODE SQL_API PG__SQLFetch(
+        HSTMT   hstmt);
+
+RETCODE SQL_API PG__SQLGetData(
+        HSTMT      hstmt,
+        UWORD      icol,
+        SWORD      fCType,
+        PTR        rgbValue,
+        SDWORD     cbValueMax,
+        SDWORD FAR *pcbValue);
+
+RETCODE SQL_API PG__SQLPrimaryKeys(
+        HSTMT         hstmt,
+        UCHAR FAR *   szTableQualifier,
+        SWORD         cbTableQualifier,
+        UCHAR FAR *   szTableOwner,
+        SWORD         cbTableOwner,
+        UCHAR FAR *   szTableName,
+        SWORD         cbTableName);
+
+RETCODE SQL_API PG__SQLForeignKeys(
+        HSTMT         hstmt,
+        UCHAR FAR *   szPkTableQualifier,
+        SWORD         cbPkTableQualifier,
+        UCHAR FAR *   szPkTableOwner,
+        SWORD         cbPkTableOwner,
+        UCHAR FAR *   szPkTableName,
+        SWORD         cbPkTableName,
+        UCHAR FAR *   szFkTableQualifier,
+        SWORD         cbFkTableQualifier,
+        UCHAR FAR *   szFkTableOwner,
+        SWORD         cbFkTableOwner,
+        UCHAR FAR *   szFkTableName,
+        SWORD         cbFkTableName);
+
+RETCODE SQL_API PG__SQLExtendedFetch(
+        HSTMT      hstmt,
+        UWORD      fFetchType,
+        SDWORD     irow,
+        UDWORD FAR *pcrow,
+        UWORD  FAR *rgfRowStatus);
#endif
diff -u -r pgsql/src/interfaces/odbc/parse.c pgsql.new/src/interfaces/odbc/parse.c
--- pgsql/src/interfaces/odbc/parse.c	Sat May 27 08:00:26 2000
+++ pgsql.new/src/interfaces/odbc/parse.c	Tue Aug  1 14:38:10 2000
@@ -576,7 +576,7 @@

mylog("PARSE: Getting SQLColumns for table[%d]='%s'\n", i, ti[i]->name);

-			result = SQLAllocStmt( stmt->hdbc, &hcol_stmt);
+			result = PG__SQLAllocStmt( stmt->hdbc, &hcol_stmt);
if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
stmt->errormsg = "SQLAllocStmt failed in parse_statement for columns.";
stmt->errornumber = STMT_NO_MEMORY_ERROR;
@@ -587,7 +587,7 @@
col_stmt = (StatementClass *) hcol_stmt;
col_stmt->internal = TRUE;
-			result = SQLColumns(hcol_stmt, "", 0, "", 0, 
+			result = PG__SQLColumns(hcol_stmt, "", 0, "", 0, 
ti[i]->name, (SWORD) strlen(ti[i]->name), "", 0);

mylog(" Past SQLColumns\n");
@@ -622,11 +622,11 @@

conn->ntables++;

-				SQLFreeStmt(hcol_stmt, SQL_DROP);
+				PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
mylog("Created col_info table='%s', ntables=%d\n", ti[i]->name, conn->ntables);
}
else {
-				SQLFreeStmt(hcol_stmt, SQL_DROP);
+				PG__SQLFreeStmt(hcol_stmt, SQL_DROP);
break;
}
}
diff -u -r pgsql/src/interfaces/odbc/results.c pgsql.new/src/interfaces/odbc/results.c
--- pgsql/src/interfaces/odbc/results.c	Sat May 27 08:00:26 2000
+++ pgsql.new/src/interfaces/odbc/results.c	Tue Aug  1 14:52:56 2000
@@ -595,7 +595,7 @@

/* Returns result data for a single column in the current row. */

-RETCODE SQL_API SQLGetData(
+RETCODE SQL_API PG__SQLGetData(
HSTMT hstmt,
UWORD icol,
SWORD fCType,
@@ -763,12 +763,26 @@
}
}

-
+RETCODE SQL_API SQLGetData(
+        HSTMT      hstmt,
+        UWORD      icol,
+        SWORD      fCType,
+        PTR        rgbValue,
+        SDWORD     cbValueMax,
+        SDWORD FAR *pcbValue)
+{
+    return PG__SQLGetData( hstmt,
+            icol,
+            fCType,
+            rgbValue,
+            cbValueMax,
+            pcbValue );
+}

/* Returns data for bound columns in the current row ("hstmt->iCursor"), */
/* advances the cursor. */

-RETCODE SQL_API SQLFetch(
+RETCODE SQL_API PG__SQLFetch(
HSTMT hstmt)
{
static char *func = "SQLFetch";
@@ -829,9 +843,16 @@
return SC_fetch(stmt);
}

+RETCODE SQL_API SQLFetch(
+        HSTMT   hstmt)
+{
+    return PG__SQLFetch( hstmt );
+}
+
+
/*      This fetchs a block of data (rowset). */

-RETCODE SQL_API SQLExtendedFetch(
+RETCODE SQL_API PG__SQLExtendedFetch(
HSTMT hstmt,
UWORD fFetchType,
SDWORD irow,
@@ -1097,6 +1118,20 @@
else
return SQL_SUCCESS;

+}
+
+RETCODE SQL_API SQLExtendedFetch(
+        HSTMT      hstmt,
+        UWORD      fFetchType,
+        SDWORD     irow,
+        UDWORD FAR *pcrow,
+        UWORD  FAR *rgfRowStatus)
+{
+    return PG__SQLExtendedFetch( hstmt,
+            fFetchType,
+            irow,
+            pcrow,
+            rgfRowStatus );
}
diff -u -r pgsql/src/interfaces/odbc/statement.c pgsql.new/src/interfaces/odbc/statement.c
--- pgsql/src/interfaces/odbc/statement.c	Sat May 27 08:00:26 2000
+++ pgsql.new/src/interfaces/odbc/statement.c	Tue Aug  1 14:38:10 2000
@@ -61,7 +61,7 @@
};
-RETCODE SQL_API SQLAllocStmt(HDBC      hdbc,
+RETCODE SQL_API PG__SQLAllocStmt(HDBC      hdbc,
HSTMT FAR *phstmt)
{
static char *func="SQLAllocStmt";
@@ -109,8 +109,14 @@
return SQL_SUCCESS;
}
+RETCODE SQL_API SQLAllocStmt(HDBC      hdbc,
+			     HSTMT FAR *phstmt)
+{
+    return PG__SQLAllocStmt( hdbc, phstmt );
+}
-RETCODE SQL_API SQLFreeStmt(HSTMT     hstmt,
+
+RETCODE SQL_API PG__SQLFreeStmt(HSTMT     hstmt,
UWORD     fOption)
{
static char *func="SQLFreeStmt";
@@ -170,6 +176,11 @@
return SQL_SUCCESS;
}
+RETCODE SQL_API SQLFreeStmt(HSTMT     hstmt,
+			    UWORD     fOption)
+{
+    return PG__SQLFreeStmt( hstmt, fOption );
+}

/**********************************************************************
@@ -479,7 +490,7 @@
if (self->status == STMT_READY) {
mylog(" preprocess: status = READY\n");

-		SQLExecute(self);
+		PG__SQLExecute(self);

if (self->status == STMT_FINISHED) {
mylog(" preprocess: after status = FINISHED, so set PREMATURE\n");

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026