Merge branch 'develop' into MAX-324
Conflicts: server/include/modutil.h
This commit is contained in:
@ -253,7 +253,9 @@ char* admin_remove_user(
|
||||
/**
|
||||
* Open passwd file and remove user from the file.
|
||||
*/
|
||||
if ((home = getenv("MAXSCALE_HOME")) != NULL && strlen(home) < 1024) {
|
||||
if ((home = getenv("MAXSCALE_HOME")) != NULL &&
|
||||
strnlen(home,PATH_MAX) < PATH_MAX &&
|
||||
strnlen(home,PATH_MAX) > 0) {
|
||||
sprintf(fname, "%s/etc/passwd", home);
|
||||
sprintf(fname_tmp, "%s/etc/passwd_tmp", home);
|
||||
} else {
|
||||
|
||||
@ -558,7 +558,7 @@ GWBUF* modutil_get_complete_packets(GWBUF** p_readbuf)
|
||||
* @return Number of EOF packets
|
||||
*/
|
||||
int
|
||||
modutil_count_signal_packets(GWBUF *reply, int use_ok, int n_found)
|
||||
modutil_count_signal_packets(GWBUF *reply, int use_ok, int n_found, int* more)
|
||||
{
|
||||
unsigned char* ptr = (unsigned char*) reply->start;
|
||||
unsigned char* end = (unsigned char*) reply->end;
|
||||
@ -566,6 +566,7 @@ modutil_count_signal_packets(GWBUF *reply, int use_ok, int n_found)
|
||||
int pktlen, eof = 0, err = 0;
|
||||
int errlen = 0, eoflen = 0;
|
||||
int iserr = 0, iseof = 0;
|
||||
bool moreresults = false;
|
||||
while(ptr < end)
|
||||
{
|
||||
|
||||
@ -585,8 +586,9 @@ modutil_count_signal_packets(GWBUF *reply, int use_ok, int n_found)
|
||||
}
|
||||
}
|
||||
|
||||
if((ptr + pktlen) > end)
|
||||
if((ptr + pktlen) > end || (eof + n_found) >= 2)
|
||||
{
|
||||
moreresults = PTR_EOF_MORE_RESULTS(ptr);
|
||||
ptr = prev;
|
||||
break;
|
||||
}
|
||||
@ -616,6 +618,8 @@ modutil_count_signal_packets(GWBUF *reply, int use_ok, int n_found)
|
||||
}
|
||||
}
|
||||
|
||||
*more = moreresults;
|
||||
|
||||
return(eof + err);
|
||||
}
|
||||
|
||||
@ -693,3 +697,97 @@ static void modutil_reply_routing_error(
|
||||
poll_add_epollin_event_to_dcb(backend_dcb, buf);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the first occurrence of a character in a string. This function ignores
|
||||
* escaped characters and all characters that are enclosed in single or double quotes.
|
||||
* @param ptr Pointer to area of memory to inspect
|
||||
* @param c Character to search for
|
||||
* @param len Size of the memory area
|
||||
* @return Pointer to the first non-escaped, non-quoted occurrence of the character.
|
||||
* If the character is not found, NULL is returned.
|
||||
*/
|
||||
void* strnchr_esc(char* ptr,char c, int len)
|
||||
{
|
||||
char* p = (char*)ptr;
|
||||
char* start = p;
|
||||
bool quoted = false, escaped = false;
|
||||
char qc;
|
||||
|
||||
while(p < start + len)
|
||||
{
|
||||
if(escaped)
|
||||
{
|
||||
escaped = false;
|
||||
}
|
||||
else if(*p == '\\')
|
||||
{
|
||||
escaped = true;
|
||||
}
|
||||
else if((*p == '\'' || *p == '"') && !quoted)
|
||||
{
|
||||
quoted = true;
|
||||
qc = *p;
|
||||
}
|
||||
else if(quoted && *p == qc)
|
||||
{
|
||||
quoted = false;
|
||||
}
|
||||
else if(*p == c && !escaped && !quoted)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a COM_QUERY packet from a string.
|
||||
* @param query Query to create.
|
||||
* @return Pointer to GWBUF with the query or NULL if an error occurred.
|
||||
*/
|
||||
GWBUF* modutil_create_query(char* query)
|
||||
{
|
||||
if(query == NULL)
|
||||
return NULL;
|
||||
|
||||
GWBUF* rval = gwbuf_alloc(strlen(query) + 5);
|
||||
int pktlen = strlen(query) + 1;
|
||||
unsigned char* ptr;
|
||||
|
||||
if(rval)
|
||||
{
|
||||
ptr = (unsigned char*)rval->start;
|
||||
*ptr++ = (pktlen);
|
||||
*ptr++ = (pktlen)>>8;
|
||||
*ptr++ = (pktlen)>>16;
|
||||
*ptr++ = 0x0;
|
||||
*ptr++ = 0x03;
|
||||
memcpy(ptr,query,strlen(query));
|
||||
gwbuf_set_type(rval,GWBUF_TYPE_MYSQL);
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the number of statements in a query.
|
||||
* @param buffer Buffer to analyze.
|
||||
* @return Number of statements.
|
||||
*/
|
||||
int modutil_count_statements(GWBUF* buffer)
|
||||
{
|
||||
char* ptr = ((char*)(buffer)->start + 5);
|
||||
char* end = ((char*)(buffer)->end);
|
||||
int num = 1;
|
||||
|
||||
while((ptr = strnchr_esc(ptr,';', end - ptr)))
|
||||
{
|
||||
num++;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return num;
|
||||
}
|
||||
@ -73,18 +73,19 @@ resultset_free(RESULTSET *resultset)
|
||||
{
|
||||
RESULT_COLUMN *col;
|
||||
|
||||
if (resultset)
|
||||
return;
|
||||
col = resultset->column;
|
||||
while (col)
|
||||
if (resultset != NULL)
|
||||
{
|
||||
RESULT_COLUMN *next;
|
||||
col = resultset->column;
|
||||
while (col)
|
||||
{
|
||||
RESULT_COLUMN *next;
|
||||
|
||||
next = col->next;
|
||||
resultset_column_free(col);
|
||||
col = next;
|
||||
}
|
||||
free(resultset);
|
||||
}
|
||||
free(resultset);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -42,6 +42,7 @@ static bool success = false;
|
||||
int hup(DCB* dcb)
|
||||
{
|
||||
success = true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -108,7 +109,8 @@ hkinit();
|
||||
skygw_log_sync_all();
|
||||
ss_info_dassert(0 != result, "Stop should succeed");
|
||||
|
||||
dcb = dcb_alloc(DCB_ROLE_REQUEST_HANDLER);
|
||||
if((dcb = dcb_alloc(DCB_ROLE_REQUEST_HANDLER)) == NULL)
|
||||
return 1;
|
||||
ss_info_dassert(dcb != NULL, "DCB allocation failed");
|
||||
|
||||
session = session_alloc(service,dcb);
|
||||
|
||||
Reference in New Issue
Block a user