Modified:
branches/guffert/driver/ansi.c
branches/guffert/driver/driver.h
branches/guffert/driver/info.c
branches/guffert/driver/unicode.c
Log:
Return length of numeric data returned in SQLGetInfo (expected by Microsoft
Access) and fix incorrect error call in SQLDriverConnect().
Modified: branches/guffert/driver/ansi.c
===================================================================
--- branches/guffert/driver/ansi.c 2007-08-30 23:53:08 UTC (rev 723)
+++ branches/guffert/driver/ansi.c 2007-08-31 00:58:33 UTC (rev 724)
@@ -785,7 +785,7 @@
SQLSMALLINT free_value= FALSE;
uint errors;
- SQLRETURN rc= MySQLGetInfo(hdbc, type, &char_value, value);
+ SQLRETURN rc= MySQLGetInfo(hdbc, type, &char_value, value, value_len);
if (char_value)
{
Modified: branches/guffert/driver/driver.h
===================================================================
--- branches/guffert/driver/driver.h 2007-08-30 23:53:08 UTC (rev 723)
+++ branches/guffert/driver/driver.h 2007-08-31 00:58:33 UTC (rev 724)
@@ -432,7 +432,8 @@
SQLCHAR *fktable, SQLSMALLINT fktable_len);
SQLCHAR *MySQLGetCursorName(HSTMT hstmt);
SQLRETURN SQL_API MySQLGetInfo(SQLHDBC hdbc, SQLUSMALLINT fInfoType,
- SQLCHAR **char_info, SQLPOINTER num_info);
+ SQLCHAR **char_info, SQLPOINTER num_info,
+ SQLSMALLINT *value_len);
SQLRETURN SQL_API MySQLGetConnectAttr(SQLHDBC hdbc, SQLINTEGER attrib,
SQLCHAR **char_attr, SQLPOINTER num_attr);
SQLRETURN SQL_API MySQLGetDiagField(SQLSMALLINT handle_type, SQLHANDLE handle,
Modified: branches/guffert/driver/info.c
===================================================================
--- branches/guffert/driver/info.c 2007-08-30 23:53:08 UTC (rev 723)
+++ branches/guffert/driver/info.c 2007-08-31 00:58:33 UTC (rev 724)
@@ -30,12 +30,14 @@
#define MYINFO_SET_ULONG(val) \
do { \
*((SQLUINTEGER *)num_info)= (val); \
+ *value_len= sizeof(SQLUINTEGER); \
return SQL_SUCCESS; \
} while(0)
#define MYINFO_SET_USHORT(val) \
do { \
*((SQLUSMALLINT *)num_info)= (val); \
+ *value_len= sizeof(SQLUSMALLINT); \
return SQL_SUCCESS; \
} while(0)
@@ -54,20 +56,21 @@
@param[in] hdbc Handle of database connection
@param[in] fInfoType Type of information to retrieve
- @param[out] rgbInfoValue Pointer to buffer for returning information
- @param[in] cbInfoValueMax Length of buffer pointed to by @a rgbInfoValue
- @param[out] pcbInfoValue Pointer to buffer in which to return bytes of
- @a rgbInfoValue that are used
-
- @since ODBC 1.0
- @since ISO SQL 92
+ @param[out] char_info Pointer to buffer for returning string
+ @param[out] num_info Pointer to buffer for returning numeric info
+ @param[out] value_len Pointer to buffer for returning length (only
+ used for numeric data)
*/
SQLRETURN SQL_API
MySQLGetInfo(SQLHDBC hdbc, SQLUSMALLINT fInfoType,
- SQLCHAR **char_info, SQLPOINTER num_info)
+ SQLCHAR **char_info, SQLPOINTER num_info, SQLSMALLINT *value_len)
{
DBC *dbc= (DBC *)hdbc;
+ SQLSMALLINT dummy;
+ if (!value_len)
+ value_len= &dummy;
+
switch (fInfoType) {
case SQL_ACTIVE_ENVIRONMENTS:
MYINFO_SET_USHORT(0);
@@ -522,7 +525,7 @@
SQL_FN_NUM_TRUNCATE);
case SQL_ODBC_API_CONFORMANCE:
- MYINFO_SET_ULONG(SQL_OAC_LEVEL1);
+ MYINFO_SET_USHORT(SQL_OAC_LEVEL1);
case SQL_ODBC_INTERFACE_CONFORMANCE:
MYINFO_SET_ULONG(SQL_OIC_LEVEL1);
Modified: branches/guffert/driver/unicode.c
===================================================================
--- branches/guffert/driver/unicode.c 2007-08-30 23:53:08 UTC (rev 723)
+++ branches/guffert/driver/unicode.c 2007-08-31 00:58:33 UTC (rev 724)
@@ -483,11 +483,13 @@
{
SQLRETURN rc;
SQLINTEGER in_len= in_len_in;
- SQLSMALLINT out8_max;
+ SQLSMALLINT out8_max, dummy_out;
SQLCHAR *out8, *in8= sqlwchar_as_utf8(in, &in_len);
if (in_len == SQL_NTS)
in_len= sqlwchar_strlen(in);
+ if (!out_len)
+ out_len= &dummy_out;
out8_max= sizeof(SQLCHAR) * 4 * out_max;
out8= (SQLCHAR *)my_malloc(out8_max + 1, MYF(0));
@@ -505,6 +507,9 @@
/* Now we have to convert out8 back into a SQLWCHAR. */
*out_len= utf8_as_sqlwchar(out, out_max, out8, *out_len);
+ if (*out_len > out_max - 1)
+ rc= set_dbc_error((DBC *)hdbc, "01004", NULL, 0);
+
error:
x_free(out8);
x_free(in8);
@@ -925,7 +930,7 @@
SQLINTEGER len= SQL_NTS;
uint errors;
- SQLRETURN rc= MySQLGetInfo(hdbc, type, &char_value, value);
+ SQLRETURN rc= MySQLGetInfo(hdbc, type, &char_value, value, value_len);
if (char_value)
{
| Thread |
|---|
| • Connector/ODBC 3.51 commit: r724 - branches/guffert/driver | jwinstead | 31 Aug |