=== modified file 'driver/connect.c' --- driver/connect.c 2009-11-16 18:15:39 +0000 +++ driver/connect.c 2009-12-02 10:03:59 +0000 @@ -122,6 +122,9 @@ if (odbc_stmt(dbc, "SET character_set_results = NULL") != SQL_SUCCESS) return SQL_ERROR; + if (get_server_variables(dbc) != SQL_SUCCESS) + return SQL_ERROR; + return SQL_SUCCESS; } === modified file 'driver/driver.h' --- driver/driver.h 2009-10-07 20:43:23 +0000 +++ driver/driver.h 2009-12-02 08:57:56 +0000 @@ -333,6 +333,7 @@ uint port; uint cursor_count; uint commit_flag; + uint no_backslash_escapes_flag; #ifdef THREAD pthread_mutex_t lock; #endif === modified file 'driver/execute.c' --- driver/execute.c 2009-10-07 20:43:23 +0000 +++ driver/execute.c 2009-12-02 10:10:59 +0000 @@ -508,13 +508,23 @@ to= add_to_buffer(net, to, data, length); goto out; } - /* else treat as a string */ + /* else _binary introducer for binary data */ + case SQL_BINARY: + case SQL_VARBINARY: + case SQL_LONGVARBINARY: + { + if (dbc->cxn_charset_info->number != + dbc->ansi_charset_info->number) + { + to= add_to_buffer(net, to, "_binary", 7); + } + /* We have only added the introducer, data is added below. */ + break; + } + /* else treat as a string */ case SQL_CHAR: case SQL_VARCHAR: case SQL_LONGVARCHAR: - case SQL_BINARY: - case SQL_VARBINARY: - case SQL_LONGVARBINARY: case SQL_WCHAR: case SQL_WVARCHAR: case SQL_WLONGVARCHAR: @@ -588,12 +598,31 @@ } } - to= add_to_buffer(net,to,"'",1); - /* Make sure we have room for a fully-escaped string. */ - if (!(to= extend_buffer(net, to, length * 2))) - return 0; - to+= mysql_real_escape_string(&dbc->mysql, to, data, length); - to= add_to_buffer(net, to, "'", 1); + /* Convert binary data to hex sequence */ + if(stmt->dbc->no_backslash_escapes_flag && + (iprec->concise_type == SQL_BINARY || + iprec->concise_type == SQL_VARBINARY || + iprec->concise_type == SQL_LONGVARBINARY)) + { + SQLINTEGER transformed_len = 0; + to= add_to_buffer(net,to," 0x",3); + /* Make sure we have room for a fully-escaped string. */ + if (!(to= extend_buffer(net, to, length * 2))) + return 0; + + copy_binhex_result(stmt, to, length * 2 + 1, &transformed_len, 0, data, length); + to += transformed_len; + } + else + { + to= add_to_buffer(net,to,"'",1); + /* Make sure we have room for a fully-escaped string. */ + if (!(to= extend_buffer(net, to, length * 2))) + return 0; + + to+= mysql_real_escape_string(&dbc->mysql, to, data, length); + to= add_to_buffer(net, to, "'", 1); + } out: if (free_data) === modified file 'driver/utility.c' --- driver/utility.c 2009-11-17 19:14:58 +0000 +++ driver/utility.c 2009-12-02 12:01:56 +0000 @@ -2706,3 +2706,35 @@ return ptr ? ((SQLCHAR *) ptr) + offset : NULL; } + +/** + Get server variables +*/ +int get_server_variables(DBC *dbc) +{ + MYSQL *mysql= &dbc->mysql; + MYSQL_RES *result; + MYSQL_ROW row; + + pthread_mutex_lock(&dbc->lock); + if (mysql_query(mysql, "SHOW VARIABLES") || + !(result= mysql_store_result(mysql))) + { + pthread_mutex_unlock(&dbc->lock); + return SQL_ERROR; + } + pthread_mutex_unlock(&dbc->lock); + while ((row= mysql_fetch_row(result))) + { + /* + TODO: implement enum for sql_mode and struct for server variables. + Now are only interested in checking NO_BACKSLASH_ESCAPES mode. + */ + if(!strcmp(row[0], "sql_mode")) + { + dbc->no_backslash_escapes_flag= (strstr(row[1], "NO_BACKSLASH_ESCAPES") != NULL); + } + } + + return SQL_SUCCESS; +}