--- sql/mysql/parser3mysql.C 2001/10/02 14:52:10 1.2 +++ sql/mysql/parser3mysql.C 2003/07/24 10:09:40 1.13 @@ -1,13 +1,16 @@ /** @file Parser MySQL driver. - Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com) + Copyright(c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + Author: Alexandr Petrosian (http://paf.design.ru) 2001.07.30 using MySQL 3.23.22b + + 2001.11.06 numrows on "HP-UX istok1 B.11.00 A 9000/869 448594332 two-user license" + 3.23.42 & 4.0.0.alfa never worked, both subst & .sl version returned 0 */ -static const char *RCSId="$Id: parser3mysql.C,v 1.2 2001/10/02 14:52:10 parser Exp $"; +static const char *RCSId="$Id: parser3mysql.C,v 1.13 2003/07/24 10:09:40 paf Exp $"; #include "config_includes.h" @@ -55,7 +58,7 @@ public: /// get api version int api_version() { return SQL_DRIVER_API_VERSION; } /// initialize driver by loading sql dynamic link library - const char *initialize(const char *dlopen_file_spec) { + const char *initialize(char *dlopen_file_spec) { return dlopen_file_spec? dlink(dlopen_file_spec):"client library column is empty"; } @@ -148,18 +151,18 @@ public: return mysql_ping((MYSQL *)connection)==0; } - unsigned int quote( - SQL_Driver_services&, void *connection, - char *to, const char *from, unsigned int length) { + const char* quote( + SQL_Driver_services& services, void *connection, + const char *from, unsigned int length) { /* 3.23.22b You must allocate the to buffer to be at least length*2+1 bytes long. (In the worse case, each character may need to be encoded as using two bytes, and you need room for the terminating null byte.) - - it's already UNTAINT_TIMES_BIGGER */ - return (*mysql_escape_string)(to, from, length); + char *result=(char*)services.malloc_atomic(length*2+1); + mysql_escape_string(result, from, length); + return result; } void query( SQL_Driver_services& services, void *connection, @@ -172,7 +175,7 @@ public: const char *statement; if(offset || limit) { size_t statement_size=strlen(astatement); - char *statement_limited=(char *)services.malloc( + char *statement_limited=(char *)services.malloc_atomic( statement_size+MAX_NUMBER*2+8/* limit #,#*/+1); char *cur=statement_limited; memcpy(cur, astatement, statement_size); cur+=statement_size; @@ -200,35 +203,50 @@ public: mysql_free_result(res); services._throw("result contains no columns"); } + + bool failed=false; + SQL_Error sql_error; +#define CHECK(afailed) \ + if(afailed) { \ + failed=true; \ + goto cleanup; \ + } for(int i=0; iname); - void *ptr=services.malloc(size); - memcpy(ptr, field->name, size); - handlers.add_column(ptr, size); + if(MYSQL_FIELD *field=mysql_fetch_field(res)) { + size_t length=strlen(field->name); + char* str=(char*)services.malloc_atomic(length+1); + memcpy(str, field->name, length+1); + CHECK(handlers.add_column(sql_error, str, length)); + } else { + // seen some broken client, + // which reported "44" for column count of response to "select 2+2" + column_count=i; + break; + } } - handlers.before_rows(); + CHECK(handlers.before_rows(sql_error)); - if(unsigned long row_count=(unsigned long)mysql_num_rows(res)) - for(unsigned long r=0; rrow_count; } - typedef unsigned int (STDCALL *t_mysql_num_fields)(MYSQL_RES *); t_mysql_num_fields mysql_num_fields; static unsigned int STDCALL subst_mysql_num_fields(MYSQL_RES *res) { return res->field_count; } @@ -279,6 +294,8 @@ 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(); lt_dlhandle handle=lt_dlopen(dlopen_file_spec); if (!handle) return "can not open the dynamic link module"; @@ -304,7 +321,6 @@ private: // mysql client library funcs l DLINK(mysql_fetch_lengths); DLINK(mysql_fetch_row); DLINK(mysql_fetch_field); - SLINK(mysql_num_rows); SLINK(mysql_num_fields); SLINK(mysql_field_count); return 0;