List:Commits« Previous MessageNext Message »
From:jwinstead Date:August 31 2007 2:58am
Subject:Connector/ODBC 3.51 commit: r724 - branches/guffert/driver
View as plain text  
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/driverjwinstead31 Aug