Patch odbc.diff from Nirgal

This commit is contained in:
Nirgal Vourgre 2011-08-28 19:46:20 -04:00 committed by Brian Bruns
parent 29dc97e3d6
commit 230dfc8b2b
2 changed files with 390 additions and 344 deletions

View File

@ -23,6 +23,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <ctype.h>
#include "connectparams.h" #include "connectparams.h"
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
@ -46,10 +47,12 @@
static char line[max_line]; static char line[max_line];
static guint HashFunction (gconstpointer key); static guint HashFunction (gconstpointer key);
#if !HAVE_SQLGETPRIVATEPROFILESTRING
static GString* GetIniFileName (); static GString* GetIniFileName ();
static int FileExists (const gchar* name); static int FileExists (const gchar* name);
static int FindSection (FILE* stream, const char* section); static int FindSection (FILE* stream, const char* section);
static int GetNextItem (FILE* stream, char** name, char** value); static int GetNextItem (FILE* stream, char** name, char** value);
#endif //!HAVE_SQLGETPRIVATEPROFILESTRING
static void visit (gpointer key, gpointer value, gpointer user_data); static void visit (gpointer key, gpointer value, gpointer user_data);
static gboolean cleanup (gpointer key, gpointer value, gpointer user_data); static gboolean cleanup (gpointer key, gpointer value, gpointer user_data);
@ -360,6 +363,20 @@ gchar* ExtractDBQ (ConnectParams* params, const gchar* connectString)
* Begin local function definitions * Begin local function definitions
*/ */
/*
* Make a hash from all the characters
*/
static guint HashFunction (gconstpointer key)
{
guint value = 0;
const char* s = key;
while (*s) value += *s++;
return value;
}
#if !HAVE_SQLGETPRIVATEPROFILESTRING
static GString* GetIniFileName () static GString* GetIniFileName ()
{ {
char* setting; char* setting;
@ -438,19 +455,6 @@ static int FindSection (FILE* stream, const char* section)
return 0; return 0;
} }
/*
* Make a hash from all the characters
*/
static guint HashFunction (gconstpointer key)
{
guint value = 0;
const char* s = key;
while (*s) value += *s++;
return value;
}
static int GetNextItem (FILE* stream, char** name, char** value) static int GetNextItem (FILE* stream, char** name, char** value)
{ {
char* s; char* s;
@ -499,12 +503,12 @@ static int GetNextItem (FILE* stream, char** name, char** value)
return 1; return 1;
} }
#endif //!HAVE_SQLGETPRIVATEPROFILESTRING
static void visit (gpointer key, gpointer value, gpointer user_data) static void visit (gpointer key, gpointer value, gpointer user_data)
{ {
FILE* output = (FILE*) user_data; FILE* output = (FILE*) user_data;
fprintf(output, "Parameter: %s, Value: %s\n", (char*)key, (char*)value);
g_printerr ("Parameter: %s, Value: %s\n", key, value);
} }
static gboolean cleanup (gpointer key, gpointer value, gpointer user_data) static gboolean cleanup (gpointer key, gpointer value, gpointer user_data)

View File

