Bug fixes and improvements.
This commit is contained in:
@ -408,7 +408,9 @@ DCB_CALLBACK *cb;
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dcb->protocol && (!DCB_IS_CLONE(dcb)))
|
if (dcb->protocol && (!DCB_IS_CLONE(dcb)))
|
||||||
free(dcb->protocol);
|
free(dcb->protocol);
|
||||||
|
if (dcb->protoname)
|
||||||
|
free(dcb->protoname);
|
||||||
if (dcb->remote)
|
if (dcb->remote)
|
||||||
free(dcb->remote);
|
free(dcb->remote);
|
||||||
if (dcb->user)
|
if (dcb->user)
|
||||||
@ -635,14 +637,31 @@ int rc;
|
|||||||
char *user;
|
char *user;
|
||||||
|
|
||||||
user = session_getUser(session);
|
user = session_getUser(session);
|
||||||
if (NULL != user && strlen(user))
|
if (user && strlen(user))
|
||||||
{
|
{
|
||||||
LOGIF(LD, (skygw_log_write(
|
LOGIF(LD, (skygw_log_write(
|
||||||
LOGFILE_DEBUG,
|
LOGFILE_DEBUG,
|
||||||
"About to attempt to get a persistent connection DCB")));
|
"About to attempt to get a persistent connection DCB")));
|
||||||
dcb = server_get_persistent(server, user);
|
dcb = server_get_persistent(server, user, protocol);
|
||||||
if (NULL != dcb)
|
if (NULL != dcb)
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Link dcb to session. Unlink is called in dcb_final_free
|
||||||
|
*/
|
||||||
|
if (!session_link_dcb(session, dcb))
|
||||||
|
{
|
||||||
|
LOGIF(LD, (skygw_log_write(
|
||||||
|
LOGFILE_DEBUG,
|
||||||
|
"%lu [dcb_connect] Failed to link to session, the "
|
||||||
|
"session has been removed.",
|
||||||
|
pthread_self())));
|
||||||
|
dcb_final_free(dcb);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
dcb->dcb_server_status = server->status;
|
||||||
|
LOGIF(LD, (skygw_log_write(
|
||||||
|
LOGFILE_DEBUG,
|
||||||
|
"Reusing a persistent connection")));
|
||||||
return dcb;
|
return dcb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -666,6 +685,7 @@ char *user;
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
memcpy(&(dcb->func), funcs, sizeof(GWPROTOCOL));
|
memcpy(&(dcb->func), funcs, sizeof(GWPROTOCOL));
|
||||||
|
dcb->protoname = strdup(protocol);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Link dcb to session. Unlink is called in dcb_final_free
|
* Link dcb to session. Unlink is called in dcb_final_free
|
||||||
|
@ -138,7 +138,7 @@ SERVER *ptr;
|
|||||||
* @param user The name of the user needing the connection
|
* @param user The name of the user needing the connection
|
||||||
*/
|
*/
|
||||||
DCB *
|
DCB *
|
||||||
server_get_persistent(SERVER *server, char *user)
|
server_get_persistent(SERVER *server, char *user, char *protocol)
|
||||||
{
|
{
|
||||||
DCB *dcb, *previous;
|
DCB *dcb, *previous;
|
||||||
int rc;
|
int rc;
|
||||||
@ -148,7 +148,7 @@ server_get_persistent(SERVER *server, char *user)
|
|||||||
previous = NULL;
|
previous = NULL;
|
||||||
while (dcb) {
|
while (dcb) {
|
||||||
/* Test for expired, free and remove from list if it is */
|
/* Test for expired, free and remove from list if it is */
|
||||||
if (NULL != dcb->user && 0 == strcmp(dcb->user, user))
|
if (dcb->user && dcb->protoname && 0 == strcmp(dcb->user, user) && 0 == strcmp(dcb->protoname, protocol))
|
||||||
{
|
{
|
||||||
if (NULL == previous)
|
if (NULL == previous)
|
||||||
{
|
{
|
||||||
|
@ -234,6 +234,7 @@ typedef struct dcb {
|
|||||||
char *remote; /**< Address of remote end */
|
char *remote; /**< Address of remote end */
|
||||||
char *user; /**< User name for connection */
|
char *user; /**< User name for connection */
|
||||||
struct sockaddr_in ipv4; /**< remote end IPv4 address */
|
struct sockaddr_in ipv4; /**< remote end IPv4 address */
|
||||||
|
char *protoname; /**< Name of the protocol */
|
||||||
void *protocol; /**< The protocol specific state */
|
void *protocol; /**< The protocol specific state */
|
||||||
struct session *session; /**< The owning session */
|
struct session *session; /**< The owning session */
|
||||||
GWPROTOCOL func; /**< The functions for this descriptor */
|
GWPROTOCOL func; /**< The functions for this descriptor */
|
||||||
|
@ -192,6 +192,6 @@ extern void serverAddParameter(SERVER *, char *, char *);
|
|||||||
extern char *serverGetParameter(SERVER *, char *);
|
extern char *serverGetParameter(SERVER *, char *);
|
||||||
extern void server_update(SERVER *, char *, char *, char *);
|
extern void server_update(SERVER *, char *, char *, char *);
|
||||||
extern void server_set_unique_name(SERVER *, char *);
|
extern void server_set_unique_name(SERVER *, char *);
|
||||||
extern DCB *server_get_persistent(SERVER *, char *);
|
extern DCB *server_get_persistent(SERVER *, char *, char *);
|
||||||
extern RESULTSET *serverGetList();
|
extern RESULTSET *serverGetList();
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user