pull/95/head
René Cannaò 12 years ago
parent d34e202fe4
commit f0579b33ce

@ -64,6 +64,25 @@ static t_symstruct lookuptable[] = {
#define NKEYS (sizeof(lookuptable)/sizeof(t_symstruct))
int remove_spaces(const char *s) {
char *inp = (char *)s, *outp = (char *)s;
bool prev_space = false;
while (*inp) {
if (isspace(*inp)) {
if (!prev_space) {
*outp++ = ' ';
prev_space = true;
}
} else {
*outp++ = *inp;
prev_space = 0;
}
++inp;
}
*outp = '\0';
return strlen(s);
}
static uint32_t keyfromhash(uint32_t hash) {
uint32_t i;
for (i=0; i < NKEYS; i++) {
@ -153,16 +172,59 @@ void admin_session_handler(MySQL_Session *sess, ProxySQL_Admin *pa, PtrSize_t *p
char *error=NULL;
int cols;
int affected_rows;
bool run_query=true;
SQLite3_result *resultset=NULL;
char *strA=NULL;
char *strB=NULL;
int strAl, strBl;
//char *query=(char *)"SELECT 1, 2, 3";
char *query=NULL;
query=(char *)l_alloc(pkt->size-sizeof(mysql_hdr));
memcpy(query,(char *)pkt->ptr+sizeof(mysql_hdr)+1,pkt->size-sizeof(mysql_hdr)-1);
query[pkt->size-sizeof(mysql_hdr)-1]=0;
Standard_ProxySQL_Admin *SPA=(Standard_ProxySQL_Admin *)pa;
SPA->admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset);
SPA->SQLite3_to_MySQL(resultset, error, affected_rows, &sess->myprot_client);
l_free(pkt->size,query);
unsigned int query_length=pkt->size-sizeof(mysql_hdr);
query=(char *)l_alloc(query_length);
memcpy(query,(char *)pkt->ptr+sizeof(mysql_hdr)+1,query_length-1);
query[query_length-1]=0;
char *query_no_space=(char *)l_alloc(query_length);
memcpy(query_no_space,query,query_length);
unsigned int query_no_space_length=remove_spaces(query_no_space);
//fprintf(stderr,"%s----\n",query_no_space);
if (query_no_space_length==strlen("SHOW TABLES") && !strncasecmp("SHOW TABLES",query_no_space, query_no_space_length)) {
l_free(query_length,query);
query=l_strdup("SELECT name AS tables FROM sqlite_master WHERE type='table'");
query_length=strlen(query)+1;
goto __run_query;
}
strA=(char *)"SHOW CREATE TABLE ";
strB=(char *)"SELECT name AS 'table' , sql AS 'Create Table' FROM sqlite_master WHERE type='table' AND name='%s'";
strAl=strlen(strA);
if (strncasecmp("SHOW CREATE TABLE ", query_no_space, strAl)==0) {
strBl=strlen(strB);
int tblnamelen=query_no_space_length-strAl;
int l=strBl+tblnamelen-2;
char *buff=(char *)l_alloc(l+1);
snprintf(buff,l,strB,query_no_space+strAl);
buff[l-1]='\'';
buff[l]=0;
l_free(query_length,query);
query=buff;
//fprintf(stderr,"%s----\n",query);
query_length=l+1;
goto __run_query;
}
__run_query:
if (run_query) {
Standard_ProxySQL_Admin *SPA=(Standard_ProxySQL_Admin *)pa;
SPA->admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset);
SPA->SQLite3_to_MySQL(resultset, error, affected_rows, &sess->myprot_client);
}
l_free(pkt->size-sizeof(mysql_hdr),query_no_space); // it is always freed here
l_free(query_length,query);
/*
//MySQL_Protocol &myprot=sess->myprot_client;
sess->client_myds->DSS=STATE_QUERY_SENT;

Loading…
Cancel
Save