--- sql/mysql/parser3mysql.C 2012/03/16 10:05:04 1.40 +++ sql/mysql/parser3mysql.C 2015/10/26 16:00:50 1.48 @@ -1,7 +1,7 @@ /** @file Parser MySQL driver. - Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) @@ -15,7 +15,7 @@ #include "pa_sql_driver.h" -volatile const char * IDENT_PARSER3MYSQL_C="$Id: parser3mysql.C,v 1.40 2012/03/16 10:05:04 moko Exp $" IDENT_PA_SQL_DRIVER_H; +volatile const char * IDENT_PARSER3MYSQL_C="$Id: parser3mysql.C,v 1.48 2015/10/26 16:00:50 moko Exp $" IDENT_PA_SQL_DRIVER_H; #define NO_CLIENT_LONG_LONG #include "mysql.h" @@ -78,8 +78,10 @@ inline static bool is_column_transcode_r switch(type) { case MYSQL_TYPE_NULL: - case MYSQL_TYPE_DECIMAL: +#ifdef FIELD_TYPE_NEWDECIMAL case MYSQL_TYPE_NEWDECIMAL: +#endif + case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_FLOAT: case MYSQL_TYPE_DOUBLE: @@ -88,7 +90,9 @@ inline static bool is_column_transcode_r case MYSQL_TYPE_LONG: case MYSQL_TYPE_LONGLONG: case MYSQL_TYPE_INT24: +#ifdef FIELD_TYPE_BIT case MYSQL_TYPE_BIT: +#endif case MYSQL_TYPE_DATE: case MYSQL_TYPE_NEWDATE: @@ -131,13 +135,6 @@ public: MySQL_Driver() : SQL_Driver() {} -#ifndef FREEBSD4 - ~MySQL_Driver() { - if(mysql_server_end) - mysql_server_end(); - } -#endif - /// get api version int api_version() { return SQL_DRIVER_API_VERSION; } @@ -150,7 +147,7 @@ public: /** connect @param url format: @b user:pass@host[:port]|[/unix/socket]/database? - charset=value& // transcode by server with command 'SET CHARACTER SET value' + charset=value& // transcode by server with command 'SET NAMES value' ClientCharset=charset& // transcode by parser timeout=3& compress=0& @@ -266,7 +263,7 @@ public: } if(charset){ - char statement[MAX_STRING]="SET CHARACTER SET "; + char statement[MAX_STRING+1]="SET NAMES "; strncat(statement, charset, MAX_STRING); _exec(connection, statement); } @@ -394,9 +391,9 @@ public: memcpy(cur, astatement, statement_size); cur+=statement_size; cur+=sprintf(cur, " LIMIT "); if(offset) - cur+=snprintf(cur, MAX_NUMBER+1, "%u,", offset); + cur+=snprintf(cur, MAX_NUMBER, "%lu,", offset); if(limit!=SQL_NO_LIMIT) - cur+=snprintf(cur, MAX_NUMBER, "%u", limit); + cur+=snprintf(cur, MAX_NUMBER, "%lu", limit); statement=statement_limited; } else statement=astatement; @@ -426,37 +423,42 @@ public: goto cleanup; \ } -#define DO_FETCH_FIELDS(transcode_column_name) { \ - MYSQL_FIELD *fields = mysql_fetch_fields(res); \ - for(size_t i=0; iname_length; \ + const char* str=strdup(services, field->name, length); \ + transcode_column_name \ + CHECK(handlers.add_column(sql_error, str, length)); \ + } else { \ + /* seen broken client, that reported "44" column count for "select 2+2" */ \ + column_count=i; \ + break; \ + } \ + } \ + } + +#define DO_FETCH_ROWS(transcode_cell_value) { \ + while(MYSQL_ROW mysql_row=mysql_fetch_row(res)) { \ + CHECK(handlers.add_row(sql_error)); \ + unsigned long *lengths=mysql_fetch_lengths(res); \ + for(size_t i=0; itype); // transcode column's name from ?ClientCharset to $request:charset services.transcode(str, length, str, length, @@ -544,7 +546,7 @@ private: // mysql client library funcs typedef MYSQL_ROW (STDCALL *t_mysql_fetch_row)(MYSQL_RES *result); t_mysql_fetch_row mysql_fetch_row; - typedef MYSQL_FIELD* (STDCALL *t_mysql_fetch_fields)(MYSQL_RES *result); t_mysql_fetch_fields mysql_fetch_fields; + typedef MYSQL_FIELD* (STDCALL *t_mysql_fetch_field)(MYSQL_RES *result); t_mysql_fetch_field mysql_fetch_field; typedef unsigned int (STDCALL *t_mysql_num_fields)(MYSQL_RES *); t_mysql_num_fields mysql_num_fields; typedef unsigned int (STDCALL *t_mysql_field_count)(MYSQL *); t_mysql_field_count mysql_field_count; @@ -555,8 +557,11 @@ private: // mysql client library funcs private: // mysql client library funcs linking const char *dlink(const char *dlopen_file_spec) { - if(lt_dlinit()) - return lt_dlerror(); + if(lt_dlinit()){ + if(const char* result=lt_dlerror()) + return result; + return "can not prepare to dynamic loading"; + } lt_dlhandle handle=lt_dlopen(dlopen_file_spec); @@ -590,7 +595,7 @@ private: // mysql client library funcs l DLINK(mysql_free_result); DLINK(mysql_fetch_lengths); DLINK(mysql_fetch_row); - DLINK(mysql_fetch_fields); + DLINK(mysql_fetch_field); SLINK(mysql_num_fields); SLINK(mysql_field_count); return 0;