Added a simple test for Lua return values from fuction calls. If the Lua function returns a string, the current query is replaced with it.
This commit is contained in:
@ -47,16 +47,16 @@ extern "C"
|
|||||||
#include <lualib.h>
|
#include <lualib.h>
|
||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
|
|
||||||
|
static const char* filter_name = "Lua Filter";
|
||||||
|
|
||||||
MODULE_INFO info = {
|
MODULE_INFO info = {
|
||||||
MODULE_API_FILTER,
|
MODULE_API_FILTER,
|
||||||
MODULE_ALPHA_RELEASE,
|
MODULE_ALPHA_RELEASE,
|
||||||
FILTER_VERSION,
|
FILTER_VERSION,
|
||||||
"Lua Filter"
|
(char*)filter_name
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *version_str = "V1.0.0";
|
static const char *version_str = "V1.0.0";
|
||||||
/**
|
/**
|
||||||
* Implementation of the mandatory version entry point
|
* Implementation of the mandatory version entry point
|
||||||
*
|
*
|
||||||
@ -65,7 +65,7 @@ static char *version_str = "V1.0.0";
|
|||||||
char *
|
char *
|
||||||
version()
|
version()
|
||||||
{
|
{
|
||||||
return version_str;
|
return (char*)version_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -356,6 +356,21 @@ static int clientReply(FILTER *instance, void *session, GWBUF *queue)
|
|||||||
my_session->up.session, queue);
|
my_session->up.session, queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GWBUF* gen_comquery_packet(char* query)
|
||||||
|
{
|
||||||
|
unsigned int plen = strlen(query) + 1;
|
||||||
|
GWBUF* buffer = gwbuf_alloc(plen + 5);
|
||||||
|
if(buffer){
|
||||||
|
*((unsigned char*)buffer->start + 0) = plen;
|
||||||
|
*((unsigned char*)buffer->start + 1) = plen >> 8;
|
||||||
|
*((unsigned char*)buffer->start + 2) = plen >> 16;
|
||||||
|
*((unsigned char*)buffer->start + 3) = 0;
|
||||||
|
*((unsigned char*)buffer->start + 4) = 0x03;
|
||||||
|
strncpy((char*)buffer->start + 5,query,plen);
|
||||||
|
buffer->gwbuf_type = GWBUF_TYPE_MYSQL;
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The routeQuery entry point. This is passed the query buffer
|
* The routeQuery entry point. This is passed the query buffer
|
||||||
@ -372,8 +387,9 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue)
|
|||||||
{
|
{
|
||||||
LUA_SESSION *my_session = (LUA_SESSION *)session;
|
LUA_SESSION *my_session = (LUA_SESSION *)session;
|
||||||
LUA_INSTANCE *my_instance = (LUA_INSTANCE *)instance;
|
LUA_INSTANCE *my_instance = (LUA_INSTANCE *)instance;
|
||||||
char *fullquery,*ptr;
|
char *fullquery = NULL,*ptr;
|
||||||
int qlen;
|
int qlen;
|
||||||
|
GWBUF* forward = queue;
|
||||||
|
|
||||||
if(modutil_is_SQL(queue)){
|
if(modutil_is_SQL(queue)){
|
||||||
|
|
||||||
@ -385,10 +401,22 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue)
|
|||||||
if(my_session->state){
|
if(my_session->state){
|
||||||
lua_getglobal(my_session->state,"routeQuery");
|
lua_getglobal(my_session->state,"routeQuery");
|
||||||
lua_pushlstring(my_session->state,fullquery,strlen(fullquery));
|
lua_pushlstring(my_session->state,fullquery,strlen(fullquery));
|
||||||
if(lua_pcall(my_session->state,1,0,0)){
|
if(lua_pcall(my_session->state,1,1,0)){
|
||||||
skygw_log_write(LOGFILE_ERROR, "luafilter: Session scope call to 'routeQuery' failed: '%s'.",
|
skygw_log_write(LOGFILE_ERROR, "luafilter: Session scope call to 'routeQuery' failed: '%s'.",
|
||||||
lua_tostring(my_session->state,-1));
|
lua_tostring(my_session->state,-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(lua_gettop(my_session->state)){
|
||||||
|
if(lua_isstring(my_session->state,-1)){
|
||||||
|
free(fullquery);
|
||||||
|
fullquery = strdup(lua_tostring(my_session->state,-1));
|
||||||
|
forward = gen_comquery_packet(fullquery);
|
||||||
|
}else if(lua_isboolean(my_session->state,-1)){
|
||||||
|
skygw_log_write(LOGFILE_TRACE, "luafilter: Lua returned %s.",
|
||||||
|
lua_toboolean(my_session->state,-1) ? "true": "false");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(my_instance->global_state){
|
if(my_instance->global_state){
|
||||||
@ -404,7 +432,7 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return my_session->down.routeQuery(my_session->down.instance,
|
return my_session->down.routeQuery(my_session->down.instance,
|
||||||
my_session->down.session, queue);
|
my_session->down.session, forward);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user