@ -27,12 +27,19 @@
#include "connectparams.h" #include "connectparams.h"
//#define TRACE(x) fprintf(stderr,"Function %s\n", x);
#define TRACE(x)
//#define ENABLE_ODBC_W
#ifdef ENABLE_ODBC_W
static iconv_t iconv_in,iconv_out; static iconv_t iconv_in,iconv_out;
#endif //ENABLE_ODBC_W
static SQLSMALLINT _odbc_get_client_type(int srv_type); static SQLSMALLINT _odbc_get_client_type(int srv_type);
static int _odbc_fix_literals(struct _hstmt *stmt); static int _odbc_fix_literals(struct _hstmt *stmt);
static int _odbc_get_server_type(int clt_type); //static int _odbc_get_server_type(int clt_type);
static int _odbc_get_string_size(int size, char *str); static int _odbc_get_string_size(int size, SQLCHAR FAR *str);
static SQLRETURN SQL_API _SQLAllocConnect(SQLHENV henv, SQLHDBC FAR *phdbc); static SQLRETURN SQL_API _SQLAllocConnect(SQLHENV henv, SQLHDBC FAR *phdbc);
static SQLRETURN SQL_API _SQLAllocEnv(SQLHENV FAR *phenv); static SQLRETURN SQL_API _SQLAllocEnv(SQLHENV FAR *phenv);
static SQLRETURN SQL_API _SQLAllocStmt(SQLHDBC hdbc, SQLHSTMT FAR *phstmt); static SQLRETURN SQL_API _SQLAllocStmt(SQLHDBC hdbc, SQLHSTMT FAR *phstmt);
@ -51,9 +58,6 @@ static void bind_columns (struct _hstmt*);
static char lastError[_MAX_ERROR_LEN+1]; static char lastError[_MAX_ERROR_LEN+1];
static char sqlState[6]; static char sqlState[6];
//#define TRACE(x) fprintf(stderr,"Function %s\n", x);
#define TRACE(x)
typedef struct { typedef struct {
SQLCHAR *type_name; SQLCHAR *type_name;
SQLSMALLINT data_type; SQLSMALLINT data_type;
@ -93,12 +97,38 @@ TypeInfo type_info[] = {
#define NUM_TYPE_INFO_COLS 19 #define NUM_TYPE_INFO_COLS 19
#define MAX_TYPE_INFO 11 #define MAX_TYPE_INFO 11
#ifdef ENABLE_ODBC_W
void __attribute__ ((constructor)) my_init(){ void __attribute__ ((constructor)) my_init(){
iconv_out = iconv_open("UCS-2LE", "UTF-8"); TRACE("my_init");
iconv_in = iconv_open("UTF-8", "UCS-2LE"); int endian = 1;
const char* wcharset;
if (sizeof(SQLWCHAR) == 2)
if (*(char*)&endian == 1)
wcharset = "UCS-2LE";
else
wcharset = "UCS-2BE";
else if (sizeof(SQLWCHAR) == 4)
if (*(char*)&endian == 1)
wcharset = "UCS-4LE";
else
wcharset = "UCS-4BE";
else
fprintf(stderr, "Unsupported SQLWCHAR width %d\n", sizeof(SQLWCHAR));
//fprintf(stderr, "SQLWCHAR width %d\n", sizeof(SQLWCHAR));
/*
#if __SIZEOF_WCHAR_T__ == 4 || __WCHAR_MAX__ > 0x10000
#define WCHAR_CHARSET "UCS-4LE"
#else
#define WCHAR_CHARSET "UCS-2LE"
#endif
*/
iconv_out = iconv_open(wcharset, "UTF-8");
iconv_in = iconv_open("UTF-8", wcharset);
} }
void __attribute__ ((destructor)) my_fini(){ void __attribute__ ((destructor)) my_fini(){
TRACE("my_fini");
if(iconv_out != (iconv_t)-1)iconv_close(iconv_out); if(iconv_out != (iconv_t)-1)iconv_close(iconv_out);
if(iconv_in != (iconv_t)-1)iconv_close(iconv_in); if(iconv_in != (iconv_t)-1)iconv_close(iconv_in);
} }
@ -120,8 +150,12 @@ int ascii2unicode(char *_in,unsigned int *_lin,char *_out,unsigned int *_lout){
} }
int sqlwlen(SQLWCHAR *p){ int sqlwlen(SQLWCHAR *p){
int r=0;for(;*p;r++)p++;return r; int r=0;
for(;*p;r++)
p++;
return r;
} }
#endif // ENABLE_ODBC_W
/* The SQL engine is presently non-reenterrant and non-thread safe. /* The SQL engine is presently non-reenterrant and non-thread safe.
See _SQLExecute for details. See _SQLExecute for details.
@ -148,57 +182,14 @@ typedef struct
static SQLRETURN do_connect ( static SQLRETURN do_connect (
SQLHDBC hdbc, SQLHDBC hdbc,
SQLCHAR FAR *database char *database)
)
{ {
struct _hdbc *dbc = (struct _hdbc *) hdbc; struct _hdbc *dbc = (struct _hdbc *) hdbc;
struct _henv *env = (struct _henv *) dbc->henv; struct _henv *env = (struct _henv *) dbc->henv;
if (mdb_sql_open(env->sql,database)) { if (mdb_sql_open(env->sql, database))
return SQL_SUCCESS; return SQL_SUCCESS;
} else { else
return SQL_ERROR;
}
}
SQLRETURN SQL_API SQLDriverConnect_(
SQLHDBC hdbc,
SQLHWND hwnd,
SQLCHAR FAR *szConnStrIn,
SQLSMALLINT cbConnStrIn,
SQLCHAR FAR *szConnStrOut,
SQLSMALLINT cbConnStrOutMax,
SQLSMALLINT FAR *pcbConnStrOut,
SQLUSMALLINT fDriverCompletion)
{
SQLCHAR FAR* dsn = NULL;
SQLCHAR FAR* database = NULL;
ConnectParams* params;
SQLRETURN ret;
TRACE("SQLDriverConnect");
strcpy (lastError, "");
params = ((ODBCConnection*) hdbc)->params;
if (dsn = ExtractDSN (params, szConnStrIn)){
if (!LookupDSN (params, dsn)){
LogError ("Could not find DSN in odbc.ini");
return SQL_ERROR;
}
SetConnectString (params, szConnStrIn);
if (!(database = GetConnectParam (params, "Database"))){
LogError ("Could not find Database parameter");
return SQL_ERROR;
}
ret = do_connect (hdbc, database);
return ret;
}
if (database = ExtractDBQ (params, szConnStrIn)){
ret = do_connect (hdbc, database);
return ret;
}
LogError ("Could not find DSN nor DBQ in connect string");
return SQL_ERROR; return SQL_ERROR;
} }
@ -212,9 +203,38 @@ SQLRETURN SQL_API SQLDriverConnect(
SQLSMALLINT FAR *pcbConnStrOut, SQLSMALLINT FAR *pcbConnStrOut,
SQLUSMALLINT fDriverCompletion) SQLUSMALLINT fDriverCompletion)
{ {
return SQLDriverConnect_(hdbc,hwnd,szConnStrIn,cbConnStrIn,szConnStrOut,cbConnStrOutMax,pcbConnStrOut,fDriverCompletion); char* dsn = NULL;
char* database = NULL;
ConnectParams* params;
SQLRETURN ret;
TRACE("SQLDriverConnect");
strcpy (lastError, "");
params = ((ODBCConnection*) hdbc)->params;
if ((dsn = ExtractDSN (params, (gchar*)szConnStrIn))) {
if (!LookupDSN (params, dsn)){
LogError ("Could not find DSN in odbc.ini");
return SQL_ERROR;
}
SetConnectString (params, (gchar*)szConnStrIn);
if (!(database = GetConnectParam (params, "Database"))){
LogError ("Could not find Database parameter");
return SQL_ERROR;
}
ret = do_connect (hdbc, database);
return ret;
}
if ((database = ExtractDBQ (params, (gchar*)szConnStrIn))) {
ret = do_connect (hdbc, database);
return ret;
}
LogError ("Could not find DSN nor DBQ in connect string");
return SQL_ERROR;
} }
#ifdef ENABLE_ODBC_W
SQLRETURN SQL_API SQLDriverConnectW( SQLRETURN SQL_API SQLDriverConnectW(
SQLHDBC hdbc, SQLHDBC hdbc,
SQLHWND hwnd, SQLHWND hwnd,
@ -228,15 +248,21 @@ SQLRETURN SQL_API SQLDriverConnectW(
if(cbConnStrIn==SQL_NTS) if(cbConnStrIn==SQL_NTS)
cbConnStrIn=sqlwlen(szConnStrIn); cbConnStrIn=sqlwlen(szConnStrIn);
{ {
SQLCHAR *tmp=calloc(cbConnStrIn*4,1); unsigned int l = cbConnStrIn*sizeof(SQLWCHAR), z = (cbConnStrIn+1)*3;
int l=cbConnStrIn*4,z=cbConnStrIn*2; SQLCHAR *tmp = malloc(z);
SQLRETURN ret; SQLRETURN ret;
unicode2ascii(szConnStrIn, &z, tmp, &l); unicode2ascii((char*)szConnStrIn, &l, (char*)tmp, &z);
ret=SQLDriverConnect_(hdbc,hwnd,tmp,l,NULL,0,pcbConnStrOut,fDriverCompletion); tmp[z] = 0;
ret=SQLDriverConnect(hdbc,hwnd,tmp,SQL_NTS,NULL,0,pcbConnStrOut,fDriverCompletion);
free(tmp); free(tmp);
if (szConnStrOut && cbConnStrOutMax>0)
szConnStrOut[0] = 0;
if (pcbConnStrOut)
*pcbConnStrOut = 0;
return ret; return ret;
} }
} }
#endif // ENABLE_ODBC_W
SQLRETURN SQL_API SQLBrowseConnect( SQLRETURN SQL_API SQLBrowseConnect(
SQLHDBC hdbc, SQLHDBC hdbc,
@ -463,10 +489,10 @@ SQLRETURN SQL_API SQLBindParameter(
SQLLEN cbValueMax, SQLLEN cbValueMax,
SQLLEN FAR *pcbValue) SQLLEN FAR *pcbValue)
{ {
struct _hstmt *stmt; /*struct _hstmt *stmt;*/
TRACE("SQLBindParameter"); TRACE("SQLBindParameter");
stmt = (struct _hstmt *) hstmt; /*stmt = (struct _hstmt *) hstmt;*/
return SQL_SUCCESS; return SQL_SUCCESS;
} }
@ -536,11 +562,11 @@ static SQLRETURN SQL_API _SQLAllocStmt(
SQLHDBC hdbc, SQLHDBC hdbc,
SQLHSTMT FAR *phstmt) SQLHSTMT FAR *phstmt)
{ {
struct _hdbc *dbc; /*struct _hdbc *dbc;*/
struct _hstmt *stmt; struct _hstmt *stmt;
TRACE("_SQLAllocStmt"); TRACE("_SQLAllocStmt");
dbc = (struct _hdbc *) hdbc; /*dbc = (struct _hdbc *) hdbc;*/
stmt = (SQLHSTMT) g_malloc0(sizeof(struct _hstmt)); stmt = (SQLHSTMT) g_malloc0(sizeof(struct _hstmt));
stmt->hdbc=hdbc; stmt->hdbc=hdbc;
@ -611,7 +637,7 @@ SQLRETURN SQL_API SQLCancel(
return SQL_SUCCESS; return SQL_SUCCESS;
} }
SQLRETURN SQL_API SQLConnect_( SQLRETURN SQL_API SQLConnect(
SQLHDBC hdbc, SQLHDBC hdbc,
SQLCHAR FAR *szDSN, SQLCHAR FAR *szDSN,
SQLSMALLINT cbDSN, SQLSMALLINT cbDSN,
@ -620,7 +646,7 @@ SQLRETURN SQL_API SQLConnect_(
SQLCHAR FAR *szAuthStr, SQLCHAR FAR *szAuthStr,
SQLSMALLINT cbAuthStr) SQLSMALLINT cbAuthStr)
{ {
SQLCHAR FAR* database = NULL; char* database = NULL;
ConnectParams* params; ConnectParams* params;
SQLRETURN ret; SQLRETURN ret;
@ -629,9 +655,9 @@ SQLRETURN SQL_API SQLConnect_(
params = ((ODBCConnection*) hdbc)->params; params = ((ODBCConnection*) hdbc)->params;
params->dsnName = g_string_assign (params->dsnName, szDSN); params->dsnName = g_string_assign (params->dsnName, (gchar*)szDSN);
if (!LookupDSN (params, szDSN)) if (!LookupDSN (params, (gchar*)szDSN))
{ {
LogError ("Could not find DSN in odbc.ini"); LogError ("Could not find DSN in odbc.ini");
return SQL_ERROR; return SQL_ERROR;
@ -646,18 +672,7 @@ SQLRETURN SQL_API SQLConnect_(
return ret; return ret;
} }
SQLRETURN SQL_API SQLConnect( #ifdef ENABLE_ODBC_W
SQLHDBC hdbc,
SQLCHAR FAR *szDSN,
SQLSMALLINT cbDSN,
SQLCHAR FAR *szUID,
SQLSMALLINT cbUID,
SQLCHAR FAR *szAuthStr,
SQLSMALLINT cbAuthStr)
{
return SQLConnect_(hdbc,szDSN,cbDSN,szUID,cbUID,szAuthStr,cbAuthStr);
}
SQLRETURN SQL_API SQLConnectW( SQLRETURN SQL_API SQLConnectW(
SQLHDBC hdbc, SQLHDBC hdbc,
SQLWCHAR FAR *szDSN, SQLWCHAR FAR *szDSN,
@ -672,20 +687,21 @@ SQLRETURN SQL_API SQLConnectW(
if(cbAuthStr==SQL_NTS)cbAuthStr=sqlwlen(szAuthStr); if(cbAuthStr==SQL_NTS)cbAuthStr=sqlwlen(szAuthStr);
{ {
SQLCHAR *tmp1=calloc(cbDSN*4,1),*tmp2=calloc(cbUID*4,1),*tmp3=calloc(cbAuthStr*4,1); SQLCHAR *tmp1=calloc(cbDSN*4,1),*tmp2=calloc(cbUID*4,1),*tmp3=calloc(cbAuthStr*4,1);
int l1=cbDSN*4,z1=cbDSN*2; unsigned int l1=cbDSN*4,z1=cbDSN*2;
int l2=cbUID*4,z2=cbUID*2; unsigned int l2=cbUID*4,z2=cbUID*2;
int l3=cbAuthStr*4,z3=cbAuthStr*2; unsigned int l3=cbAuthStr*4,z3=cbAuthStr*2;
SQLRETURN ret; SQLRETURN ret;
unicode2ascii(szDSN, &z1, tmp1, &l1); unicode2ascii((char*)szDSN, &z1, (char*)tmp1, &l1);
unicode2ascii(szUID, &z2, tmp2, &l2); unicode2ascii((char*)szUID, &z2, (char*)tmp2, &l2);
unicode2ascii(szAuthStr, &z3, tmp3, &l3); unicode2ascii((char*)szAuthStr, &z3, (char*)tmp3, &l3);
ret=SQLConnect_(hdbc,tmp1,l1,tmp2,l2,tmp3,l3); ret=SQLConnect(hdbc,tmp1,l1,tmp2,l2,tmp3,l3);
free(tmp1),free(tmp2),free(tmp3); free(tmp1),free(tmp2),free(tmp3);
return ret; return ret;
} }
} }
#endif //ENABLE_ODBC_W
SQLRETURN SQL_API SQLDescribeCol_( SQLRETURN SQL_API SQLDescribeCol(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLUSMALLINT icol, SQLUSMALLINT icol,
SQLCHAR FAR *szColName, SQLCHAR FAR *szColName,
@ -720,7 +736,7 @@ SQLRETURN SQL_API SQLDescribeCol_(
if (szColName) { if (szColName) {
namelen = MIN(cbColNameMax,strlen(sqlcol->name)); namelen = MIN(cbColNameMax,strlen(sqlcol->name));
strncpy(szColName, sqlcol->name, namelen); strncpy((char*)szColName, sqlcol->name, namelen);
szColName[namelen]='\0'; szColName[namelen]='\0';
*pcbColName=namelen; *pcbColName=namelen;
} }
@ -741,20 +757,7 @@ SQLRETURN SQL_API SQLDescribeCol_(
return SQL_SUCCESS; return SQL_SUCCESS;
} }
SQLRETURN SQL_API SQLDescribeCol( #ifdef ENABLE_ODBC_W
SQLHSTMT hstmt,
SQLUSMALLINT icol,
SQLCHAR FAR *szColName,
SQLSMALLINT cbColNameMax,
SQLSMALLINT FAR *pcbColName,
SQLSMALLINT FAR *pfSqlType,
SQLUINTEGER FAR *pcbColDef, /* precision */
SQLSMALLINT FAR *pibScale,
SQLSMALLINT FAR *pfNullable)
{
return SQLDescribeCol_(hstmt,icol,szColName,cbColNameMax,pcbColName,pfSqlType,pcbColDef,pibScale,pfNullable);
}
SQLRETURN SQL_API SQLDescribeColW( SQLRETURN SQL_API SQLDescribeColW(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLUSMALLINT icol, SQLUSMALLINT icol,
@ -770,16 +773,17 @@ SQLRETURN SQL_API SQLDescribeColW(
cbColNameMax=sqlwlen(szColName); cbColNameMax=sqlwlen(szColName);
{ {
SQLCHAR *tmp=calloc(cbColNameMax*4,1); SQLCHAR *tmp=calloc(cbColNameMax*4,1);
int l=cbColNameMax*4; unsigned int l=cbColNameMax*4;
SQLRETURN ret=SQLDescribeCol_(hstmt,icol,tmp,cbColNameMax*4,&l,pfSqlType,pcbColDef,pibScale,pfNullable); SQLRETURN ret=SQLDescribeCol(hstmt,icol,tmp,cbColNameMax*4,&l,pfSqlType,pcbColDef,pibScale,pfNullable);
ascii2unicode(tmp, &l, szColName, pcbColName); ascii2unicode((char*)tmp, &l, (char*)szColName, pcbColName);
*pcbColName/=2; *pcbColName/=sizeof(SQLWCHAR);
free(tmp); free(tmp);
return ret; return ret;
} }
} }
#endif //ENABLE_ODBC_W
SQLRETURN SQL_API SQLColAttributes_( SQLRETURN SQL_API SQLColAttributes(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLUSMALLINT icol, SQLUSMALLINT icol,
SQLUSMALLINT fDescType, SQLUSMALLINT fDescType,
@ -845,18 +849,7 @@ SQLRETURN SQL_API SQLColAttributes_(
return SQL_SUCCESS; return SQL_SUCCESS;
} }
SQLRETURN SQL_API SQLColAttributes( #ifdef ENABLE_ODBC_W
SQLHSTMT hstmt,
SQLUSMALLINT icol,
SQLUSMALLINT fDescType,
SQLPOINTER rgbDesc,
SQLSMALLINT cbDescMax,
SQLSMALLINT FAR *pcbDesc,
SQLINTEGER FAR *pfDesc)
{
return SQLColAttributes_(hstmt,icol,fDescType,rgbDesc,cbDescMax,pcbDesc,pfDesc);
}
SQLRETURN SQL_API SQLColAttributesW( SQLRETURN SQL_API SQLColAttributesW(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLUSMALLINT icol, SQLUSMALLINT icol,
@ -867,17 +860,18 @@ SQLRETURN SQL_API SQLColAttributesW(
SQLINTEGER FAR *pfDesc) SQLINTEGER FAR *pfDesc)
{ {
if (fDescType!=SQL_COLUMN_NAME && fDescType!=SQL_COLUMN_LABEL) if (fDescType!=SQL_COLUMN_NAME && fDescType!=SQL_COLUMN_LABEL)
return SQLColAttributes_(hstmt,icol,fDescType,rgbDesc,cbDescMax,pcbDesc,pfDesc); return SQLColAttributes(hstmt,icol,fDescType,rgbDesc,cbDescMax,pcbDesc,pfDesc);
else{ else{
SQLCHAR *tmp=calloc(cbDescMax*4,1); SQLCHAR *tmp=calloc(cbDescMax*4,1);
int l=cbDescMax*4; unsigned int l=cbDescMax*4;
SQLRETURN ret=SQLColAttributes_(hstmt,icol,fDescType,tmp,cbDescMax*4,l,pfDesc); SQLRETURN ret=SQLColAttributes(hstmt,icol,fDescType,tmp,cbDescMax*4,l,pfDesc);
ascii2unicode(tmp, &l, rgbDesc, pcbDesc); ascii2unicode((char*)tmp, &l, (char*)rgbDesc, pcbDesc);
*pcbDesc/=2; *pcbDesc/=sizeof(SQLWCHAR);
free(tmp); free(tmp);
return ret; return ret;
} }
} }
#endif //ENABLE_ODBC_W
SQLRETURN SQL_API SQLDisconnect( SQLRETURN SQL_API SQLDisconnect(
SQLHDBC hdbc) SQLHDBC hdbc)
@ -909,8 +903,8 @@ SQLRETURN SQL_API SQLError(
TRACE("SQLError"); TRACE("SQLError");
if (strlen (lastError) > 0) if (strlen (lastError) > 0)
{ {
strcpy (szSqlState, "08001"); strcpy ((char*)szSqlState, "08001");
strcpy (szErrorMsg, lastError); strcpy ((char*)szErrorMsg, lastError);
if (pcbErrorMsg) if (pcbErrorMsg)
*pcbErrorMsg = strlen (lastError); *pcbErrorMsg = strlen (lastError);
if (pfNativeError) if (pfNativeError)
@ -923,6 +917,37 @@ SQLRETURN SQL_API SQLError(
return result; return result;
} }
#ifdef ENABLE_ODBC_W
SQLRETURN SQL_API SQLErrorW(
SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt,
SQLWCHAR FAR *szSqlState,
SQLINTEGER FAR *pfNativeError,
SQLWCHAR FAR *szErrorMsg,
SQLSMALLINT cbErrorMsgMax,
SQLSMALLINT FAR *pcbErrorMsg)
{
SQLCHAR szSqlState8[6];
SQLCHAR szErrorMsg8[3*cbErrorMsgMax+1];
SQLSMALLINT pcbErrorMsg8;
SQLRETURN result;
TRACE("SQLErrorW");
result = SQLError(henv, hdbc, hstmt, szSqlState8, pfNativeError, szErrorMsg8, 3*cbErrorMsgMax+1, &pcbErrorMsg8);
if (result == SQL_SUCCESS) {
unsigned int l=6, z=6*sizeof(SQLWCHAR);
ascii2unicode((char*)szSqlState8, &l, (char*)szSqlState, &z);
l = cbErrorMsgMax;
ascii2unicode((char*)szErrorMsg8, (unsigned int*)&pcbErrorMsg8, (char*)szErrorMsg, &l);
if (pcbErrorMsg)
*pcbErrorMsg = l;
}
return result;
}
#endif // ENABLE_ODBC_W
static SQLRETURN SQL_API _SQLExecute( SQLHSTMT hstmt) static SQLRETURN SQL_API _SQLExecute( SQLHSTMT hstmt)
{ {
struct _hstmt *stmt = (struct _hstmt *) hstmt; struct _hstmt *stmt = (struct _hstmt *) hstmt;
@ -951,7 +976,7 @@ static SQLRETURN SQL_API _SQLExecute( SQLHSTMT hstmt)
} }
} }
SQLRETURN SQL_API SQLExecDirect_( SQLRETURN SQL_API SQLExecDirect(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLCHAR FAR *szSqlStr, SQLCHAR FAR *szSqlStr,
SQLINTEGER cbSqlStr) SQLINTEGER cbSqlStr)
@ -959,19 +984,12 @@ SQLRETURN SQL_API SQLExecDirect_(
struct _hstmt *stmt = (struct _hstmt *) hstmt; struct _hstmt *stmt = (struct _hstmt *) hstmt;
TRACE("SQLExecDirect"); TRACE("SQLExecDirect");
strcpy(stmt->query, szSqlStr); strcpy(stmt->query, (char*)szSqlStr);
return _SQLExecute(hstmt); return _SQLExecute(hstmt);
} }
SQLRETURN SQL_API SQLExecDirect( #ifdef ENABLE_ODBC_W
SQLHSTMT hstmt,
SQLCHAR FAR *szSqlStr,
SQLINTEGER cbSqlStr)
{
return SQLExecDirect_(hstmt,szSqlStr,cbSqlStr);
}
SQLRETURN SQL_API SQLExecDirectW( SQLRETURN SQL_API SQLExecDirectW(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLWCHAR FAR *szSqlStr, SQLWCHAR FAR *szSqlStr,
@ -981,14 +999,15 @@ SQLRETURN SQL_API SQLExecDirectW(
cbSqlStr=sqlwlen(szSqlStr); cbSqlStr=sqlwlen(szSqlStr);
{ {
SQLCHAR *tmp=calloc(cbSqlStr*4,1); SQLCHAR *tmp=calloc(cbSqlStr*4,1);
int l=cbSqlStr*4,z=cbSqlStr*2; unsigned int l=cbSqlStr*4,z=cbSqlStr*2;
SQLRETURN ret; SQLRETURN ret;
unicode2ascii(szSqlStr, &z, tmp, &l); unicode2ascii((char*)szSqlStr, &z, (char*)tmp, &l);
ret=SQLExecDirect_(hstmt,tmp,l); ret=SQLExecDirect(hstmt,tmp,l);
free(tmp); free(tmp);
return ret; return ret;
} }
} }
#endif // ENABLE_ODBC_W
SQLRETURN SQL_API SQLExecute( SQLRETURN SQL_API SQLExecute(
SQLHSTMT hstmt) SQLHSTMT hstmt)
@ -996,6 +1015,7 @@ SQLRETURN SQL_API SQLExecute(
TRACE("SQLExecute"); TRACE("SQLExecute");
return _SQLExecute(hstmt); return _SQLExecute(hstmt);
} }
static void static void
bind_columns(struct _hstmt *stmt) bind_columns(struct _hstmt *stmt)
{ {
@ -1017,6 +1037,7 @@ struct _sql_bind_info *cur;
} }
} }
} }
SQLRETURN SQL_API SQLFetch( SQLRETURN SQL_API SQLFetch(
SQLHSTMT hstmt) SQLHSTMT hstmt)
{ {
@ -1165,7 +1186,7 @@ SQLRETURN SQL_API SQLPrepare(
TRACE("SQLPrepare"); TRACE("SQLPrepare");
strncpy(stmt->query, szSqlStr, sqllen); strncpy(stmt->query, (char*)szSqlStr, sqllen);
stmt->query[sqllen]='\0'; stmt->query[sqllen]='\0';
return SQL_SUCCESS; return SQL_SUCCESS;
@ -1215,7 +1236,7 @@ SQLRETURN SQL_API SQLSetParam( /* Use SQLBindParameter */
return SQL_SUCCESS; return SQL_SUCCESS;
} }
SQLRETURN SQL_API SQLColumns_( SQLRETURN SQL_API SQLColumns(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLCHAR FAR *szCatalogName, SQLCHAR FAR *szCatalogName,
SQLSMALLINT cbCatalogName, SQLSMALLINT cbCatalogName,
@ -1276,16 +1297,16 @@ SQLRETURN SQL_API SQLColumns_(
for (i=0; i<mdb->num_catalog; i++) { for (i=0; i<mdb->num_catalog; i++) {
entry = g_ptr_array_index(mdb->catalog, i); entry = g_ptr_array_index(mdb->catalog, i);
/* TODO: Do more advanced matching */ /* TODO: Do more advanced matching */
if (strcasecmp(szTableName, entry->object_name) != 0) if (strcasecmp((char*)szTableName, entry->object_name) != 0)
continue; continue;
table = mdb_read_table(entry); table = mdb_read_table(entry);
mdb_read_columns(table); mdb_read_columns(table);
for (j=0; j<table->num_cols; j++) { for (j=0; j<table->num_cols; j++) {
col = g_ptr_array_index(table->columns, j); col = g_ptr_array_index(table->columns, j);
ts2 = mdb_ascii2unicode(mdb, table->name, 0, t2, MDB_BIND_SIZE); ts2 = mdb_ascii2unicode(mdb, table->name, 0, (char*)t2, MDB_BIND_SIZE);
ts3 = mdb_ascii2unicode(mdb, col->name, 0, t3, MDB_BIND_SIZE); ts3 = mdb_ascii2unicode(mdb, col->name, 0, (char*)t3, MDB_BIND_SIZE);
ts5 = mdb_ascii2unicode(mdb, "FIX ME", 0, t5, MDB_BIND_SIZE); ts5 = mdb_ascii2unicode(mdb, "FIX ME", 0, (char*)t5, MDB_BIND_SIZE);
nullable = SQL_NO_NULLS; nullable = SQL_NO_NULLS;
datatype = _odbc_get_client_type(col->col_type); datatype = _odbc_get_client_type(col->col_type);
sqldatatype = _odbc_get_client_type(col->col_type); sqldatatype = _odbc_get_client_type(col->col_type);
@ -1315,20 +1336,7 @@ SQLRETURN SQL_API SQLColumns_(
return SQL_SUCCESS; return SQL_SUCCESS;
} }
SQLRETURN SQL_API SQLColumns( #ifdef ENABLE_ODBC_W
SQLHSTMT hstmt,
SQLCHAR FAR *szCatalogName,
SQLSMALLINT cbCatalogName,
SQLCHAR FAR *szSchemaName,
SQLSMALLINT cbSchemaName,
SQLCHAR FAR *szTableName,
SQLSMALLINT cbTableName,
SQLCHAR FAR *szColumnName,
SQLSMALLINT cbColumnName)
{
return SQLColumns_(hstmt,szCatalogName,cbCatalogName,szSchemaName,cbSchemaName,szTableName,cbTableName,szColumnName,cbColumnName);
}
SQLRETURN SQL_API SQLColumnsW( SQLRETURN SQL_API SQLColumnsW(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLWCHAR FAR *szCatalogName, SQLWCHAR FAR *szCatalogName,
@ -1343,14 +1351,15 @@ SQLRETURN SQL_API SQLColumnsW(
if(cbTableName==SQL_NTS)cbTableName=sqlwlen(szTableName); if(cbTableName==SQL_NTS)cbTableName=sqlwlen(szTableName);
{ {
SQLCHAR *tmp=calloc(cbTableName*4,1); SQLCHAR *tmp=calloc(cbTableName*4,1);
int l=cbTableName*4,z=cbTableName*2; unsigned int l=cbTableName*4,z=cbTableName*2;
SQLRETURN ret; SQLRETURN ret;
unicode2ascii(szTableName, &z, tmp, &l); unicode2ascii((char*)szTableName, &z, (char*)tmp, &l);
ret=SQLColumns_(hstmt,NULL,0,NULL,0,tmp,l,NULL,0); ret=SQLColumns(hstmt,NULL,0,NULL,0,tmp,l,NULL,0);
free(tmp); free(tmp);
return ret; return ret;
} }
} }
#endif //ENABLE_ODBC_W
SQLRETURN SQL_API SQLGetConnectOption( SQLRETURN SQL_API SQLGetConnectOption(
SQLHDBC hdbc, SQLHDBC hdbc,
@ -1361,7 +1370,7 @@ SQLRETURN SQL_API SQLGetConnectOption(
return SQL_SUCCESS; return SQL_SUCCESS;
} }
SQLRETURN SQL_API SQLGetData_( SQLRETURN SQL_API SQLGetData(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLUSMALLINT icol, SQLUSMALLINT icol,
SQLSMALLINT fCType, SQLSMALLINT fCType,
@ -1440,17 +1449,7 @@ SQLRETURN SQL_API SQLGetData_(
return SQL_SUCCESS; return SQL_SUCCESS;
} }
SQLRETURN SQL_API SQLGetData( #ifdef ENABLE_ODBC_W
SQLHSTMT hstmt,
SQLUSMALLINT icol,
SQLSMALLINT fCType,
SQLPOINTER rgbValue,
SQLINTEGER cbValueMax,
SQLINTEGER FAR *pcbValue)
{
return SQLGetData_(hstmt,icol,fCType,rgbValue,cbValueMax,pcbValue);
}
SQLRETURN SQL_API SQLGetDataW( SQLRETURN SQL_API SQLGetDataW(
SQLHSTMT hstmt, SQLHSTMT hstmt,
SQLUSMALLINT icol, SQLUSMALLINT icol,
@ -1460,21 +1459,22 @@ SQLRETURN SQL_API SQLGetDataW(
SQLINTEGER FAR *pcbValue) SQLINTEGER FAR *pcbValue)
{ {
SQLCHAR *tmp=calloc(cbValueMax*4,1); SQLCHAR *tmp=calloc(cbValueMax*4,1);
int l=cbValueMax*4; unsigned int l=cbValueMax*4;
SQLRETURN ret=SQLGetData_(hstmt,icol,fCType,tmp,cbValueMax*4,l); SQLRETURN ret=SQLGetData(hstmt,icol,fCType,tmp,cbValueMax*4,(SQLINTEGER FAR*)&l);
ascii2unicode(tmp, &l, rgbValue, pcbValue); ascii2unicode((char*)tmp, &l, (char*)rgbValue, (unsigned int*)pcbValue);
*pcbValue/=2; *pcbValue/=sizeof(SQLWCHAR);
free(tmp); free(tmp);
return ret; return ret;
} }
#endif //ENABLE_ODBC_W
static void _set_func_exists(SQLUSMALLINT FAR *pfExists, SQLUSMALLINT fFunction) static void _set_func_exists(SQLUSMALLINT FAR *pfExists, SQLUSMALLINT fFunction)
{ {
SQLUSMALLINT FAR *mod; SQLUSMALLINT FAR *mod;
mod = pfExists + (fFunction >> 4); mod = pfExists + (fFunction >> 4);
*mod |= (1 << (fFunction & 0x0f)); *mod |= (1 << (fFunction & 0x0f));
} }
SQLRETURN SQL_API SQLGetFunctions( SQLRETURN SQL_API SQLGetFunctions(
SQLHDBC hdbc, SQLHDBC hdbc,
SQLUSMALLINT fFunction, SQLUSMALLINT fFunction,
@ -1485,11 +1485,7 @@ SQLRETURN SQL_API SQLGetFunctions(
switch (fFunction) { switch (fFunction) {
#if ODBCVER >= 0x0300 #if ODBCVER >= 0x0300
case SQL_API_ODBC3_ALL_FUNCTIONS: case SQL_API_ODBC3_ALL_FUNCTIONS:
bzero(pfExists, SQL_API_ODBC3_ALL_FUNCTIONS_SIZE);
/* for (i=0;i<SQL_API_ODBC3_ALL_FUNCTIONS_SIZE;i++) {
pfExists[i] = 0xFFFF;
}
*/
_set_func_exists(pfExists,SQL_API_SQLALLOCCONNECT); _set_func_exists(pfExists,SQL_API_SQLALLOCCONNECT);
_set_func_exists(pfExists,SQL_API_SQLALLOCENV); _set_func_exists(pfExists,SQL_API_SQLALLOCENV);
_set_func_exists(pfExists,SQL_API_SQLALLOCHANDLE); _set_func_exists(pfExists,SQL_API_SQLALLOCHANDLE);
@ -1497,33 +1493,33 @@ SQLRETURN SQL_API SQLGetFunctions(
_set_func_exists(pfExists,SQL_API_SQLBINDCOL); _set_func_exists(pfExists,SQL_API_SQLBINDCOL);
_set_func_exists(pfExists,SQL_API_SQLBINDPARAMETER); _set_func_exists(pfExists,SQL_API_SQLBINDPARAMETER);
_set_func_exists(pfExists,SQL_API_SQLCANCEL); _set_func_exists(pfExists,SQL_API_SQLCANCEL);
_set_func_exists(pfExists,SQL_API_SQLCLOSECURSOR); //_set_func_exists(pfExists,SQL_API_SQLCLOSECURSOR);
_set_func_exists(pfExists,SQL_API_SQLCOLATTRIBUTE); _set_func_exists(pfExists,SQL_API_SQLCOLATTRIBUTE);
_set_func_exists(pfExists,SQL_API_SQLCOLUMNS); _set_func_exists(pfExists,SQL_API_SQLCOLUMNS);
_set_func_exists(pfExists,SQL_API_SQLCONNECT); _set_func_exists(pfExists,SQL_API_SQLCONNECT);
_set_func_exists(pfExists,SQL_API_SQLCOPYDESC); //_set_func_exists(pfExists,SQL_API_SQLCOPYDESC);
_set_func_exists(pfExists,SQL_API_SQLDATASOURCES); _set_func_exists(pfExists,SQL_API_SQLDATASOURCES);
_set_func_exists(pfExists,SQL_API_SQLDESCRIBECOL); _set_func_exists(pfExists,SQL_API_SQLDESCRIBECOL);
_set_func_exists(pfExists,SQL_API_SQLDISCONNECT); _set_func_exists(pfExists,SQL_API_SQLDISCONNECT);
_set_func_exists(pfExists,SQL_API_SQLENDTRAN); //_set_func_exists(pfExists,SQL_API_SQLENDTRAN);
_set_func_exists(pfExists,SQL_API_SQLERROR); _set_func_exists(pfExists,SQL_API_SQLERROR);
_set_func_exists(pfExists,SQL_API_SQLEXECDIRECT); _set_func_exists(pfExists,SQL_API_SQLEXECDIRECT);
_set_func_exists(pfExists,SQL_API_SQLEXECUTE); _set_func_exists(pfExists,SQL_API_SQLEXECUTE);
_set_func_exists(pfExists,SQL_API_SQLFETCH); _set_func_exists(pfExists,SQL_API_SQLFETCH);
_set_func_exists(pfExists,SQL_API_SQLFETCHSCROLL); //_set_func_exists(pfExists,SQL_API_SQLFETCHSCROLL);
_set_func_exists(pfExists,SQL_API_SQLFREECONNECT); _set_func_exists(pfExists,SQL_API_SQLFREECONNECT);
_set_func_exists(pfExists,SQL_API_SQLFREEENV); _set_func_exists(pfExists,SQL_API_SQLFREEENV);
_set_func_exists(pfExists,SQL_API_SQLFREEHANDLE); _set_func_exists(pfExists,SQL_API_SQLFREEHANDLE);
_set_func_exists(pfExists,SQL_API_SQLFREESTMT); _set_func_exists(pfExists,SQL_API_SQLFREESTMT);
_set_func_exists(pfExists,SQL_API_SQLGETCONNECTATTR); //_set_func_exists(pfExists,SQL_API_SQLGETCONNECTATTR);
_set_func_exists(pfExists,SQL_API_SQLGETCONNECTOPTION); _set_func_exists(pfExists,SQL_API_SQLGETCONNECTOPTION);
_set_func_exists(pfExists,SQL_API_SQLGETCURSORNAME); _set_func_exists(pfExists,SQL_API_SQLGETCURSORNAME);
_set_func_exists(pfExists,SQL_API_SQLGETDATA); _set_func_exists(pfExists,SQL_API_SQLGETDATA);
_set_func_exists(pfExists,SQL_API_SQLGETDESCFIELD); //_set_func_exists(pfExists,SQL_API_SQLGETDESCFIELD);
_set_func_exists(pfExists,SQL_API_SQLGETDESCREC); //_set_func_exists(pfExists,SQL_API_SQLGETDESCREC);
_set_func_exists(pfExists,SQL_API_SQLGETDIAGFIELD); //_set_func_exists(pfExists,SQL_API_SQLGETDIAGFIELD);
_set_func_exists(pfExists,SQL_API_SQLGETDIAGREC); //_set_func_exists(pfExists,SQL_API_SQLGETDIAGREC);
_set_func_exists(pfExists,SQL_API_SQLGETENVATTR); //_set_func_exists(pfExists,SQL_API_SQLGETENVATTR);
_set_func_exists(pfExists,SQL_API_SQLGETFUNCTIONS); _set_func_exists(pfExists,SQL_API_SQLGETFUNCTIONS);
_set_func_exists(pfExists,SQL_API_SQLGETINFO); _set_func_exists(pfExists,SQL_API_SQLGETINFO);
_set_func_exists(pfExists,SQL_API_SQLGETSTMTATTR); _set_func_exists(pfExists,SQL_API_SQLGETSTMTATTR);
@ -1534,30 +1530,29 @@ SQLRETURN SQL_API SQLGetFunctions(
_set_func_exists(pfExists,SQL_API_SQLPREPARE); _set_func_exists(pfExists,SQL_API_SQLPREPARE);
_set_func_exists(pfExists,SQL_API_SQLPUTDATA); _set_func_exists(pfExists,SQL_API_SQLPUTDATA);
_set_func_exists(pfExists,SQL_API_SQLROWCOUNT); _set_func_exists(pfExists,SQL_API_SQLROWCOUNT);
_set_func_exists(pfExists,SQL_API_SQLSETCONNECTATTR); //_set_func_exists(pfExists,SQL_API_SQLSETCONNECTATTR);
_set_func_exists(pfExists,SQL_API_SQLSETCONNECTOPTION); _set_func_exists(pfExists,SQL_API_SQLSETCONNECTOPTION);
_set_func_exists(pfExists,SQL_API_SQLSETCURSORNAME); _set_func_exists(pfExists,SQL_API_SQLSETCURSORNAME);
_set_func_exists(pfExists,SQL_API_SQLSETDESCFIELD); //_set_func_exists(pfExists,SQL_API_SQLSETDESCFIELD);
_set_func_exists(pfExists,SQL_API_SQLSETDESCREC); //_set_func_exists(pfExists,SQL_API_SQLSETDESCREC);
_set_func_exists(pfExists,SQL_API_SQLSETENVATTR); _set_func_exists(pfExists,SQL_API_SQLSETENVATTR);
_set_func_exists(pfExists,SQL_API_SQLSETPARAM); _set_func_exists(pfExists,SQL_API_SQLSETPARAM);
_set_func_exists(pfExists,SQL_API_SQLSETSTMTATTR); //_set_func_exists(pfExists,SQL_API_SQLSETSTMTATTR);
_set_func_exists(pfExists,SQL_API_SQLSETSTMTOPTION); _set_func_exists(pfExists,SQL_API_SQLSETSTMTOPTION);
_set_func_exists(pfExists,SQL_API_SQLSPECIALCOLUMNS); _set_func_exists(pfExists,SQL_API_SQLSPECIALCOLUMNS);
_set_func_exists(pfExists,SQL_API_SQLSTATISTICS); _set_func_exists(pfExists,SQL_API_SQLSTATISTICS);
_set_func_exists(pfExists,SQL_API_SQLTABLES); _set_func_exists(pfExists,SQL_API_SQLTABLES);
_set_func_exists(pfExists,SQL_API_SQLTRANSACT); _set_func_exists(pfExists,SQL_API_SQLTRANSACT);
return SQL_SUCCESS;
break; break;
#endif #endif
case SQL_API_ALL_FUNCTIONS: case SQL_API_ALL_FUNCTIONS:
bzero(pfExists, 100); // 100 by spec
_set_func_exists(pfExists,SQL_API_SQLALLOCCONNECT); _set_func_exists(pfExists,SQL_API_SQLALLOCCONNECT);
_set_func_exists(pfExists,SQL_API_SQLALLOCENV); _set_func_exists(pfExists,SQL_API_SQLALLOCENV);
_set_func_exists(pfExists,SQL_API_SQLALLOCSTMT); _set_func_exists(pfExists,SQL_API_SQLALLOCSTMT);
_set_func_exists(pfExists,SQL_API_SQLBINDCOL); _set_func_exists(pfExists,SQL_API_SQLBINDCOL);
_set_func_exists(pfExists,SQL_API_SQLCANCEL); _set_func_exists(pfExists,SQL_API_SQLCANCEL);
_set_func_exists(pfExists,SQL_API_SQLCOLATTRIBUTES); _set_func_exists(pfExists,SQL_API_SQLCOLATTRIBUTE);
_set_func_exists(pfExists,SQL_API_SQLCOLUMNS); _set_func_exists(pfExists,SQL_API_SQLCOLUMNS);
_set_func_exists(pfExists,SQL_API_SQLCONNECT); _set_func_exists(pfExists,SQL_API_SQLCONNECT);
_set_func_exists(pfExists,SQL_API_SQLDATASOURCES); _set_func_exists(pfExists,SQL_API_SQLDATASOURCES);
@ -1569,12 +1564,14 @@ SQLRETURN SQL_API SQLGetFunctions(
_set_func_exists(pfExists,SQL_API_SQLFETCH); _set_func_exists(pfExists,SQL_API_SQLFETCH);
_set_func_exists(pfExists,SQL_API_SQLFREECONNECT); _set_func_exists(pfExists,SQL_API_SQLFREECONNECT);
_set_func_exists(pfExists,SQL_API_SQLFREEENV); _set_func_exists(pfExists,SQL_API_SQLFREEENV);
_set_func_exists(pfExists,SQL_API_SQLFREEHANDLE);
_set_func_exists(pfExists,SQL_API_SQLFREESTMT); _set_func_exists(pfExists,SQL_API_SQLFREESTMT);
_set_func_exists(pfExists,SQL_API_SQLGETCONNECTOPTION); _set_func_exists(pfExists,SQL_API_SQLGETCONNECTOPTION);
_set_func_exists(pfExists,SQL_API_SQLGETCURSORNAME); _set_func_exists(pfExists,SQL_API_SQLGETCURSORNAME);
_set_func_exists(pfExists,SQL_API_SQLGETDATA); _set_func_exists(pfExists,SQL_API_SQLGETDATA);
_set_func_exists(pfExists,SQL_API_SQLGETFUNCTIONS); _set_func_exists(pfExists,SQL_API_SQLGETFUNCTIONS);
_set_func_exists(pfExists,SQL_API_SQLGETINFO); _set_func_exists(pfExists,SQL_API_SQLGETINFO);
_set_func_exists(pfExists,SQL_API_SQLGETSTMTATTR);
_set_func_exists(pfExists,SQL_API_SQLGETSTMTOPTION); _set_func_exists(pfExists,SQL_API_SQLGETSTMTOPTION);
_set_func_exists(pfExists,SQL_API_SQLGETTYPEINFO); _set_func_exists(pfExists,SQL_API_SQLGETTYPEINFO);
_set_func_exists(pfExists,SQL_API_SQLNUMRESULTCOLS); _set_func_exists(pfExists,SQL_API_SQLNUMRESULTCOLS);
@ -1584,17 +1581,61 @@ SQLRETURN SQL_API SQLGetFunctions(
_set_func_exists(pfExists,SQL_API_SQLROWCOUNT); _set_func_exists(pfExists,SQL_API_SQLROWCOUNT);
_set_func_exists(pfExists,SQL_API_SQLSETCONNECTOPTION); _set_func_exists(pfExists,SQL_API_SQLSETCONNECTOPTION);
_set_func_exists(pfExists,SQL_API_SQLSETCURSORNAME); _set_func_exists(pfExists,SQL_API_SQLSETCURSORNAME);
_set_func_exists(pfExists,SQL_API_SQLSETENVATTR);
_set_func_exists(pfExists,SQL_API_SQLSETPARAM); _set_func_exists(pfExists,SQL_API_SQLSETPARAM);
_set_func_exists(pfExists,SQL_API_SQLSETSTMTOPTION); _set_func_exists(pfExists,SQL_API_SQLSETSTMTOPTION);
_set_func_exists(pfExists,SQL_API_SQLSPECIALCOLUMNS); _set_func_exists(pfExists,SQL_API_SQLSPECIALCOLUMNS);
_set_func_exists(pfExists,SQL_API_SQLSTATISTICS); _set_func_exists(pfExists,SQL_API_SQLSTATISTICS);
_set_func_exists(pfExists,SQL_API_SQLTABLES); _set_func_exists(pfExists,SQL_API_SQLTABLES);
_set_func_exists(pfExists,SQL_API_SQLTRANSACT); _set_func_exists(pfExists,SQL_API_SQLTRANSACT);
return SQL_SUCCESS;
break; break;
default:
case SQL_API_SQLALLOCCONNECT:
case SQL_API_SQLALLOCENV:
case SQL_API_SQLALLOCSTMT:
case SQL_API_SQLBINDCOL:
case SQL_API_SQLCANCEL:
case SQL_API_SQLCOLATTRIBUTE:
case SQL_API_SQLCOLUMNS:
case SQL_API_SQLCONNECT:
case SQL_API_SQLDATASOURCES:
case SQL_API_SQLDESCRIBECOL:
case SQL_API_SQLDISCONNECT:
case SQL_API_SQLERROR:
case SQL_API_SQLEXECDIRECT:
case SQL_API_SQLEXECUTE:
case SQL_API_SQLFETCH:
case SQL_API_SQLFREECONNECT:
case SQL_API_SQLFREEENV:
case SQL_API_SQLFREEHANDLE:
case SQL_API_SQLFREESTMT:
case SQL_API_SQLGETCONNECTOPTION:
case SQL_API_SQLGETCURSORNAME:
case SQL_API_SQLGETDATA:
case SQL_API_SQLGETFUNCTIONS:
case SQL_API_SQLGETINFO:
case SQL_API_SQLGETSTMTATTR:
case SQL_API_SQLGETSTMTOPTION:
case SQL_API_SQLGETTYPEINFO:
case SQL_API_SQLNUMRESULTCOLS:
case SQL_API_SQLPARAMDATA:
case SQL_API_SQLPREPARE:
case SQL_API_SQLPUTDATA:
case SQL_API_SQLROWCOUNT:
case SQL_API_SQLSETCONNECTOPTION:
case SQL_API_SQLSETCURSORNAME:
case SQL_API_SQLSETENVATTR:
case SQL_API_SQLSETPARAM:
case SQL_API_SQLSETSTMTOPTION:
case SQL_API_SQLSPECIALCOLUMNS:
case SQL_API_SQLSTATISTICS:
case SQL_API_SQLTABLES:
case SQL_API_SQLTRANSACT:
*pfExists = 1; /* SQL_TRUE */ *pfExists = 1; /* SQL_TRUE */
return SQL_SUCCESS; break;
default:
*pfExists = 0; /* SQL_FALSE */
break; break;
} }
return SQL_SUCCESS; return SQL_SUCCESS;
@ -1696,11 +1737,11 @@ SQLRETURN SQL_API SQLGetTypeInfo(
if (fSqlType && (fSqlType != type_info[i].data_type)) if (fSqlType && (fSqlType != type_info[i].data_type))
continue; continue;
ts0 = mdb_ascii2unicode(mdb, type_info[i].type_name, 0, t0, MDB_BIND_SIZE); ts0 = mdb_ascii2unicode(mdb, (char*)type_info[i].type_name, 0, (char*)t0, MDB_BIND_SIZE);
ts3 = mdb_ascii2unicode(mdb, type_info[i].literal_prefix, 0, t3, MDB_BIND_SIZE); ts3 = mdb_ascii2unicode(mdb, (char*)type_info[i].literal_prefix, 0, (char*)t3, MDB_BIND_SIZE);
ts4 = mdb_ascii2unicode(mdb, type_info[i].literal_suffix, 0, t4, MDB_BIND_SIZE); ts4 = mdb_ascii2unicode(mdb, (char*)type_info[i].literal_suffix, 0, (char*)t4, MDB_BIND_SIZE);
ts5 = mdb_ascii2unicode(mdb, type_info[i].create_params, 0, t5, MDB_BIND_SIZE); ts5 = mdb_ascii2unicode(mdb, (char*)type_info[i].create_params, 0, (char*)t5, MDB_BIND_SIZE);
ts12 = mdb_ascii2unicode(mdb, type_info[i].local_type_name, 0, t12, MDB_BIND_SIZE); ts12 = mdb_ascii2unicode(mdb, (char*)type_info[i].local_type_name, 0, (char*)t12, MDB_BIND_SIZE);
FILL_FIELD(&fields[0], t0, ts0); FILL_FIELD(&fields[0], t0, ts0);
FILL_FIELD(&fields[1],&type_info[i].data_type, 0); FILL_FIELD(&fields[1],&type_info[i].data_type, 0);
@ -1818,7 +1859,7 @@ SQLRETURN SQL_API SQLTables( //sz* not used, so Unicode API not required.
MdbField fields[5]; MdbField fields[5];
MdbCatalogEntry *entry; MdbCatalogEntry *entry;
unsigned char row_buffer[MDB_PGSIZE]; unsigned char row_buffer[MDB_PGSIZE];
unsigned char *table_types[] = {"TABLE", "SYSTEM TABLE", "VIEW"}; char *table_types[] = {"TABLE", "SYSTEM TABLE", "VIEW"};
unsigned int i, j, row_size, ttype; unsigned int i, j, row_size, ttype;
unsigned int ts2, ts3; unsigned int ts2, ts3;
unsigned char t2[MDB_BIND_SIZE], unsigned char t2[MDB_BIND_SIZE],
@ -1854,8 +1895,8 @@ SQLRETURN SQL_API SQLTables( //sz* not used, so Unicode API not required.
FILL_FIELD(&fields[j], NULL, 0); FILL_FIELD(&fields[j], NULL, 0);
} }
ts2 = mdb_ascii2unicode(mdb, entry->object_name, 0, t2, MDB_BIND_SIZE); ts2 = mdb_ascii2unicode(mdb, entry->object_name, 0, (char*)t2, MDB_BIND_SIZE);
ts3 = mdb_ascii2unicode(mdb, table_types[ttype], 0, t3, MDB_BIND_SIZE); ts3 = mdb_ascii2unicode(mdb, table_types[ttype], 0, (char*)t3, MDB_BIND_SIZE);
FILL_FIELD(&fields[2], t2, ts2); FILL_FIELD(&fields[2], t2, ts2);
FILL_FIELD(&fields[3], t3, ts3); FILL_FIELD(&fields[3], t3, ts3);
@ -1924,18 +1965,19 @@ char quote_char;
return 0; return 0;
} }
static int _odbc_get_string_size(int size, char *str) static int _odbc_get_string_size(int size, SQLCHAR FAR *str)
{ {
if (!str) { if (!str) {
return 0; return 0;
} }
if (size==SQL_NTS) { if (size==SQL_NTS) {
return strlen(str); return strlen((char*)str);
} else { } else {
return size; return size;
} }
return 0; return 0;
} }
/*
static int _odbc_get_server_type(int clt_type) static int _odbc_get_server_type(int clt_type)
{ {
switch (clt_type) { switch (clt_type) {
@ -1953,7 +1995,7 @@ static int _odbc_get_server_type(int clt_type)
break; break;
} }
return 0; return 0;
} }*/
static SQLSMALLINT _odbc_get_client_type(int srv_type) static SQLSMALLINT _odbc_get_client_type(int srv_type)
{ {
switch (srv_type) { switch (srv_type) {