Skip to content

Commit

Permalink
Added DISABLE_SSL_DEFAULT connection parameter to disable connecting …
Browse files Browse the repository at this point in the history
…through SSL by default. Added SSL_ENFORCE connection parameter to enforce SSL connection. Added compatibility with MySQL 5.7 headers and libraries
  • Loading branch information
Bogdan Degtyariov committed Nov 5, 2015
1 parent 83955e6 commit e11e67f
Show file tree
Hide file tree
Showing 27 changed files with 488 additions and 389 deletions.
3 changes: 3 additions & 0 deletions ChangeLog
Expand Up @@ -4,6 +4,9 @@
* Keywords specific to MySQL server 5.7 (WL#7992)
* Implement SQL_ATTR_QUERY_TIMEOUT statement attribute (WL#7991)
* Added DEFAULTAUTH and PLUGINDIR options in connection parameters.
* Added DISABLE_SSL_DEFAULT connection parameter to disable
connecting through SSL by default
* Added SSL_ENFORCE connection parameter to enforce SSL connection

Bugs fixed:
* ODBC Driver not parsing comments correctly (Bug# 16613308/53891)
Expand Down
100 changes: 89 additions & 11 deletions MYODBC_MYSQL.h
Expand Up @@ -44,21 +44,99 @@ extern "C"
#endif

#ifdef THREAD
#if MYSQL_VERSION_ID < 50703
#include <my_pthread.h>
#define myodbc_mutex_t pthread_mutex_t
#define myodbc_key_t pthread_key_t
#define myodbc_malloc my_malloc
#define myodbc_realloc my_realloc
#define myodbc_memdup my_memdup
#define myodbc_strdup my_strdup
#define myodbc_init_dynamic_array my_init_dynamic_array
#define myodbc_mutex_lock pthread_mutex_lock
#define myodbc_mutex_unlock pthread_mutex_unlock
#define myodbc_mutex_trylock pthread_mutex_trylock
#define myodbc_mutex_init pthread_mutex_init
#define myodbc_mutex_destroy pthread_mutex_destroy
#define myodbc_allocate_dynamic allocate_dynamic
#define myodbc_snprintf snprintf
#else
# ifdef pthread_mutex_lock
# undef pthread_mutex_lock
# undef pthread_mutex_unlock
# undef pthread_mutex_init
# undef pthread_mutex_destroy
# undef pthread_mutex_trylock
#include <my_thread.h>
#define myodbc_mutex_t native_mutex_t
#define myodbc_key_t native_
#define myodbc_malloc(A,B) my_malloc(PSI_NOT_INSTRUMENTED,A,B)
#define myodbc_realloc(A,B,C) my_realloc(PSI_NOT_INSTRUMENTED,A,B,C)
#define myodbc_memdup(A,B,C) my_memdup(PSI_NOT_INSTRUMENTED,A,B,C)
#define myodbc_strdup(A,B) my_strdup(PSI_NOT_INSTRUMENTED,A,B)
#define myodbc_init_dynamic_array(A,B,C,D) my_init_dynamic_array(A,B,NULL,C,D)
#define myodbc_mutex_lock native_mutex_lock
#define myodbc_mutex_unlock native_mutex_unlock
#define myodbc_mutex_trylock native_mutex_trylock
#define myodbc_mutex_init native_mutex_init
#define myodbc_mutex_destroy native_mutex_destroy
#define sort_dynamic(A,cmp) my_qsort((A)->buffer, (A)->elements, (A)->size_of_element, (cmp))
#define push_dynamic(A,B) insert_dynamic((A),(B))
#define myodbc_snprintf my_snprintf

my_bool inline myodbc_allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements)
{
if (max_elements >= array->max_element)
{
uint size;
uchar *new_ptr;
size = (max_elements + array->alloc_increment) / array->alloc_increment;
size *= array->alloc_increment;
if (array->buffer == (uchar *)(array + 1))
{
/*
In this senerio, the buffer is statically preallocated,
so we have to create an all-new malloc since we overflowed
*/
if (!(new_ptr = (uchar *)myodbc_malloc(size *
array->size_of_element,
MYF(MY_WME))))
return 0;
memcpy(new_ptr, array->buffer,
array->elements * array->size_of_element);
}
else


if (!(new_ptr = (uchar*)myodbc_realloc(array->buffer, size*
array->size_of_element,
MYF(MY_WME | MY_ALLOW_ZERO_PTR))))
return TRUE;
array->buffer = new_ptr;
array->max_element = size;
}
return FALSE;
}

void inline delete_dynamic_element(DYNAMIC_ARRAY *array, uint idx)
{
char *ptr = (char*)array->buffer + array->size_of_element*idx;
array->elements--;
memmove(ptr, ptr + array->size_of_element,
(array->elements - idx)*array->size_of_element);
}


#endif

#else
# ifdef myodbc_mutex_lock
# undef myodbc_mutex_lock
# undef myodbc_mutex_unlock
# undef myodbc_mutex_init
# undef myodbc_mutex_destroy
# undef myodbc_mutex_trylock
# endif
#define pthread_mutex_lock(A)
#define pthread_mutex_unlock(A)
#define pthread_mutex_init(A,B)
#define pthread_mutex_destroy(A)
#define myodbc_mutex_lock(A)
#define myodbc_mutex_unlock(A)
#define myodbc_mutex_init(A,B)
#define myodbc_mutex_destroy(A)
/* EBUSY - 16 */
#define pthread_mutex_trylock(A) (16)
#define myodbc_mutex_trylock(A) (16)
#endif

/* Get rid of defines from my_config.h that conflict with our myconf.h */
Expand Down
2 changes: 1 addition & 1 deletion driver/ansi.c
Expand Up @@ -377,7 +377,7 @@ SQLDriverConnect(SQLHDBC hdbc, SQLHWND hwnd, SQLCHAR *in, SQLSMALLINT in_len,

if (outw_max)
{
outw= (SQLWCHAR *)my_malloc(sizeof(SQLWCHAR) * out_max, MYF(0));
outw= (SQLWCHAR *)myodbc_malloc(sizeof(SQLWCHAR) * out_max, MYF(0));
if (!outw)
{
rc= set_dbc_error((DBC *)hdbc, "HY001", NULL, 0);
Expand Down
92 changes: 46 additions & 46 deletions driver/catalog.c
Expand Up @@ -88,8 +88,8 @@ SQLRETURN
create_fake_resultset(STMT *stmt, MYSQL_ROW rowval, size_t rowsize,
my_ulonglong rowcnt, MYSQL_FIELD *fields, uint fldcnt)
{
stmt->result= (MYSQL_RES*) my_malloc(sizeof(MYSQL_RES), MYF(MY_ZEROFILL));
stmt->result_array= (MYSQL_ROW)my_memdup((char *)rowval, rowsize, MYF(0));
stmt->result= (MYSQL_RES*) myodbc_malloc(sizeof(MYSQL_RES), MYF(MY_ZEROFILL));
stmt->result_array= (MYSQL_ROW)myodbc_memdup((char *)rowval, rowsize, MYF(0));
if (!(stmt->result && stmt->result_array))
{
x_free(stmt->result);
Expand Down Expand Up @@ -156,41 +156,41 @@ static MYSQL_RES *table_status_i_s(STMT *stmt,
char buff[255+4*NAME_CHAR_LEN], *to;
my_bool clause_added= FALSE;

to= strmov(buff, "SELECT TABLE_NAME, TABLE_COMMENT, TABLE_TYPE, TABLE_SCHEMA \
to= my_stpmov(buff, "SELECT TABLE_NAME, TABLE_COMMENT, TABLE_TYPE, TABLE_SCHEMA \
FROM INFORMATION_SCHEMA.TABLES \
WHERE ");

if (catalog_name && *catalog_name)
{
to= strmov(to, "TABLE_SCHEMA LIKE '");
to= my_stpmov(to, "TABLE_SCHEMA LIKE '");
to+= myodbc_escape_string(mysql, to, (ulong)(sizeof(buff) - (to - buff)),
(char *)catalog_name, catalog_len, 1);
to= strmov(to, "' ");
to= my_stpmov(to, "' ");
clause_added= TRUE;
}
else
{
to= strmov(to, "TABLE_SCHEMA = DATABASE() ");
to= my_stpmov(to, "TABLE_SCHEMA = DATABASE() ");
}

if (show_tables)
{
to= strmov(to, "AND ");
to= my_stpmov(to, "AND ");
if (show_views)
to= strmov(to, "( ");
to= strmov(to, "TABLE_TYPE='BASE TABLE' ");
to= my_stpmov(to, "( ");
to= my_stpmov(to, "TABLE_TYPE='BASE TABLE' ");
}

if (show_views)
{
if (show_tables)
to= strmov(to, "OR ");
to= my_stpmov(to, "OR ");
else
to= strmov(to, "AND ");
to= my_stpmov(to, "AND ");

to= strmov(to, "TABLE_TYPE='VIEW' ");
to= my_stpmov(to, "TABLE_TYPE='VIEW' ");
if (show_tables)
to= strmov(to, ") ");
to= my_stpmov(to, ") ");
}

/*
Expand All @@ -203,7 +203,7 @@ static MYSQL_RES *table_status_i_s(STMT *stmt,

if (table_name && *table_name)
{
to= strmov(to, "AND TABLE_NAME LIKE '");
to= my_stpmov(to, "AND TABLE_NAME LIKE '");
if (wildcard)
{
to+= mysql_real_escape_string(mysql, to, (char *)table_name, table_len);
Expand All @@ -213,7 +213,7 @@ static MYSQL_RES *table_status_i_s(STMT *stmt,
to+= myodbc_escape_string(mysql, to, (ulong)(sizeof(buff) - (to - buff)),
(char *)table_name, table_len, 0);
}
to= strmov(to, "'");
to= my_stpmov(to, "'");
}

assert(to - buff < sizeof(buff));
Expand Down Expand Up @@ -283,22 +283,22 @@ int add_name_condition_oa_id(HSTMT hstmt, char ** pos, SQLCHAR * name,

if (metadata_id)
{
*pos= strmov(*pos, "=");
*pos= my_stpmov(*pos, "=");
/* Need also code to remove trailing blanks */
}
else
*pos= strmov(*pos, "= BINARY ");
*pos= my_stpmov(*pos, "= BINARY ");

*pos= strmov(*pos, "'");
*pos= my_stpmov(*pos, "'");
*pos+= mysql_real_escape_string(&stmt->dbc->mysql, *pos, (char *)name, name_len);
*pos= strmov(*pos, "' ");
*pos= my_stpmov(*pos, "' ");
}
else
{
/* According to http://msdn.microsoft.com/en-us/library/ms714579%28VS.85%29.aspx
identifier argument cannot be NULL with one exception not actual for mysql) */
if (!metadata_id && _default)
*pos= strmov(*pos, _default);
*pos= my_stpmov(*pos, _default);
else
return 1;
}
Expand Down Expand Up @@ -327,22 +327,22 @@ int add_name_condition_pv_id(HSTMT hstmt, char ** pos, SQLCHAR * name,

if (metadata_id)
{
*pos= strmov(*pos, "=");
*pos= my_stpmov(*pos, "=");
/* Need also code to remove trailing blanks */
}
else
*pos= strmov(*pos, " LIKE BINARY ");
*pos= my_stpmov(*pos, " LIKE BINARY ");

*pos= strmov(*pos, "'");
*pos= my_stpmov(*pos, "'");
*pos+= mysql_real_escape_string(&stmt->dbc->mysql, *pos, (char *)name, name_len);
*pos= strmov(*pos, "' ");
*pos= my_stpmov(*pos, "' ");
}
else
{
/* According to http://msdn.microsoft.com/en-us/library/ms714579%28VS.85%29.aspx
identifier argument cannot be NULL with one exception not actual for mysql) */
if (!metadata_id && _default)
*pos= strmov(*pos, _default);
*pos= my_stpmov(*pos, _default);
else
return 1;
}
Expand Down Expand Up @@ -563,7 +563,7 @@ SQLRETURN list_table_priv_i_s(SQLHSTMT hstmt,
SQLRETURN rc;

/* Db,User,Table_name,"NULL" as Grantor,Table_priv*/
pos= strmov(buff,
pos= my_stpmov(buff,
"SELECT TABLE_SCHEMA as TABLE_CAT, TABLE_CATALOG as TABLE_SCHEM,"
"TABLE_NAME, NULL as GRANTOR, GRANTEE,"
"PRIVILEGE_TYPE as PRIVILEGE, IS_GRANTABLE "
Expand All @@ -572,11 +572,11 @@ SQLRETURN list_table_priv_i_s(SQLHSTMT hstmt,

add_name_condition_pv_id(hstmt, &pos, table_name, table_len, " LIKE '%'" );

pos= strmov(pos, " AND TABLE_SCHEMA");
pos= my_stpmov(pos, " AND TABLE_SCHEMA");
add_name_condition_oa_id(hstmt, &pos, catalog_name, catalog_len, "=DATABASE()");

/* TABLE_CAT is always NULL in mysql I_S */
pos= strmov(pos, " ORDER BY /*TABLE_CAT,*/ TABLE_SCHEM, TABLE_NAME, PRIVILEGE, GRANTEE");
pos= my_stpmov(pos, " ORDER BY /*TABLE_CAT,*/ TABLE_SCHEM, TABLE_NAME, PRIVILEGE, GRANTEE");

assert(pos - buff < sizeof(buff));

Expand Down Expand Up @@ -644,7 +644,7 @@ static SQLRETURN list_column_priv_i_s(HSTMT * hstmt,
SQLRETURN rc;

/* Db,User,Table_name,"NULL" as Grantor,Table_priv*/
pos= strmov(buff,
pos= my_stpmov(buff,
"SELECT TABLE_SCHEMA as TABLE_CAT, TABLE_CATALOG as TABLE_SCHEM,"
"TABLE_NAME, COLUMN_NAME, NULL as GRANTOR, GRANTEE,"
"PRIVILEGE_TYPE as PRIVILEGE, IS_GRANTABLE "
Expand All @@ -654,16 +654,16 @@ static SQLRETURN list_column_priv_i_s(HSTMT * hstmt,
if(add_name_condition_oa_id(hstmt, &pos, table_name, table_len, NULL))
return set_stmt_error(stmt, "HY009", "Invalid use of NULL pointer(table is required parameter)", 0);

pos= strmov(pos, " AND TABLE_SCHEMA");
pos= my_stpmov(pos, " AND TABLE_SCHEMA");
add_name_condition_oa_id(hstmt, &pos, catalog_name, catalog_len, "=DATABASE()");


pos= strmov(pos, " AND COLUMN_NAME");
pos= my_stpmov(pos, " AND COLUMN_NAME");
add_name_condition_pv_id(hstmt, &pos, column_name, column_len, " LIKE '%'");


/* TABLE_CAT is always NULL in mysql I_S */
pos= strmov(pos, " ORDER BY /*TABLE_CAT,*/ TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, PRIVILEGE");
pos= my_stpmov(pos, " ORDER BY /*TABLE_CAT,*/ TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, PRIVILEGE");

assert(pos - buff < sizeof(buff));

Expand Down Expand Up @@ -911,52 +911,52 @@ SQLRETURN foreign_keys_i_s(SQLHSTMT hstmt,

if (pk_table_name && pk_table_name[0])
{
buff= strmov(buff, "AND A.REFERENCED_TABLE_SCHEMA = ");
buff= my_stpmov(buff, "AND A.REFERENCED_TABLE_SCHEMA = ");
if (pk_catalog_name && pk_catalog_name[0])
{
buff= strmov(buff, "'");
buff= my_stpmov(buff, "'");
buff+= mysql_real_escape_string(mysql, buff, (char *)pk_catalog_name,
pk_catalog_len);
buff= strmov(buff, "' ");
buff= my_stpmov(buff, "' ");
}
else
{
buff= strmov(buff, "DATABASE() ");
buff= my_stpmov(buff, "DATABASE() ");
}

buff= strmov(buff, "AND A.REFERENCED_TABLE_NAME = '");
buff= my_stpmov(buff, "AND A.REFERENCED_TABLE_NAME = '");

buff+= mysql_real_escape_string(mysql, buff, (char *)pk_table_name,
pk_table_len);
buff= strmov(buff, "' ");
buff= my_stpmov(buff, "' ");

strmov(buff, "ORDER BY PKTABLE_CAT, PKTABLE_NAME, "
my_stpmov(buff, "ORDER BY PKTABLE_CAT, PKTABLE_NAME, "
"KEY_SEQ, FKTABLE_NAME");
}

if (fk_table_name && fk_table_name[0])
{
buff= strmov(buff, "AND A.TABLE_SCHEMA = ");
buff= my_stpmov(buff, "AND A.TABLE_SCHEMA = ");

if (fk_catalog_name && fk_catalog_name[0])
{
buff= strmov(buff, "'");
buff= my_stpmov(buff, "'");
buff+= mysql_real_escape_string(mysql, buff, (char *)fk_catalog_name,
fk_catalog_len);
buff= strmov(buff, "' ");
buff= my_stpmov(buff, "' ");
}
else
{
buff= strmov(buff, "DATABASE() ");
buff= my_stpmov(buff, "DATABASE() ");
}

buff= strmov(buff, "AND A.TABLE_NAME = '");
buff= my_stpmov(buff, "AND A.TABLE_NAME = '");

buff+= mysql_real_escape_string(mysql, buff, (char *)fk_table_name,
fk_table_len);
buff= strmov(buff, "' ");
buff= my_stpmov(buff, "' ");

buff= strmov(buff, "ORDER BY FKTABLE_CAT, FKTABLE_NAME, "
buff= my_stpmov(buff, "ORDER BY FKTABLE_CAT, FKTABLE_NAME, "
"KEY_SEQ, PKTABLE_NAME");
}

Expand Down

0 comments on commit e11e67f

Please sign in to comment.