mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-11-25 17:59:54 +08:00
SQLGetData() should return SQL_NO_DATA at end of data
This commit is contained in:
@@ -53,6 +53,8 @@ struct _hstmt {
|
|||||||
char query[4096];
|
char query[4096];
|
||||||
struct _sql_bind_info *bind_head;
|
struct _sql_bind_info *bind_head;
|
||||||
int rows_affected;
|
int rows_affected;
|
||||||
|
int icol;
|
||||||
|
int pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _sql_bind_info {
|
struct _sql_bind_info {
|
||||||
|
|||||||
@@ -319,6 +319,43 @@ gchar* ExtractDSN (ConnectParams* params, const gchar* connectString)
|
|||||||
return params->dsnName->str;
|
return params->dsnName->str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gchar* ExtractDBQ (ConnectParams* params, const gchar* connectString)
|
||||||
|
{
|
||||||
|
char *p, *q, *s;
|
||||||
|
|
||||||
|
if (!params)
|
||||||
|
return NULL;
|
||||||
|
/*
|
||||||
|
* Position ourselves to the beginning of "DSN"
|
||||||
|
*/
|
||||||
|
p = strstr (connectString, "DBQ");
|
||||||
|
if (!p) return NULL;
|
||||||
|
/*
|
||||||
|
* Position ourselves to the "="
|
||||||
|
*/
|
||||||
|
q = strchr (p, '=');
|
||||||
|
if (!q) return NULL;
|
||||||
|
/*
|
||||||
|
* Skip over any leading spaces
|
||||||
|
*/
|
||||||
|
q++;
|
||||||
|
while (isspace(*q))
|
||||||
|
q++;
|
||||||
|
/*
|
||||||
|
* Copy the DSN value to a buffer
|
||||||
|
*/
|
||||||
|
s = line;
|
||||||
|
while (*q && *q != ';')
|
||||||
|
*s++ = *q++;
|
||||||
|
*s = '\0';
|
||||||
|
/*
|
||||||
|
* Save it as a string in the params object
|
||||||
|
*/
|
||||||
|
params->dsnName = g_string_assign (params->dsnName, line);
|
||||||
|
|
||||||
|
return params->dsnName->str;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Begin local function definitions
|
* Begin local function definitions
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -38,5 +38,6 @@ void SetConnectString (ConnectParams* params, const gchar* connectString);
|
|||||||
void DumpParams (ConnectParams* params, FILE* output);
|
void DumpParams (ConnectParams* params, FILE* output);
|
||||||
|
|
||||||
gchar* ExtractDSN (ConnectParams* params, const gchar* connectString);
|
gchar* ExtractDSN (ConnectParams* params, const gchar* connectString);
|
||||||
|
gchar* ExtractDBQ (ConnectParams* params, const gchar* connectString);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
374
src/odbc/odbc.c
374
src/odbc/odbc.c
@@ -30,6 +30,7 @@
|
|||||||
static char software_version[] = "$Id: odbc.c,v 1.31 2007/03/18 14:11:43 brianb Exp $";
|
static char software_version[] = "$Id: odbc.c,v 1.31 2007/03/18 14:11:43 brianb Exp $";
|
||||||
static void *no_unused_var_warn[] = {software_version,
|
static void *no_unused_var_warn[] = {software_version,
|
||||||
no_unused_var_warn};
|
no_unused_var_warn};
|
||||||
|
static iconv_t iconv_in,iconv_out;
|
||||||
|
|
||||||
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);
|
||||||
@@ -95,6 +96,36 @@ 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
|
||||||
|
|
||||||
|
void __attribute__ ((constructor)) my_init(){
|
||||||
|
iconv_out = iconv_open("UCS-2LE", "UTF-8");
|
||||||
|
iconv_in = iconv_open("UTF-8", "UCS-2LE");
|
||||||
|
}
|
||||||
|
|
||||||
|
void __attribute__ ((destructor)) my_fini(){
|
||||||
|
if(iconv_out != (iconv_t)-1)iconv_close(iconv_out);
|
||||||
|
if(iconv_in != (iconv_t)-1)iconv_close(iconv_in);
|
||||||
|
}
|
||||||
|
|
||||||
|
int unicode2ascii(char *_in,unsigned int *_lin,char *_out,unsigned int *_lout){
|
||||||
|
char *in=_in,*out=_out;
|
||||||
|
unsigned lin=*_lin,lout=*_lout;
|
||||||
|
int ret=iconv(iconv_in,&in,&lin,&out,&lout);
|
||||||
|
*_lin-=lin,*_lout-=lout;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ascii2unicode(char *_in,unsigned int *_lin,char *_out,unsigned int *_lout){
|
||||||
|
char *in=_in,*out=_out;
|
||||||
|
unsigned lin=*_lin,lout=*_lout;
|
||||||
|
int ret=iconv(iconv_out,&in,&lin,&out,&lout);
|
||||||
|
*_lin-=lin,*_lout-=lout;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sqlwlen(SQLWCHAR *p){
|
||||||
|
int r=0;for(;*p;r++)p++;return r;
|
||||||
|
}
|
||||||
|
|
||||||
/* 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.
|
||||||
*/
|
*/
|
||||||
@@ -133,6 +164,47 @@ static SQLRETURN do_connect (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLDriverConnect(
|
SQLRETURN SQL_API SQLDriverConnect(
|
||||||
SQLHDBC hdbc,
|
SQLHDBC hdbc,
|
||||||
SQLHWND hwnd,
|
SQLHWND hwnd,
|
||||||
@@ -143,39 +215,30 @@ SQLRETURN SQL_API SQLDriverConnect(
|
|||||||
SQLSMALLINT FAR *pcbConnStrOut,
|
SQLSMALLINT FAR *pcbConnStrOut,
|
||||||
SQLUSMALLINT fDriverCompletion)
|
SQLUSMALLINT fDriverCompletion)
|
||||||
{
|
{
|
||||||
SQLCHAR FAR* dsn = NULL;
|
return SQLDriverConnect_(hdbc,hwnd,szConnStrIn,cbConnStrIn,szConnStrOut,cbConnStrOutMax,pcbConnStrOut,fDriverCompletion);
|
||||||
SQLCHAR FAR* database = NULL;
|
}
|
||||||
ConnectParams* params;
|
|
||||||
SQLRETURN ret;
|
|
||||||
|
|
||||||
TRACE("SQLDriverConnect");
|
SQLRETURN SQL_API SQLDriverConnectW(
|
||||||
|
SQLHDBC hdbc,
|
||||||
strcpy (lastError, "");
|
SQLHWND hwnd,
|
||||||
|
SQLWCHAR FAR *szConnStrIn,
|
||||||
params = ((ODBCConnection*) hdbc)->params;
|
SQLSMALLINT cbConnStrIn,
|
||||||
|
SQLWCHAR FAR *szConnStrOut,
|
||||||
if (!(dsn = ExtractDSN (params, szConnStrIn)))
|
SQLSMALLINT cbConnStrOutMax,
|
||||||
{
|
SQLSMALLINT FAR *pcbConnStrOut,
|
||||||
LogError ("Could not find DSN in connect string");
|
SQLUSMALLINT fDriverCompletion)
|
||||||
return SQL_ERROR;
|
{
|
||||||
}
|
if(cbConnStrIn==SQL_NTS)
|
||||||
else if (!LookupDSN (params, dsn))
|
cbConnStrIn=sqlwlen(szConnStrIn);
|
||||||
{
|
{
|
||||||
LogError ("Could not find DSN in odbc.ini");
|
SQLCHAR *tmp=calloc(cbConnStrIn*4,1);
|
||||||
return SQL_ERROR;
|
int l=cbConnStrIn*4,z=cbConnStrIn*2;
|
||||||
}
|
SQLRETURN ret;
|
||||||
else
|
unicode2ascii(szConnStrIn, &z, tmp, &l);
|
||||||
{
|
ret=SQLDriverConnect_(hdbc,hwnd,tmp,l,NULL,0,pcbConnStrOut,fDriverCompletion);
|
||||||
SetConnectString (params, szConnStrIn);
|
free(tmp);
|
||||||
|
return ret;
|
||||||
if (!(database = GetConnectParam (params, "Database")))
|
}
|
||||||
{
|
|
||||||
LogError ("Could not find Database parameter");
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret = do_connect (hdbc, database);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLBrowseConnect(
|
SQLRETURN SQL_API SQLBrowseConnect(
|
||||||
@@ -551,7 +614,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,
|
||||||
@@ -586,7 +649,46 @@ SQLRETURN SQL_API SQLConnect(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLDescribeCol(
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLConnectW(
|
||||||
|
SQLHDBC hdbc,
|
||||||
|
SQLWCHAR FAR *szDSN,
|
||||||
|
SQLSMALLINT cbDSN,
|
||||||
|
SQLWCHAR FAR *szUID,
|
||||||
|
SQLSMALLINT cbUID,
|
||||||
|
SQLWCHAR FAR *szAuthStr,
|
||||||
|
SQLSMALLINT cbAuthStr)
|
||||||
|
{
|
||||||
|
if(cbDSN==SQL_NTS)cbDSN=sqlwlen(szDSN);
|
||||||
|
if(cbUID==SQL_NTS)cbUID=sqlwlen(szUID);
|
||||||
|
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;
|
||||||
|
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);
|
||||||
|
free(tmp1),free(tmp2),free(tmp3);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLDescribeCol_(
|
||||||
SQLHSTMT hstmt,
|
SQLHSTMT hstmt,
|
||||||
SQLUSMALLINT icol,
|
SQLUSMALLINT icol,
|
||||||
SQLCHAR FAR *szColName,
|
SQLCHAR FAR *szColName,
|
||||||
@@ -623,9 +725,10 @@ SQLRETURN SQL_API SQLDescribeCol(
|
|||||||
namelen = MIN(cbColNameMax,strlen(sqlcol->name));
|
namelen = MIN(cbColNameMax,strlen(sqlcol->name));
|
||||||
strncpy(szColName, sqlcol->name, namelen);
|
strncpy(szColName, sqlcol->name, namelen);
|
||||||
szColName[namelen]='\0';
|
szColName[namelen]='\0';
|
||||||
|
*pcbColName=namelen;
|
||||||
}
|
}
|
||||||
if (pfSqlType) {
|
if (pfSqlType) { //Currently libmdbodbc.so returns values as string in SQLGetData() even though it is a number.
|
||||||
*pfSqlType = _odbc_get_client_type(col->col_type);
|
*pfSqlType = SQL_VARCHAR;//_odbc_get_client_type(col->col_type);
|
||||||
}
|
}
|
||||||
if (pcbColDef) {
|
if (pcbColDef) {
|
||||||
*pcbColDef = col->col_size;
|
*pcbColDef = col->col_size;
|
||||||
@@ -641,7 +744,45 @@ SQLRETURN SQL_API SQLDescribeCol(
|
|||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLColAttributes(
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLDescribeColW(
|
||||||
|
SQLHSTMT hstmt,
|
||||||
|
SQLUSMALLINT icol,
|
||||||
|
SQLWCHAR FAR *szColName,
|
||||||
|
SQLSMALLINT cbColNameMax,
|
||||||
|
SQLSMALLINT FAR *pcbColName,
|
||||||
|
SQLSMALLINT FAR *pfSqlType,
|
||||||
|
SQLUINTEGER FAR *pcbColDef, /* precision */
|
||||||
|
SQLSMALLINT FAR *pibScale,
|
||||||
|
SQLSMALLINT FAR *pfNullable)
|
||||||
|
{
|
||||||
|
if(cbColNameMax==SQL_NTS)
|
||||||
|
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;
|
||||||
|
free(tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLColAttributes_(
|
||||||
SQLHSTMT hstmt,
|
SQLHSTMT hstmt,
|
||||||
SQLUSMALLINT icol,
|
SQLUSMALLINT icol,
|
||||||
SQLUSMALLINT fDescType,
|
SQLUSMALLINT fDescType,
|
||||||
@@ -707,6 +848,39 @@ SQLRETURN SQL_API SQLColAttributes(
|
|||||||
return SQL_SUCCESS;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLColAttributesW(
|
||||||
|
SQLHSTMT hstmt,
|
||||||
|
SQLUSMALLINT icol,
|
||||||
|
SQLUSMALLINT fDescType,
|
||||||
|
SQLPOINTER rgbDesc,
|
||||||
|
SQLSMALLINT cbDescMax,
|
||||||
|
SQLSMALLINT FAR *pcbDesc,
|
||||||
|
SQLINTEGER FAR *pfDesc)
|
||||||
|
{
|
||||||
|
if(fDescType!=SQL_COLUMN_NAME&&fDescType!=SQL_COLUMN_LABEL)
|
||||||
|
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;
|
||||||
|
free(tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLDisconnect(
|
SQLRETURN SQL_API SQLDisconnect(
|
||||||
SQLHDBC hdbc)
|
SQLHDBC hdbc)
|
||||||
@@ -780,7 +954,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)
|
||||||
@@ -793,6 +967,32 @@ SQLRETURN SQL_API SQLExecDirect(
|
|||||||
return _SQLExecute(hstmt);
|
return _SQLExecute(hstmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLExecDirect(
|
||||||
|
SQLHSTMT hstmt,
|
||||||
|
SQLCHAR FAR *szSqlStr,
|
||||||
|
SQLINTEGER cbSqlStr)
|
||||||
|
{
|
||||||
|
return SQLExecDirect_(hstmt,szSqlStr,cbSqlStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLExecDirectW(
|
||||||
|
SQLHSTMT hstmt,
|
||||||
|
SQLWCHAR FAR *szSqlStr,
|
||||||
|
SQLINTEGER cbSqlStr)
|
||||||
|
{
|
||||||
|
if(cbSqlStr==SQL_NTS)
|
||||||
|
cbSqlStr=sqlwlen(szSqlStr);
|
||||||
|
{
|
||||||
|
SQLCHAR *tmp=calloc(cbSqlStr*4,1);
|
||||||
|
int l=cbSqlStr*4,z=cbSqlStr*2;
|
||||||
|
SQLRETURN ret;
|
||||||
|
unicode2ascii(szSqlStr, &z, tmp, &l);
|
||||||
|
ret=SQLExecDirect_(hstmt,tmp,l);
|
||||||
|
free(tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLExecute(
|
SQLRETURN SQL_API SQLExecute(
|
||||||
SQLHSTMT hstmt)
|
SQLHSTMT hstmt)
|
||||||
{
|
{
|
||||||
@@ -1018,7 +1218,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,
|
||||||
@@ -1118,6 +1318,43 @@ SQLRETURN SQL_API SQLColumns(
|
|||||||
return SQL_SUCCESS;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLColumnsW(
|
||||||
|
SQLHSTMT hstmt,
|
||||||
|
SQLWCHAR FAR *szCatalogName,
|
||||||
|
SQLSMALLINT cbCatalogName,
|
||||||
|
SQLWCHAR FAR *szSchemaName,
|
||||||
|
SQLSMALLINT cbSchemaName,
|
||||||
|
SQLWCHAR FAR *szTableName,
|
||||||
|
SQLSMALLINT cbTableName,
|
||||||
|
SQLWCHAR FAR *szColumnName,
|
||||||
|
SQLSMALLINT cbColumnName)
|
||||||
|
{
|
||||||
|
if(cbTableName==SQL_NTS)cbTableName=sqlwlen(szTableName);
|
||||||
|
{
|
||||||
|
SQLCHAR *tmp=calloc(cbTableName*4,1);
|
||||||
|
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);
|
||||||
|
free(tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLGetConnectOption(
|
SQLRETURN SQL_API SQLGetConnectOption(
|
||||||
SQLHDBC hdbc,
|
SQLHDBC hdbc,
|
||||||
SQLUSMALLINT fOption,
|
SQLUSMALLINT fOption,
|
||||||
@@ -1127,13 +1364,13 @@ 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,
|
||||||
SQLPOINTER rgbValue,
|
SQLPOINTER rgbValue,
|
||||||
SQLLEN cbValueMax,
|
SQLINTEGER cbValueMax,
|
||||||
SQLLEN FAR *pcbValue)
|
SQLINTEGER FAR *pcbValue)
|
||||||
{
|
{
|
||||||
struct _hstmt *stmt;
|
struct _hstmt *stmt;
|
||||||
struct _hdbc *dbc;
|
struct _hdbc *dbc;
|
||||||
@@ -1165,18 +1402,35 @@ SQLRETURN SQL_API SQLGetData(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(icol!=stmt->icol){stmt->icol=icol;stmt->pos=0;}
|
||||||
if (col->col_type == MDB_BOOL) {
|
if (col->col_type == MDB_BOOL) {
|
||||||
|
if(cbValueMax==0){if(pcbValue)*pcbValue=1;return SQL_SUCCESS_WITH_INFO;}
|
||||||
|
if(stmt->pos>=1)return SQL_NO_DATA;
|
||||||
|
if(!rgbValue){
|
||||||
|
strcpy(sqlState,"HY009");
|
||||||
|
return SQL_ERROR;
|
||||||
|
}
|
||||||
strcpy(rgbValue, (col->cur_value_len)?"0":"1");
|
strcpy(rgbValue, (col->cur_value_len)?"0":"1");
|
||||||
if (pcbValue)
|
if (pcbValue)
|
||||||
*pcbValue = 1;
|
*pcbValue = 1;
|
||||||
|
stmt->pos=1;
|
||||||
} else if (col->cur_value_len) {
|
} else if (col->cur_value_len) {
|
||||||
char *str = mdb_col_to_string(mdb,mdb->pg_buf,
|
char *str = mdb_col_to_string(mdb,mdb->pg_buf,
|
||||||
col->cur_value_start,col->col_type,col->cur_value_len);
|
col->cur_value_start,col->col_type,col->cur_value_len);
|
||||||
strcpy(rgbValue, str);
|
if(cbValueMax==0){if(pcbValue)*pcbValue=strlen(str);g_free(str);return SQL_SUCCESS_WITH_INFO;}
|
||||||
|
if(stmt->pos>=strlen(str))return SQL_NO_DATA;
|
||||||
|
if(!rgbValue){
|
||||||
|
strcpy(sqlState,"HY009");
|
||||||
|
return SQL_ERROR;
|
||||||
|
}
|
||||||
|
i=cbValueMax<=strlen(str+stmt->pos)?cbValueMax-1:strlen(str+stmt->pos);
|
||||||
|
memcpy(rgbValue,str+stmt->pos,i);
|
||||||
|
*((char*)(rgbValue)+i)=0;
|
||||||
|
stmt->pos+=i;
|
||||||
g_free(str);
|
g_free(str);
|
||||||
if (pcbValue)
|
if (pcbValue)
|
||||||
*pcbValue = col->cur_value_len;
|
*pcbValue = i;
|
||||||
} else {
|
} else {
|
||||||
/* When NULL data is retrieved, non-null pcbValue is required */
|
/* When NULL data is retrieved, non-null pcbValue is required */
|
||||||
if (pcbValue) {
|
if (pcbValue) {
|
||||||
@@ -1189,6 +1443,34 @@ SQLRETURN SQL_API SQLGetData(
|
|||||||
return SQL_SUCCESS;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLRETURN SQL_API SQLGetDataW(
|
||||||
|
SQLHSTMT hstmt,
|
||||||
|
SQLUSMALLINT icol,
|
||||||
|
SQLSMALLINT fCType,
|
||||||
|
SQLPOINTER rgbValue,
|
||||||
|
SQLINTEGER cbValueMax,
|
||||||
|
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;
|
||||||
|
free(tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
@@ -1519,7 +1801,7 @@ SQLRETURN SQL_API SQLStatistics(
|
|||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLTables(
|
SQLRETURN SQL_API SQLTables( //sz* not used, so Unicode API not required.
|
||||||
SQLHSTMT hstmt,
|
SQLHSTMT hstmt,
|
||||||
SQLCHAR FAR *szCatalogName,
|
SQLCHAR FAR *szCatalogName,
|
||||||
SQLSMALLINT cbCatalogName,
|
SQLSMALLINT cbCatalogName,
|
||||||
|
|||||||
Reference in New Issue
Block a user