--- parser3/src/sql/mysql/Attic/parser3mysql.C 2001/04/04 11:47:30 1.2 +++ parser3/src/sql/mysql/Attic/parser3mysql.C 2001/04/05 08:09:26 1.6 @@ -5,39 +5,74 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: parser3mysql.C,v 1.2 2001/04/04 11:47:30 paf Exp $ + $Id: parser3mysql.C,v 1.6 2001/04/05 08:09:26 paf Exp $ */ -#include "pa_sql_driver.h" +#include +#include "pa_sql_driver.h" +#include "mysql.h" +#include "pa_common.h" -/// MySQL server driver +char *lsplit(char *string, char delim) { + if(string) { + char *v=strchr(string, delim); + if(v) { + *v=0; + return v+1; + } + } + return 0; +} + +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 + + @todo + figure out about memory for errors: + - static=add multithread locks + - dynamic=who should free it up? +*/ class MySQL_Driver : public SQL_Driver { public: - MySQL_Driver() : SQL_Driver() {} + MySQL_Driver() : SQL_Driver() { + } /// get api version - int api_version() { return SQL_API_VERSION; } - /// connect @test move info inside - bool connect(const char *url, void **info, const char **error) { - /**error="mysql connect failed"; - return false;*/ - *info=0; - return true; - } - bool disconnect(void *info, const char **error) { - *error="mysql disconnect failed"; - return false; - } - bool commit(void *info, const char **error) { - *error="mysql commit failed"; - return false; + int api_version() { return SQL_DRIVER_API_VERSION; } + /// connect + void connect( + char *url, ///< @b user:pass@host[:port]/database + void **connection ///< output: MYSQL * + ) { + char *user=url; + char *host=lsplit(user, '@'); + char *db=lsplit(host, '/'); + char *pwd=lsplit(user, ':'); + char *error_pos=0; + char *port_cstr=lsplit(host, ':'); + int port=port_cstr?strtol(port_cstr, &error_pos, 0):0; + + MYSQL *mysql=mysql_init(NULL); + if(!mysql_real_connect(mysql, + host, user, pwd, db, port?port:MYSQL_PORT, NULL, 0)) + fservices->_throw(mysql_error(mysql)); + + *(MYSQL **)connection=mysql; } - bool rollback(void *info, const char **error) { - *error="mysql rollback failed"; - return false; + void disconnect(void *connection) { + mysql_close((MYSQL *)connection); } + void commit(void *connection) {} + void rollback(void *connection) {} }; extern "C" SQL_Driver *create() {