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 Contribution | IMAP) | 1 Sep |