--- parser3/src/sql/mysql/Attic/parser3mysql.C 2001/05/17 13:23:28 1.18 +++ parser3/src/sql/mysql/Attic/parser3mysql.C 2001/07/23 13:59:52 1.26 @@ -4,9 +4,8 @@ Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - - $Id: parser3mysql.C,v 1.18 2001/05/17 13:23:28 parser Exp $ */ +static const char *RCSId="$Id: parser3mysql.C,v 1.26 2001/07/23 13:59:52 parser Exp $"; #include "config_includes.h" @@ -47,11 +46,12 @@ public: int api_version() { return SQL_DRIVER_API_VERSION; } /// initialize driver by loading sql dynamic link library const char *initialize(const char *dlopen_file_spec) { - return dlink(dlopen_file_spec); + return dlopen_file_spec? + dlink(dlopen_file_spec):"client library column is empty"; } /** connect @param used_only_in_connect_url - format: @b user:pass@host[:port]/database/charset + format: @b user:pass@host[:port]|[/unix/socket]/database/charset 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 @@ -62,8 +62,16 @@ public: void **connection ///< output: MYSQL * ) { char *user=used_only_in_connect_url; - char *host=lsplit(user, '@'); - char *db=lsplit(host, '/'); + char *s=lsplit(user, '@'); + char *host=0; + char *unix_socket=0; + if(s && s[0]=='[') { // unix socket + unix_socket=1+s; + s=lsplit(unix_socket, ']'); + } else { // IP + host=s; + } + char *db=lsplit(s, '/'); char *pwd=lsplit(user, ':'); char *error_pos=0; char *port_cstr=lsplit(host, ':'); @@ -72,7 +80,7 @@ public: MYSQL *mysql=mysql_init(NULL); if(!mysql_real_connect(mysql, - host, user, pwd, db, port?port:MYSQL_PORT, NULL, 0)) + host, user, pwd, db, port?port:MYSQL_PORT, unix_socket, 0)) services._throw(mysql_error(mysql)); if(charset) { @@ -113,8 +121,7 @@ public: void query( SQL_Driver_services& services, void *connection, const char *astatement, unsigned long offset, unsigned long limit, - unsigned int *column_count, Cell **columns, - unsigned long *row_count, Cell ***rows) { + SQL_Driver_query_event_handlers& handlers) { MYSQL *mysql=(MYSQL *)connection; MYSQL_RES *res=NULL; @@ -139,43 +146,43 @@ public: services._throw(mysql_error(mysql)); if(!(res=mysql_store_result(mysql)) && mysql_field_count(mysql)) services._throw(mysql_error(mysql)); - if(!res) { - // empty result - *row_count=0; - *column_count=0; + if(!res) // empty result: insert|delete|update|... return; - } - *column_count=mysql_num_fields(res); - if(!*column_count) // old client - *column_count=mysql_field_count(mysql); + int column_count=mysql_num_fields(res); + if(!column_count) // old client + column_count=mysql_field_count(mysql); - *columns=(Cell *)services.malloc(sizeof(Cell)*(*column_count)); + if(!column_count) + services._throw("result contains no columns"); - *row_count=(unsigned long)mysql_num_rows(res); - *rows=(Cell **)services.malloc(sizeof(Cell *)*(*row_count)); - - for(unsigned int i=0; i<(*column_count); i++){ + for(int i=0; iname); - (*columns)[i].size=size; - (*columns)[i].ptr=services.malloc(size); - memcpy((*columns)[i].ptr, field->name, size); + void *ptr=services.malloc(size); + memcpy(ptr, field->name, size); + handlers.add_column(ptr, size); } + + handlers.before_rows(); - for(unsigned long r=0; r<(*row_count); r++) - if(MYSQL_ROW mysql_row=mysql_fetch_row(res)) { // never false.. - unsigned long *lengths=mysql_fetch_lengths(res); - Cell *row=(Cell *)malloc(sizeof(Cell)*(*column_count)); - (*rows)[r]=row; - for(unsigned int i=0; i<(*column_count); i++){ - size_t size=(size_t)lengths[i]; - row[i].size=size; - row[i].ptr=services.malloc(size); - memcpy(row[i].ptr, mysql_row[i], size); + if(unsigned long row_count=(unsigned long)mysql_num_rows(res)) + for(unsigned long r=0; r