--- sql/mysql/parser3mysql.C 2001/09/21 15:40:55 1.1 +++ sql/mysql/parser3mysql.C 2001/11/08 10:21:23 1.3 @@ -6,8 +6,11 @@ Author: Alexander Petrosyan (http://design.ru/paf) 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.1 2001/09/21 15:40:55 parser Exp $"; +static const char *RCSId="$Id: parser3mysql.C,v 1.3 2001/11/08 10:21:23 paf Exp $"; #include "config_includes.h" @@ -22,6 +25,7 @@ static const char *RCSId="$Id: parser3my #if _MSC_VER # define snprintf _snprintf +# define strcasecmp _stricmp #endif static char *lsplit(char *string, char delim) { @@ -35,6 +39,13 @@ static char *lsplit(char *string, char d return 0; } +static char *lsplit(char **string_ref, char delim) { + char *result=*string_ref; + char *next=lsplit(*string_ref, delim); + *string_ref=next; + return result; +} + /** MySQL server driver */ @@ -53,7 +64,11 @@ public: } /** connect @param used_only_in_connect_url - format: @b user:pass@host[:port]|[/unix/socket]/database/charset + format: @b user:pass@host[:port]|[/unix/socket]/database? + charset=cp1251_koi8& + timeout=3& + compress=1& + named_pipe=1 3.23.22b Currently the only option for @b character_set_name is cp1251_koi8. WARNING: must be used only to connect, for buffer doesn't live long @@ -78,14 +93,43 @@ public: char *error_pos=0; char *port_cstr=lsplit(host, ':'); int port=port_cstr?strtol(port_cstr, &error_pos, 0):0; - char *charset=lsplit(db, '/'); + char *options=lsplit(db, '?'); + + char *charset=0; MYSQL *mysql=mysql_init(NULL); + + while(options) { + if(char *key=lsplit(&options, '&')) { + if(*key) { + if(char *value=lsplit(key, '=')) { + if(strcasecmp(key, "charset")==0) { + charset=value; + } else if(strcasecmp(key, "timeout")==0) { + unsigned int timeout=(unsigned int)atoi(value); + if(mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout)!=0) + services._throw(mysql_error(mysql)); + } else if(strcasecmp(key, "compress")==0) { + if(atoi(value)) + if(mysql_options(mysql, MYSQL_OPT_COMPRESS, 0)!=0) + services._throw(mysql_error(mysql)); + } else if(strcasecmp(key, "named_pipe")==0) { + if(atoi(value)) + if(mysql_options(mysql, MYSQL_OPT_NAMED_PIPE , 0)!=0) + services._throw(mysql_error(mysql)); + } else + services._throw("unknown connect option" /*key*/); + } else + services._throw("connect option without =value" /*key*/); + } + } + } + if(!mysql_real_connect(mysql, host, user, pwd, db, port?port:MYSQL_PORT, unix_socket, 0)) services._throw(mysql_error(mysql)); - if(charset) { + if(charset) { // set charset char statement[MAX_STRING]="set CHARACTER SET "; // cp1251_koi8 strncat(statement, charset, MAX_STRING); @@ -170,22 +214,20 @@ public: handlers.before_rows(); - 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; } @@ -249,6 +290,7 @@ private: // mysql client library funcs l #define SLINK(name) DSLINK(name, name=subst_##name) DLINK(mysql_init); + DLINK(mysql_options); DLINK(mysql_store_result); DLINK(mysql_query); SLINK(mysql_error); @@ -260,7 +302,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;