List:Internals« Previous MessageNext Message »
From:yuriy@ellat.lv (IMAP) Date:September 1 2008 12:08pm
Subject:MySQL Connector/ODBC Code Contribution
View as plain text  
Hello, Community!

This is my first post. The problem is described here - 
http://forums.mysql.com/read.php?37,221196,221196#msg-221196
The patch was posted in that thread, but I will re-send it in this 
mailing-list

Hope this will help to improve the product
Good luck!

diff -Naur a/driver/desc.c b/driver/desc.c
--- a/driver/desc.c	Tue Apr 15 04:03:36 2008
+++ b/driver/desc.c	Tue Aug 05 16:40:33 2008
@@ -354,21 +354,21 @@
   HDR_FLD(rows_processed_ptr, P_RI|P_WI          , SQL_IS_POINTER );
 
   REC_FLD(auto_unique_value, PR_RIR                     , SQL_IS_INTEGER);
-  REC_FLD(base_column_name , PR_RIR                     , SQL_IS_POINTER);
-  REC_FLD(base_table_name  , PR_RIR                     , SQL_IS_POINTER);
+  REC_FLD(base_column_name , PR_RIR                     , SQL_IS_NTS);
+  REC_FLD(base_table_name  , PR_RIR                     , SQL_IS_NTS);
   REC_FLD(case_sensitive   , PR_RIR|PR_RIP              , SQL_IS_INTEGER);
-  REC_FLD(catalog_name     , PR_RIR                     , SQL_IS_POINTER);
+  REC_FLD(catalog_name     , PR_RIR                     , SQL_IS_NTS);
   REC_FLD(concise_type     , PR_WAR|PR_WAP|PR_RIR|PR_WIP, SQL_IS_SMALLINT);
   REC_FLD(data_ptr         , PR_WAR|PR_WAP              , SQL_IS_POINTER);
   REC_FLD(display_size     , PR_RIR                     , SQL_IS_LEN);
   REC_FLD(fixed_prec_scale , PR_RIR|PR_RIP              , SQL_IS_SMALLINT);
   REC_FLD(indicator_ptr    , PR_WAR|PR_WAP              , SQL_IS_POINTER);
-  REC_FLD(label            , PR_RIR                     , SQL_IS_POINTER);
+  REC_FLD(label            , PR_RIR                     , SQL_IS_NTS);
   REC_FLD(length           , PR_WAR|PR_WAP|PR_RIR|PR_WIP, SQL_IS_ULEN);
-  REC_FLD(literal_prefix   , PR_RIR                     , SQL_IS_POINTER);
-  REC_FLD(literal_suffix   , PR_RIR                     , SQL_IS_POINTER);
-  REC_FLD(local_type_name  , PR_RIR|PR_RIP              , SQL_IS_POINTER);
-  REC_FLD(name             , PR_RIR|PR_WIP              , SQL_IS_POINTER);
+  REC_FLD(literal_prefix   , PR_RIR                     , SQL_IS_NTS);
+  REC_FLD(literal_suffix   , PR_RIR                     , SQL_IS_NTS);
+  REC_FLD(local_type_name  , PR_RIR|PR_RIP              , SQL_IS_NTS);
+  REC_FLD(name             , PR_RIR|PR_WIP              , SQL_IS_NTS);
   REC_FLD(nullable         , PR_RIR|PR_RIP              , SQL_IS_SMALLINT);
   REC_FLD(num_prec_radix   , PR_WAR|PR_WAP|PR_RIR|PR_WIP, SQL_IS_INTEGER);
   REC_FLD(octet_length     , PR_WAR|PR_WAP|PR_RIR|PR_WIP, SQL_IS_LEN);
@@ -377,11 +377,11 @@
   REC_FLD(precision        , PR_WAR|PR_WAP|PR_RIR|PR_WIP, SQL_IS_SMALLINT);
   REC_FLD(rowver           , PR_RIR|PR_RIP              , SQL_IS_SMALLINT);
   REC_FLD(scale            , PR_WAR|PR_WAP|PR_RIR|PR_WIP, SQL_IS_SMALLINT);
-  REC_FLD(schema_name      , PR_RIR                     , SQL_IS_POINTER);
+  REC_FLD(schema_name      , PR_RIR                     , SQL_IS_NTS);
   REC_FLD(searchable       , PR_RIR                     , SQL_IS_SMALLINT);
-  REC_FLD(table_name       , PR_RIR                     , SQL_IS_POINTER);
+  REC_FLD(table_name       , PR_RIR                     , SQL_IS_NTS);
   REC_FLD(type             , PR_WAR|PR_WAP|PR_RIR|PR_WIP, SQL_IS_SMALLINT);
-  REC_FLD(type_name        , PR_RIR|PR_RIP              , SQL_IS_POINTER);
+  REC_FLD(type_name        , PR_RIR|PR_RIP              , SQL_IS_NTS);
   REC_FLD(unnamed          , PR_RIR|PR_WIP              , SQL_IS_SMALLINT);
   REC_FLD(is_unsigned      , PR_RIR|PR_RIP              , SQL_IS_SMALLINT);
   REC_FLD(updatable        , PR_RIR                     , SQL_IS_SMALLINT);
@@ -491,6 +491,7 @@
   DESC *desc= (DESC *)hdesc;
   void *src_struct;
   void *src;
+  SQLINTEGER length;
 
   CLEAR_DESC_ERROR(desc);
 
@@ -650,8 +651,26 @@
     break;
 
   default:
-    /* TODO it's an actual data length */
-    /* free/malloc to the field and copy it, etc, etc */
+    if( SQL_IS_NTS == fld->data_type ) {
+      /* set up length of the output data */
+      length = ( SQLINTEGER )strlen( *( SQLCHAR ** )src );
+      if( NULL != outlen ) {
+        *outlen = length;
+      }
+      /* check the length of the input buffer */
+      if( length >= buflen ) {
+        return set_desc_error(desc, "HY090",
+                              "Invalid string or buffer length",
+                              MYERR_S1090);
+      }
+      /* copy the string to the output */
+      memcpy( valptr, *( SQLCHAR ** )src, sizeof( SQLCHAR ) * ( length + 1 ) );
+    } else {
+      /* invalid parameter was supplied */
+      return set_desc_error(desc, "HY015",
+                            "Invalid parameter type",
+                            MYERR_S1015);
+    }
     break;
   }
 
diff -Naur a/driver/driver.h b/driver/driver.h
--- a/driver/driver.h	Tue Mar 18 02:16:10 2008
+++ b/driver/driver.h	Tue Aug 05 14:13:11 2008
@@ -197,6 +197,7 @@
 /* additional field types needed, but not defined in ODBC */
 #define SQL_IS_ULEN (-9)
 #define SQL_IS_LEN (-10)
+#define SQL_IS_NTS (-11)
 
 /* check if ARD record is a bound column */
 #define ARD_IS_BOUND(d) ((d)->data_ptr || (d)->octet_length_ptr)
Thread
MySQL Connector/ODBC Code ContributionIMAP)1 Sep