mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-05-03 12:37:56 +08:00
Patch odbc.diff from Nirgal
This commit is contained in:
parent
29dc97e3d6
commit
230dfc8b2b
@ -23,6 +23,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "connectparams.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
@ -46,10 +47,12 @@
|
||||
static char line[max_line];
|
||||
|
||||
static guint HashFunction (gconstpointer key);
|
||||
#if !HAVE_SQLGETPRIVATEPROFILESTRING
|
||||
static GString* GetIniFileName ();
|
||||
static int FileExists (const gchar* name);
|
||||
static int FindSection (FILE* stream, const char* section);
|
||||
static int GetNextItem (FILE* stream, char** name, char** value);
|
||||
#endif //!HAVE_SQLGETPRIVATEPROFILESTRING
|
||||
|
||||
static void visit (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
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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 ()
|
||||
{
|
||||
char* setting;
|
||||
@ -438,19 +455,6 @@ static int FindSection (FILE* stream, const char* section)
|
||||
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)
|
||||
{
|
||||
char* s;
|
||||
@ -499,12 +503,12 @@ static int GetNextItem (FILE* stream, char** name, char** value)
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif //!HAVE_SQLGETPRIVATEPROFILESTRING
|
||||
|
||||
static void visit (gpointer key, gpointer value, gpointer user_data)
|
||||
{
|
||||
FILE* output = (FILE*) user_data;
|
||||
|
||||
g_printerr ("Parameter: %s, Value: %s\n", key, value);
|
||||
fprintf(output, "Parameter: %s, Value: %s\n", (char*)key, (char*)value);
|
||||
}
|
||||
|
||||
static gboolean cleanup (gpointer key, gpointer value, gpointer user_data)
|
||||
|
472
src/odbc/odbc.c
472
src/odbc/odbc.c
@ -27,12 +27,19 @@
|
||||
|
||||
#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;
|
||||
#endif //ENABLE_ODBC_W
|
||||
|
||||
static SQLSMALLINT _odbc_get_client_type(int srv_type);
|
||||
static int _odbc_fix_literals(struct _hstmt *stmt);
|
||||
static int _odbc_get_server_type(int clt_type);
|
||||
static int _odbc_get_string_size(int size, char *str);
|
||||
//static int _odbc_get_server_type(int clt_type);
|
||||
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 _SQLAllocEnv(SQLHENV FAR *phenv);
|
||||
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 sqlState[6];
|
||||
|
||||
//#define TRACE(x) fprintf(stderr,"Function %s\n", x);
|
||||
#define TRACE(x)
|
||||
|
||||
typedef struct {
|
||||
SQLCHAR *type_name;
|
||||
SQLSMALLINT data_type;
|
||||
@ -93,12 +97,38 @@ TypeInfo type_info[] = {
|
||||
#define NUM_TYPE_INFO_COLS 19
|
||||
#define MAX_TYPE_INFO 11
|
||||
|
||||
#ifdef ENABLE_ODBC_W
|
||||
void __attribute__ ((constructor)) my_init(){
|
||||
iconv_out = iconv_open("UCS-2LE", "UTF-8");
|
||||
iconv_in = iconv_open("UTF-8", "UCS-2LE");
|
||||
TRACE("my_init");
|
||||
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(){
|
||||
TRACE("my_fini");
|
||||
if(iconv_out != (iconv_t)-1)iconv_close(iconv_out);
|
||||
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 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.
|
||||
See _SQLExecute for details.
|
||||
@ -148,57 +182,14 @@ typedef struct
|
||||
|
||||
static SQLRETURN do_connect (
|
||||
SQLHDBC hdbc,
|
||||
SQLCHAR FAR *database
|
||||
)
|
||||
char *database)
|
||||
{
|
||||
struct _hdbc *dbc = (struct _hdbc *) hdbc;
|
||||
struct _henv *env = (struct _henv *) dbc->henv;
|
||||
|
||||
if (mdb_sql_open(env->sql,database)) {
|
||||
if (mdb_sql_open(env->sql, database))
|
||||
return SQL_SUCCESS;
|
||||
} 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");
|
||||
else
|
||||
return SQL_ERROR;
|
||||
}
|
||||
|
||||
@ -212,9 +203,38 @@ SQLRETURN SQL_API SQLDriverConnect(
|
||||
SQLSMALLINT FAR *pcbConnStrOut,
|
||||
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(
|
||||
SQLHDBC hdbc,
|
||||
SQLHWND hwnd,
|
||||
@ -228,15 +248,21 @@ SQLRETURN SQL_API SQLDriverConnectW(
|
||||
if(cbConnStrIn==SQL_NTS)
|
||||
cbConnStrIn=sqlwlen(szConnStrIn);
|
||||
{
|
||||
SQLCHAR *tmp=calloc(cbConnStrIn*4,1);
|
||||
int l=cbConnStrIn*4,z=cbConnStrIn*2;
|
||||
unsigned int l = cbConnStrIn*sizeof(SQLWCHAR), z = (cbConnStrIn+1)*3;
|
||||
SQLCHAR *tmp = malloc(z);
|
||||
SQLRETURN ret;
|
||||
unicode2ascii(szConnStrIn, &z, tmp, &l);
|
||||
ret=SQLDriverConnect_(hdbc,hwnd,tmp,l,NULL,0,pcbConnStrOut,fDriverCompletion);
|
||||
unicode2ascii((char*)szConnStrIn, &l, (char*)tmp, &z);
|
||||
tmp[z] = 0;
|
||||
ret=SQLDriverConnect(hdbc,hwnd,tmp,SQL_NTS,NULL,0,pcbConnStrOut,fDriverCompletion);
|
||||
free(tmp);
|
||||
if (szConnStrOut && cbConnStrOutMax>0)
|
||||
szConnStrOut[0] = 0;
|
||||
if (pcbConnStrOut)
|
||||
*pcbConnStrOut = 0;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif // ENABLE_ODBC_W
|
||||
|
||||
SQLRETURN SQL_API SQLBrowseConnect(
|
||||
SQLHDBC hdbc,
|
||||
@ -463,10 +489,10 @@ SQLRETURN SQL_API SQLBindParameter(
|
||||
SQLLEN cbValueMax,
|
||||
SQLLEN FAR *pcbValue)
|
||||
{
|
||||
struct _hstmt *stmt;
|
||||
/*struct _hstmt *stmt;*/
|
||||
|
||||
TRACE("SQLBindParameter");
|
||||
stmt = (struct _hstmt *) hstmt;
|
||||
/*stmt = (struct _hstmt *) hstmt;*/
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@ -536,11 +562,11 @@ static SQLRETURN SQL_API _SQLAllocStmt(
|
||||
SQLHDBC hdbc,
|
||||
SQLHSTMT FAR *phstmt)
|
||||
{
|
||||
struct _hdbc *dbc;
|
||||
/*struct _hdbc *dbc;*/
|
||||
struct _hstmt *stmt;
|
||||
|
||||
TRACE("_SQLAllocStmt");
|
||||
dbc = (struct _hdbc *) hdbc;
|
||||
/*dbc = (struct _hdbc *) hdbc;*/
|
||||
|
||||
stmt = (SQLHSTMT) g_malloc0(sizeof(struct _hstmt));
|
||||
stmt->hdbc=hdbc;
|
||||
@ -611,7 +637,7 @@ SQLRETURN SQL_API SQLCancel(
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLConnect_(
|
||||
SQLRETURN SQL_API SQLConnect(
|
||||
SQLHDBC hdbc,
|
||||
SQLCHAR FAR *szDSN,
|
||||
SQLSMALLINT cbDSN,
|
||||
@ -620,7 +646,7 @@ SQLRETURN SQL_API SQLConnect_(
|
||||
SQLCHAR FAR *szAuthStr,
|
||||
SQLSMALLINT cbAuthStr)
|
||||
{
|
||||
SQLCHAR FAR* database = NULL;
|
||||
char* database = NULL;
|
||||
ConnectParams* params;
|
||||
SQLRETURN ret;
|
||||
|
||||
@ -629,9 +655,9 @@ SQLRETURN SQL_API SQLConnect_(
|
||||
|
||||
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");
|
||||
return SQL_ERROR;
|
||||
@ -646,18 +672,7 @@ SQLRETURN SQL_API SQLConnect_(
|
||||
return ret;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLConnect(
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_ODBC_W
|
||||
SQLRETURN SQL_API SQLConnectW(
|
||||
SQLHDBC hdbc,
|
||||
SQLWCHAR FAR *szDSN,
|
||||
@ -672,20 +687,21 @@ SQLRETURN SQL_API SQLConnectW(
|
||||
if(cbAuthStr==SQL_NTS)cbAuthStr=sqlwlen(szAuthStr);
|
||||
{
|
||||
SQLCHAR *tmp1=calloc(cbDSN*4,1),*tmp2=calloc(cbUID*4,1),*tmp3=calloc(cbAuthStr*4,1);
|
||||
int l1=cbDSN*4,z1=cbDSN*2;
|
||||
int l2=cbUID*4,z2=cbUID*2;
|
||||
int l3=cbAuthStr*4,z3=cbAuthStr*2;
|
||||
unsigned int l1=cbDSN*4,z1=cbDSN*2;
|
||||
unsigned int l2=cbUID*4,z2=cbUID*2;
|
||||
unsigned int l3=cbAuthStr*4,z3=cbAuthStr*2;
|
||||
SQLRETURN ret;
|
||||
unicode2ascii(szDSN, &z1, tmp1, &l1);
|
||||
unicode2ascii(szUID, &z2, tmp2, &l2);
|
||||
unicode2ascii(szAuthStr, &z3, tmp3, &l3);
|
||||
ret=SQLConnect_(hdbc,tmp1,l1,tmp2,l2,tmp3,l3);
|
||||
unicode2ascii((char*)szDSN, &z1, (char*)tmp1, &l1);
|
||||
unicode2ascii((char*)szUID, &z2, (char*)tmp2, &l2);
|
||||
unicode2ascii((char*)szAuthStr, &z3, (char*)tmp3, &l3);
|
||||
ret=SQLConnect(hdbc,tmp1,l1,tmp2,l2,tmp3,l3);
|
||||
free(tmp1),free(tmp2),free(tmp3);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif //ENABLE_ODBC_W
|
||||
|
||||
SQLRETURN SQL_API SQLDescribeCol_(
|
||||
SQLRETURN SQL_API SQLDescribeCol(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT icol,
|
||||
SQLCHAR FAR *szColName,
|
||||
@ -720,7 +736,7 @@ SQLRETURN SQL_API SQLDescribeCol_(
|
||||
|
||||
if (szColName) {
|
||||
namelen = MIN(cbColNameMax,strlen(sqlcol->name));
|
||||
strncpy(szColName, sqlcol->name, namelen);
|
||||
strncpy((char*)szColName, sqlcol->name, namelen);
|
||||
szColName[namelen]='\0';
|
||||
*pcbColName=namelen;
|
||||
}
|
||||
@ -741,20 +757,7 @@ SQLRETURN SQL_API SQLDescribeCol_(
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLDescribeCol(
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_ODBC_W
|
||||
SQLRETURN SQL_API SQLDescribeColW(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT icol,
|
||||
@ -770,16 +773,17 @@ SQLRETURN SQL_API SQLDescribeColW(
|
||||
cbColNameMax=sqlwlen(szColName);
|
||||
{
|
||||
SQLCHAR *tmp=calloc(cbColNameMax*4,1);
|
||||
int l=cbColNameMax*4;
|
||||
SQLRETURN ret=SQLDescribeCol_(hstmt,icol,tmp,cbColNameMax*4,&l,pfSqlType,pcbColDef,pibScale,pfNullable);
|
||||
ascii2unicode(tmp, &l, szColName, pcbColName);
|
||||
*pcbColName/=2;
|
||||
unsigned int l=cbColNameMax*4;
|
||||
SQLRETURN ret=SQLDescribeCol(hstmt,icol,tmp,cbColNameMax*4,&l,pfSqlType,pcbColDef,pibScale,pfNullable);
|
||||
ascii2unicode((char*)tmp, &l, (char*)szColName, pcbColName);
|
||||
*pcbColName/=sizeof(SQLWCHAR);
|
||||
free(tmp);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif //ENABLE_ODBC_W
|
||||
|
||||
SQLRETURN SQL_API SQLColAttributes_(
|
||||
SQLRETURN SQL_API SQLColAttributes(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT icol,
|
||||
SQLUSMALLINT fDescType,
|
||||
@ -845,18 +849,7 @@ SQLRETURN SQL_API SQLColAttributes_(
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLColAttributes(
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_ODBC_W
|
||||
SQLRETURN SQL_API SQLColAttributesW(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT icol,
|
||||
@ -867,17 +860,18 @@ SQLRETURN SQL_API SQLColAttributesW(
|
||||
SQLINTEGER FAR *pfDesc)
|
||||
{
|
||||
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{
|
||||
SQLCHAR *tmp=calloc(cbDescMax*4,1);
|
||||
int l=cbDescMax*4;
|
||||
SQLRETURN ret=SQLColAttributes_(hstmt,icol,fDescType,tmp,cbDescMax*4,l,pfDesc);
|
||||
ascii2unicode(tmp, &l, rgbDesc, pcbDesc);
|
||||
*pcbDesc/=2;
|
||||
unsigned int l=cbDescMax*4;
|
||||
SQLRETURN ret=SQLColAttributes(hstmt,icol,fDescType,tmp,cbDescMax*4,l,pfDesc);
|
||||
ascii2unicode((char*)tmp, &l, (char*)rgbDesc, pcbDesc);
|
||||
*pcbDesc/=sizeof(SQLWCHAR);
|
||||
free(tmp);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif //ENABLE_ODBC_W
|
||||
|
||||
SQLRETURN SQL_API SQLDisconnect(
|
||||
SQLHDBC hdbc)
|
||||
@ -909,8 +903,8 @@ SQLRETURN SQL_API SQLError(
|
||||
TRACE("SQLError");
|
||||
if (strlen (lastError) > 0)
|
||||
{
|
||||
strcpy (szSqlState, "08001");
|
||||
strcpy (szErrorMsg, lastError);
|
||||
strcpy ((char*)szSqlState, "08001");
|
||||
strcpy ((char*)szErrorMsg, lastError);
|
||||
if (pcbErrorMsg)
|
||||
*pcbErrorMsg = strlen (lastError);
|
||||
if (pfNativeError)
|
||||
@ -923,6 +917,37 @@ SQLRETURN SQL_API SQLError(
|
||||
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)
|
||||
{
|
||||
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,
|
||||
SQLCHAR FAR *szSqlStr,
|
||||
SQLINTEGER cbSqlStr)
|
||||
@ -959,19 +984,12 @@ SQLRETURN SQL_API SQLExecDirect_(
|
||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||
|
||||
TRACE("SQLExecDirect");
|
||||
strcpy(stmt->query, szSqlStr);
|
||||
strcpy(stmt->query, (char*)szSqlStr);
|
||||
|
||||
return _SQLExecute(hstmt);
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLExecDirect(
|
||||
SQLHSTMT hstmt,
|
||||
SQLCHAR FAR *szSqlStr,
|
||||
SQLINTEGER cbSqlStr)
|
||||
{
|
||||
return SQLExecDirect_(hstmt,szSqlStr,cbSqlStr);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_ODBC_W
|
||||
SQLRETURN SQL_API SQLExecDirectW(
|
||||
SQLHSTMT hstmt,
|
||||
SQLWCHAR FAR *szSqlStr,
|
||||
@ -981,14 +999,15 @@ SQLRETURN SQL_API SQLExecDirectW(
|
||||
cbSqlStr=sqlwlen(szSqlStr);
|
||||
{
|
||||
SQLCHAR *tmp=calloc(cbSqlStr*4,1);
|
||||
int l=cbSqlStr*4,z=cbSqlStr*2;
|
||||
unsigned int l=cbSqlStr*4,z=cbSqlStr*2;
|
||||
SQLRETURN ret;
|
||||
unicode2ascii(szSqlStr, &z, tmp, &l);
|
||||
ret=SQLExecDirect_(hstmt,tmp,l);
|
||||
unicode2ascii((char*)szSqlStr, &z, (char*)tmp, &l);
|
||||
ret=SQLExecDirect(hstmt,tmp,l);
|
||||
free(tmp);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif // ENABLE_ODBC_W
|
||||
|
||||
SQLRETURN SQL_API SQLExecute(
|
||||
SQLHSTMT hstmt)
|
||||
@ -996,6 +1015,7 @@ SQLRETURN SQL_API SQLExecute(
|
||||
TRACE("SQLExecute");
|
||||
return _SQLExecute(hstmt);
|
||||
}
|
||||
|
||||
static void
|
||||
bind_columns(struct _hstmt *stmt)
|
||||
{
|
||||
@ -1017,6 +1037,7 @@ struct _sql_bind_info *cur;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLFetch(
|
||||
SQLHSTMT hstmt)
|
||||
{
|
||||
@ -1165,7 +1186,7 @@ SQLRETURN SQL_API SQLPrepare(
|
||||
|
||||
TRACE("SQLPrepare");
|
||||
|
||||
strncpy(stmt->query, szSqlStr, sqllen);
|
||||
strncpy(stmt->query, (char*)szSqlStr, sqllen);
|
||||
stmt->query[sqllen]='\0';
|
||||
|
||||
return SQL_SUCCESS;
|
||||
@ -1215,7 +1236,7 @@ SQLRETURN SQL_API SQLSetParam( /* Use SQLBindParameter */
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLColumns_(
|
||||
SQLRETURN SQL_API SQLColumns(
|
||||
SQLHSTMT hstmt,
|
||||
SQLCHAR FAR *szCatalogName,
|
||||
SQLSMALLINT cbCatalogName,
|
||||
@ -1276,16 +1297,16 @@ SQLRETURN SQL_API SQLColumns_(
|
||||
for (i=0; i<mdb->num_catalog; i++) {
|
||||
entry = g_ptr_array_index(mdb->catalog, i);
|
||||
/* TODO: Do more advanced matching */
|
||||
if (strcasecmp(szTableName, entry->object_name) != 0)
|
||||
if (strcasecmp((char*)szTableName, entry->object_name) != 0)
|
||||
continue;
|
||||
table = mdb_read_table(entry);
|
||||
mdb_read_columns(table);
|
||||
for (j=0; j<table->num_cols; j++) {
|
||||
col = g_ptr_array_index(table->columns, j);
|
||||
|
||||
ts2 = mdb_ascii2unicode(mdb, table->name, 0, t2, MDB_BIND_SIZE);
|
||||
ts3 = mdb_ascii2unicode(mdb, col->name, 0, t3, MDB_BIND_SIZE);
|
||||
ts5 = mdb_ascii2unicode(mdb, "FIX ME", 0, t5, MDB_BIND_SIZE);
|
||||
ts2 = mdb_ascii2unicode(mdb, table->name, 0, (char*)t2, MDB_BIND_SIZE);
|
||||
ts3 = mdb_ascii2unicode(mdb, col->name, 0, (char*)t3, MDB_BIND_SIZE);
|
||||
ts5 = mdb_ascii2unicode(mdb, "FIX ME", 0, (char*)t5, MDB_BIND_SIZE);
|
||||
nullable = SQL_NO_NULLS;
|
||||
datatype = _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;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLColumns(
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_ODBC_W
|
||||
SQLRETURN SQL_API SQLColumnsW(
|
||||
SQLHSTMT hstmt,
|
||||
SQLWCHAR FAR *szCatalogName,
|
||||
@ -1343,14 +1351,15 @@ SQLRETURN SQL_API SQLColumnsW(
|
||||
if(cbTableName==SQL_NTS)cbTableName=sqlwlen(szTableName);
|
||||
{
|
||||
SQLCHAR *tmp=calloc(cbTableName*4,1);
|
||||
int l=cbTableName*4,z=cbTableName*2;
|
||||
unsigned int l=cbTableName*4,z=cbTableName*2;
|
||||
SQLRETURN ret;
|
||||
unicode2ascii(szTableName, &z, tmp, &l);
|
||||
ret=SQLColumns_(hstmt,NULL,0,NULL,0,tmp,l,NULL,0);
|
||||
unicode2ascii((char*)szTableName, &z, (char*)tmp, &l);
|
||||
ret=SQLColumns(hstmt,NULL,0,NULL,0,tmp,l,NULL,0);
|
||||
free(tmp);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif //ENABLE_ODBC_W
|
||||
|
||||
SQLRETURN SQL_API SQLGetConnectOption(
|
||||
SQLHDBC hdbc,
|
||||
@ -1361,7 +1370,7 @@ SQLRETURN SQL_API SQLGetConnectOption(
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLGetData_(
|
||||
SQLRETURN SQL_API SQLGetData(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT icol,
|
||||
SQLSMALLINT fCType,
|
||||
@ -1440,17 +1449,7 @@ SQLRETURN SQL_API SQLGetData_(
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLGetData(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT icol,
|
||||
SQLSMALLINT fCType,
|
||||
SQLPOINTER rgbValue,
|
||||
SQLINTEGER cbValueMax,
|
||||
SQLINTEGER FAR *pcbValue)
|
||||
{
|
||||
return SQLGetData_(hstmt,icol,fCType,rgbValue,cbValueMax,pcbValue);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_ODBC_W
|
||||
SQLRETURN SQL_API SQLGetDataW(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT icol,
|
||||
@ -1460,21 +1459,22 @@ SQLRETURN SQL_API SQLGetDataW(
|
||||
SQLINTEGER FAR *pcbValue)
|
||||
{
|
||||
SQLCHAR *tmp=calloc(cbValueMax*4,1);
|
||||
int l=cbValueMax*4;
|
||||
SQLRETURN ret=SQLGetData_(hstmt,icol,fCType,tmp,cbValueMax*4,l);
|
||||
ascii2unicode(tmp, &l, rgbValue, pcbValue);
|
||||
*pcbValue/=2;
|
||||
unsigned int l=cbValueMax*4;
|
||||
SQLRETURN ret=SQLGetData(hstmt,icol,fCType,tmp,cbValueMax*4,(SQLINTEGER FAR*)&l);
|
||||
ascii2unicode((char*)tmp, &l, (char*)rgbValue, (unsigned int*)pcbValue);
|
||||
*pcbValue/=sizeof(SQLWCHAR);
|
||||
free(tmp);
|
||||
return ret;
|
||||
}
|
||||
#endif //ENABLE_ODBC_W
|
||||
|
||||
static void _set_func_exists(SQLUSMALLINT FAR *pfExists, SQLUSMALLINT fFunction)
|
||||
{
|
||||
SQLUSMALLINT FAR *mod;
|
||||
|
||||
mod = pfExists + (fFunction >> 4);
|
||||
*mod |= (1 << (fFunction & 0x0f));
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLGetFunctions(
|
||||
SQLHDBC hdbc,
|
||||
SQLUSMALLINT fFunction,
|
||||
@ -1485,11 +1485,7 @@ SQLRETURN SQL_API SQLGetFunctions(
|
||||
switch (fFunction) {
|
||||
#if ODBCVER >= 0x0300
|
||||
case SQL_API_ODBC3_ALL_FUNCTIONS:
|
||||
|
||||
/* for (i=0;i<SQL_API_ODBC3_ALL_FUNCTIONS_SIZE;i++) {
|
||||
pfExists[i] = 0xFFFF;
|
||||
}
|
||||
*/
|
||||
bzero(pfExists, SQL_API_ODBC3_ALL_FUNCTIONS_SIZE);
|
||||
_set_func_exists(pfExists,SQL_API_SQLALLOCCONNECT);
|
||||
_set_func_exists(pfExists,SQL_API_SQLALLOCENV);
|
||||
_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_SQLBINDPARAMETER);
|
||||
_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_SQLCOLUMNS);
|
||||
_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_SQLDESCRIBECOL);
|
||||
_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_SQLEXECDIRECT);
|
||||
_set_func_exists(pfExists,SQL_API_SQLEXECUTE);
|
||||
_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_SQLFREEENV);
|
||||
_set_func_exists(pfExists,SQL_API_SQLFREEHANDLE);
|
||||
_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_SQLGETCURSORNAME);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETDATA);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETDESCFIELD);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETDESCREC);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETDIAGFIELD);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETDIAGREC);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETENVATTR);
|
||||
//_set_func_exists(pfExists,SQL_API_SQLGETDESCFIELD);
|
||||
//_set_func_exists(pfExists,SQL_API_SQLGETDESCREC);
|
||||
//_set_func_exists(pfExists,SQL_API_SQLGETDIAGFIELD);
|
||||
//_set_func_exists(pfExists,SQL_API_SQLGETDIAGREC);
|
||||
//_set_func_exists(pfExists,SQL_API_SQLGETENVATTR);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETFUNCTIONS);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETINFO);
|
||||
_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_SQLPUTDATA);
|
||||
_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_SQLSETCURSORNAME);
|
||||
_set_func_exists(pfExists,SQL_API_SQLSETDESCFIELD);
|
||||
_set_func_exists(pfExists,SQL_API_SQLSETDESCREC);
|
||||
//_set_func_exists(pfExists,SQL_API_SQLSETDESCFIELD);
|
||||
//_set_func_exists(pfExists,SQL_API_SQLSETDESCREC);
|
||||
_set_func_exists(pfExists,SQL_API_SQLSETENVATTR);
|
||||
_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_SQLSPECIALCOLUMNS);
|
||||
_set_func_exists(pfExists,SQL_API_SQLSTATISTICS);
|
||||
_set_func_exists(pfExists,SQL_API_SQLTABLES);
|
||||
_set_func_exists(pfExists,SQL_API_SQLTRANSACT);
|
||||
|
||||
return SQL_SUCCESS;
|
||||
break;
|
||||
#endif
|
||||
case SQL_API_ALL_FUNCTIONS:
|
||||
bzero(pfExists, 100); // 100 by spec
|
||||
_set_func_exists(pfExists,SQL_API_SQLALLOCCONNECT);
|
||||
_set_func_exists(pfExists,SQL_API_SQLALLOCENV);
|
||||
_set_func_exists(pfExists,SQL_API_SQLALLOCSTMT);
|
||||
_set_func_exists(pfExists,SQL_API_SQLBINDCOL);
|
||||
_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_SQLCONNECT);
|
||||
_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_SQLFREECONNECT);
|
||||
_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_SQLGETCONNECTOPTION);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETCURSORNAME);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETDATA);
|
||||
_set_func_exists(pfExists,SQL_API_SQLGETFUNCTIONS);
|
||||
_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_SQLGETTYPEINFO);
|
||||
_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_SQLSETCONNECTOPTION);
|
||||
_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_SQLSETSTMTOPTION);
|
||||
_set_func_exists(pfExists,SQL_API_SQLSPECIALCOLUMNS);
|
||||
_set_func_exists(pfExists,SQL_API_SQLSTATISTICS);
|
||||
_set_func_exists(pfExists,SQL_API_SQLTABLES);
|
||||
_set_func_exists(pfExists,SQL_API_SQLTRANSACT);
|
||||
return SQL_SUCCESS;
|
||||
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 */
|
||||
return SQL_SUCCESS;
|
||||
break;
|
||||
|
||||
default:
|
||||
*pfExists = 0; /* SQL_FALSE */
|
||||
break;
|
||||
}
|
||||
return SQL_SUCCESS;
|
||||
@ -1696,11 +1737,11 @@ SQLRETURN SQL_API SQLGetTypeInfo(
|
||||
if (fSqlType && (fSqlType != type_info[i].data_type))
|
||||
continue;
|
||||
|
||||
ts0 = mdb_ascii2unicode(mdb, type_info[i].type_name, 0, t0, MDB_BIND_SIZE);
|
||||
ts3 = mdb_ascii2unicode(mdb, type_info[i].literal_prefix, 0, t3, MDB_BIND_SIZE);
|
||||
ts4 = mdb_ascii2unicode(mdb, type_info[i].literal_suffix, 0, t4, MDB_BIND_SIZE);
|
||||
ts5 = mdb_ascii2unicode(mdb, type_info[i].create_params, 0, t5, MDB_BIND_SIZE);
|
||||
ts12 = mdb_ascii2unicode(mdb, type_info[i].local_type_name, 0, t12, MDB_BIND_SIZE);
|
||||
ts0 = mdb_ascii2unicode(mdb, (char*)type_info[i].type_name, 0, (char*)t0, MDB_BIND_SIZE);
|
||||
ts3 = mdb_ascii2unicode(mdb, (char*)type_info[i].literal_prefix, 0, (char*)t3, MDB_BIND_SIZE);
|
||||
ts4 = mdb_ascii2unicode(mdb, (char*)type_info[i].literal_suffix, 0, (char*)t4, MDB_BIND_SIZE);
|
||||
ts5 = mdb_ascii2unicode(mdb, (char*)type_info[i].create_params, 0, (char*)t5, 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[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];
|
||||
MdbCatalogEntry *entry;
|
||||
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 ts2, ts3;
|
||||
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);
|
||||
}
|
||||
|
||||
ts2 = mdb_ascii2unicode(mdb, entry->object_name, 0, t2, MDB_BIND_SIZE);
|
||||
ts3 = mdb_ascii2unicode(mdb, table_types[ttype], 0, t3, MDB_BIND_SIZE);
|
||||
ts2 = mdb_ascii2unicode(mdb, entry->object_name, 0, (char*)t2, 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[3], t3, ts3);
|
||||
@ -1924,18 +1965,19 @@ char quote_char;
|
||||
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) {
|
||||
return 0;
|
||||
}
|
||||
if (size==SQL_NTS) {
|
||||
return strlen(str);
|
||||
return strlen((char*)str);
|
||||
} else {
|
||||
return size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
static int _odbc_get_server_type(int clt_type)
|
||||
{
|
||||
switch (clt_type) {
|
||||
@ -1953,7 +1995,7 @@ static int _odbc_get_server_type(int clt_type)
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}*/
|
||||
static SQLSMALLINT _odbc_get_client_type(int srv_type)
|
||||
{
|
||||
switch (srv_type) {
|
||||
|
Loading…
Reference in New Issue
Block a user