diff --git a/src/modules/Mysql/mysql.c b/src/modules/Mysql/mysql.c index ce3e34d43a734e51fc261a47d5086aa5437d633f..704c629765cb81e12a9a448f8432d3775f6cc6c7 100644 --- a/src/modules/Mysql/mysql.c +++ b/src/modules/Mysql/mysql.c @@ -1,5 +1,5 @@ /* - * $Id: mysql.c,v 1.10 1997/11/05 20:06:01 hedda Exp $ + * $Id: mysql.c,v 1.11 1998/01/24 23:09:46 grubba Exp $ * * SQL database functionality for Pike * @@ -73,10 +73,19 @@ typedef struct dynamic_buffer_s dynamic_buffer; * Globals */ -RCSID("$Id: mysql.c,v 1.10 1997/11/05 20:06:01 hedda Exp $"); +RCSID("$Id: mysql.c,v 1.11 1998/01/24 23:09:46 grubba Exp $"); struct program *mysql_program = NULL; +#ifdef HAVE_MYSQL_PORT +static MUTEX_T stupid_port_lock; +extern unsigned int mysql_port; +#define STUPID_PORT_INIT() mt_init(&stupid_port_lock) +#define STUPID_PORT_LOCK() mt_lock(&stupid_port_lock) +#define STUPID_PORT_UNLOCK() mt_unlock(&stupid_port_lock) +#define STUPID_PORT_DESTROY() mt_destroy(&stupid_port_lock) +#endif /* HAVE_MYSQL_PORT */ + /* * Functions */ @@ -136,9 +145,20 @@ static void pike_mysql_reconnect(void) char *database = NULL; char *user = NULL; char *password = NULL; + char *portptr = NULL; + unsigned int port = 0; + unsigned int saved_port = 0; if (PIKE_MYSQL->host) { - host = PIKE_MYSQL->host->str; + host = strdup(PIKE_MYSQL->host->str); + if (!host) { + error("Mysql.mysql(): Out of memory!\n"); + } + if ((portptr = strchr(host, ':')) && (*portptr == ':')) { + *portptr = 0; + portptr++; + port = (unsigned int) atoi(portptr); + } } if (PIKE_MYSQL->database) { database = PIKE_MYSQL->database->str; @@ -155,15 +175,37 @@ static void pike_mysql_reconnect(void) THREADS_ALLOW(); +#ifdef HAVE_MYSQL_PORT + STUPID_PORT_LOCK(); +#endif /* HAVE_MYSQL_PORT */ + if (socket) { /* Disconnect the old connection */ mysql_close(socket); } +#ifdef HAVE_MYSQL_PORT + if (port) { + saved_port = mysql_port; + mysql_port = port; + } +#endif /* HAVE_MYSQL_PORT */ + socket = mysql_connect(mysql, host, user, password); +#ifdef HAVE_MYSQL_PORT + mysql_port = saved_port; + + STUPID_PORT_UNLOCK(); +#endif /* HAVE_MYSQL_PORT */ + THREADS_DISALLOW(); + if (host) { + /* No longer needed */ + free(host); + } + if (!(PIKE_MYSQL->socket = socket)) { error("Mysql.mysql(): Couldn't reconnect to SQL-server\n"); } @@ -916,6 +958,10 @@ void pike_module_init(void) mysql_program = end_program(); add_program_constant("mysql", mysql_program, 0); +#ifdef HAVE_MYSQL_PORT + STUPID_PORT_INIT(); +#endif /* HAVE_MYSQL_PORT */ + init_mysql_res_programs(); #endif /* HAVE_MYSQL */ } @@ -925,6 +971,10 @@ void pike_module_exit(void) #ifdef HAVE_MYSQL exit_mysql_res(); +#ifdef HAVE_MYSQL_PORT + STUPID_PORT_DESTROY(); +#endif /* HAVE_MYSQL_PORT */ + if (mysql_program) { free_program(mysql_program); mysql_program = NULL;