Luafilter is not built by default
The luafilter requires the lua development libraries so it isn't built by default.
This commit is contained in:
@ -65,6 +65,9 @@ macro(set_variables)
|
|||||||
# Build the multimaster monitor
|
# Build the multimaster monitor
|
||||||
set(BUILD_MMMON TRUE CACHE BOOL "Build multimaster monitor")
|
set(BUILD_MMMON TRUE CACHE BOOL "Build multimaster monitor")
|
||||||
|
|
||||||
|
# Build Luafilter
|
||||||
|
set(BUILD_LUAFILTER FALSE CACHE BOOL "Build Luafilter")
|
||||||
|
|
||||||
# Use gcov build flags
|
# Use gcov build flags
|
||||||
set(GCOV FALSE CACHE BOOL "Use gcov build flags")
|
set(GCOV FALSE CACHE BOOL "Use gcov build flags")
|
||||||
|
|
||||||
|
@ -36,20 +36,17 @@ target_link_libraries(topfilter maxscale-common)
|
|||||||
set_target_properties(topfilter PROPERTIES VERSION "1.0.1")
|
set_target_properties(topfilter PROPERTIES VERSION "1.0.1")
|
||||||
install(TARGETS topfilter DESTINATION ${MAXSCALE_LIBDIR})
|
install(TARGETS topfilter DESTINATION ${MAXSCALE_LIBDIR})
|
||||||
|
|
||||||
if(LUA_FOUND)
|
if(BUILD_LUAFILTER)
|
||||||
include_directories(${LUA_INCLUDE_DIR})
|
if(LUA_FOUND)
|
||||||
add_library(luafilter SHARED luafilter.c)
|
include_directories(${LUA_INCLUDE_DIR})
|
||||||
target_link_libraries(luafilter log_manager utils ${LUA_LIBRARIES})
|
add_library(luafilter SHARED luafilter.c)
|
||||||
install(TARGETS luafilter DESTINATION ${MAXSCALE_LIBDIR})
|
target_link_libraries(luafilter log_manager utils ${LUA_LIBRARIES})
|
||||||
else()
|
install(TARGETS luafilter DESTINATION ${MAXSCALE_LIBDIR})
|
||||||
message(STATUS "Lua was not found, luafilter will not be built.")
|
else()
|
||||||
|
message(STATUS "Lua was not found, luafilter will not be built.")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(dbfwfilter SHARED dbfwfilter.c)
|
|
||||||
target_link_libraries(dbfwfilter log_manager query_classifier)
|
|
||||||
set_target_properties(dbfwfilter PROPERTIES VERSION "1.0.0")
|
|
||||||
install(TARGETS dbfwfilter DESTINATION ${MAXSCALE_LIBDIR})
|
|
||||||
|
|
||||||
add_library(namedserverfilter SHARED namedserverfilter.c)
|
add_library(namedserverfilter SHARED namedserverfilter.c)
|
||||||
target_link_libraries(namedserverfilter maxscale-common)
|
target_link_libraries(namedserverfilter maxscale-common)
|
||||||
set_target_properties(namedserverfilter PROPERTIES VERSION "1.1.0")
|
set_target_properties(namedserverfilter PROPERTIES VERSION "1.1.0")
|
||||||
|
@ -173,23 +173,38 @@ static FILTER *
|
|||||||
createInstance(char **options, FILTER_PARAMETER **params)
|
createInstance(char **options, FILTER_PARAMETER **params)
|
||||||
{
|
{
|
||||||
LUA_INSTANCE *my_instance;
|
LUA_INSTANCE *my_instance;
|
||||||
|
bool error = false;
|
||||||
|
|
||||||
if ((my_instance = (LUA_INSTANCE*) calloc(1, sizeof(LUA_INSTANCE))) == NULL)
|
if ((my_instance = (LUA_INSTANCE*) calloc(1, sizeof(LUA_INSTANCE))) == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
spinlock_init(&my_instance->lock);
|
|
||||||
for (int i = 0; params[i]; i++)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
spinlock_init(&my_instance->lock);
|
||||||
|
|
||||||
|
for (int i = 0; params[i] && !error; i++)
|
||||||
|
{
|
||||||
if (strcmp(params[i]->name, "global_script") == 0)
|
if (strcmp(params[i]->name, "global_script") == 0)
|
||||||
{
|
{
|
||||||
my_instance->global_script = strdup(params[i]->value);
|
error = (my_instance->global_script = strdup(params[i]->value)) == NULL;
|
||||||
}
|
}
|
||||||
else if (strcmp(params[i]->name, "session_script") == 0)
|
else if (strcmp(params[i]->name, "session_script") == 0)
|
||||||
{
|
{
|
||||||
my_instance->session_script = strdup(params[i]->value);
|
error = (my_instance->session_script = strdup(params[i]->value)) == NULL;
|
||||||
}
|
}
|
||||||
|
else if (!filter_standard_parameter(params[i]->name))
|
||||||
|
{
|
||||||
|
MXS_ERROR("Unexpected parameter '%s'", params[i]->name);
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
free(my_instance->global_script);
|
||||||
|
free(my_instance->session_script);
|
||||||
|
free(my_instance);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (my_instance->global_script)
|
if (my_instance->global_script)
|
||||||
@ -205,16 +220,16 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
|||||||
free(my_instance->global_script);
|
free(my_instance->global_script);
|
||||||
free(my_instance->session_script);
|
free(my_instance->session_script);
|
||||||
free(my_instance);
|
free(my_instance);
|
||||||
return NULL;
|
my_instance = NULL;
|
||||||
}
|
}
|
||||||
|
else if (my_instance->global_lua_state)
|
||||||
if (my_instance->global_lua_state)
|
|
||||||
{
|
{
|
||||||
lua_getglobal(my_instance->global_lua_state, "createInstance");
|
lua_getglobal(my_instance->global_lua_state, "createInstance");
|
||||||
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
|
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
|
||||||
{
|
{
|
||||||
MXS_ERROR("luafilter: Failed to get global variable 'createInstance': %s.",
|
MXS_WARNING("luafilter: Failed to get global variable 'createInstance': %s."
|
||||||
lua_tostring(my_instance->global_lua_state, -1));
|
" The createInstance entry point will not be called for the global script.",
|
||||||
|
lua_tostring(my_instance->global_lua_state, -1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,7 +237,7 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
|||||||
{
|
{
|
||||||
MXS_ERROR("Unable to initialize new Lua state.");
|
MXS_ERROR("Unable to initialize new Lua state.");
|
||||||
free(my_instance);
|
free(my_instance);
|
||||||
return NULL;
|
my_instance = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,33 +285,36 @@ static void * newSession(FILTER *instance, SESSION *session)
|
|||||||
lua_tostring(my_session->lua_state, -1));
|
lua_tostring(my_session->lua_state, -1));
|
||||||
lua_close(my_session->lua_state);
|
lua_close(my_session->lua_state);
|
||||||
free(my_session);
|
free(my_session);
|
||||||
return NULL;
|
my_session = NULL;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
lua_pushcfunction(my_session->lua_state, id_gen);
|
|
||||||
lua_setglobal(my_session->lua_state, "id_gen");
|
|
||||||
|
|
||||||
lua_getglobal(my_session->lua_state, "newSession");
|
|
||||||
if (lua_pcall(my_session->lua_state, 0, 0, 0))
|
|
||||||
{
|
{
|
||||||
MXS_ERROR("luafilter: Failed to get global variable 'newSession': '%s'.",
|
lua_pushcfunction(my_session->lua_state, id_gen);
|
||||||
lua_tostring(my_session->lua_state, -1));
|
lua_setglobal(my_session->lua_state, "id_gen");
|
||||||
|
|
||||||
|
lua_getglobal(my_session->lua_state, "newSession");
|
||||||
|
if (lua_pcall(my_session->lua_state, 0, 0, 0))
|
||||||
|
{
|
||||||
|
MXS_WARNING("luafilter: Failed to get global variable 'newSession': '%s'."
|
||||||
|
" The newSession entry point will not be called.",
|
||||||
|
lua_tostring(my_session->lua_state, -1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (my_instance->global_lua_state)
|
if (my_session && my_instance->global_lua_state)
|
||||||
{
|
{
|
||||||
spinlock_acquire(&my_instance->lock);
|
spinlock_acquire(&my_instance->lock);
|
||||||
lua_getglobal(my_instance->global_lua_state, "newSession");
|
lua_getglobal(my_instance->global_lua_state, "newSession");
|
||||||
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
|
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
|
||||||
{
|
{
|
||||||
MXS_ERROR("luafilter: Failed to get global variable 'newSession': '%s'.",
|
MXS_WARNING("luafilter: Failed to get global variable 'newSession': '%s'."
|
||||||
|
" The newSession entry point will not be called for the global script.",
|
||||||
lua_tostring(my_instance->global_lua_state, -1));
|
lua_tostring(my_instance->global_lua_state, -1));
|
||||||
}
|
}
|
||||||
spinlock_release(&my_instance->lock);
|
spinlock_release(&my_instance->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return my_session;
|
return my_session;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,11 +338,10 @@ static void closeSession(FILTER *instance, void *session)
|
|||||||
lua_getglobal(my_session->lua_state, "closeSession");
|
lua_getglobal(my_session->lua_state, "closeSession");
|
||||||
if (lua_pcall(my_session->lua_state, 0, 0, 0))
|
if (lua_pcall(my_session->lua_state, 0, 0, 0))
|
||||||
{
|
{
|
||||||
MXS_ERROR("luafilter: Failed to get global variable 'closeSession': '%s'.",
|
MXS_WARNING("luafilter: Failed to get global variable 'closeSession': '%s'."
|
||||||
|
" The closeSession entry point will not be called.",
|
||||||
lua_tostring(my_session->lua_state, -1));
|
lua_tostring(my_session->lua_state, -1));
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_close(my_session->lua_state);
|
|
||||||
spinlock_release(&my_session->lock);
|
spinlock_release(&my_session->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,8 +351,9 @@ static void closeSession(FILTER *instance, void *session)
|
|||||||
lua_getglobal(my_instance->global_lua_state, "closeSession");
|
lua_getglobal(my_instance->global_lua_state, "closeSession");
|
||||||
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
|
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
|
||||||
{
|
{
|
||||||
MXS_ERROR("luafilter: Failed to get global variable 'closeSession': '%s'.",
|
MXS_WARNING("luafilter: Failed to get global variable 'closeSession': '%s'."
|
||||||
lua_tostring(my_instance->global_lua_state, -1));
|
" The closeSession entry point will not be called for the global script.",
|
||||||
|
lua_tostring(my_instance->global_lua_state, -1));
|
||||||
}
|
}
|
||||||
spinlock_release(&my_instance->lock);
|
spinlock_release(&my_instance->lock);
|
||||||
}
|
}
|
||||||
@ -350,6 +368,7 @@ static void closeSession(FILTER *instance, void *session)
|
|||||||
static void freeSession(FILTER *instance, void *session)
|
static void freeSession(FILTER *instance, void *session)
|
||||||
{
|
{
|
||||||
LUA_SESSION *my_session = (LUA_SESSION *) session;
|
LUA_SESSION *my_session = (LUA_SESSION *) session;
|
||||||
|
lua_close(my_session->lua_state);
|
||||||
free(my_session);
|
free(my_session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -367,6 +386,12 @@ static void setDownstream(FILTER *instance, void *session, DOWNSTREAM *downstrea
|
|||||||
my_session->down = *downstream;
|
my_session->down = *downstream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the filter upstream
|
||||||
|
* @param instance Filter instance
|
||||||
|
* @param session Filter session
|
||||||
|
* @param upstream Upstream filter
|
||||||
|
*/
|
||||||
static void setUpstream(FILTER *instance, void *session, UPSTREAM *upstream)
|
static void setUpstream(FILTER *instance, void *session, UPSTREAM *upstream)
|
||||||
{
|
{
|
||||||
LUA_SESSION *my_session = (LUA_SESSION *) session;
|
LUA_SESSION *my_session = (LUA_SESSION *) session;
|
||||||
@ -386,37 +411,30 @@ static int clientReply(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;
|
|
||||||
|
|
||||||
if (modutil_is_SQL(queue) || modutil_is_SQL_prepare(queue))
|
if (my_session->lua_state)
|
||||||
{
|
{
|
||||||
fullquery = modutil_get_SQL(queue);
|
spinlock_acquire(&my_session->lock);
|
||||||
|
lua_getglobal(my_session->lua_state, "clientReply");
|
||||||
if (my_session->lua_state)
|
if (lua_pcall(my_session->lua_state, 0, 0, 0))
|
||||||
{
|
{
|
||||||
spinlock_acquire(&my_session->lock);
|
MXS_ERROR("luafilter: Session scope call to 'clientReply' failed: '%s'.",
|
||||||
lua_getglobal(my_session->lua_state, "clientReply");
|
lua_tostring(my_session->lua_state, -1));
|
||||||
lua_pushlstring(my_session->lua_state, fullquery, strlen(fullquery));
|
|
||||||
if (lua_pcall(my_session->lua_state, 1, 0, 0))
|
|
||||||
{
|
|
||||||
MXS_ERROR("luafilter: Session scope call to 'clientReply' failed: '%s'.",
|
|
||||||
lua_tostring(my_session->lua_state, -1));
|
|
||||||
}
|
|
||||||
spinlock_release(&my_session->lock);
|
|
||||||
}
|
|
||||||
if (my_instance->global_lua_state)
|
|
||||||
{
|
|
||||||
spinlock_acquire(&my_instance->lock);
|
|
||||||
lua_getglobal(my_instance->global_lua_state, "clientReply");
|
|
||||||
lua_pushlstring(my_instance->global_lua_state, fullquery, strlen(fullquery));
|
|
||||||
if (lua_pcall(my_instance->global_lua_state, 1, 0, 0))
|
|
||||||
{
|
|
||||||
MXS_ERROR("luafilter: Global scope call to 'clientReply' failed: '%s'.",
|
|
||||||
lua_tostring(my_session->lua_state, -1));
|
|
||||||
}
|
|
||||||
spinlock_release(&my_instance->lock);
|
|
||||||
}
|
}
|
||||||
|
spinlock_release(&my_session->lock);
|
||||||
}
|
}
|
||||||
|
if (my_instance->global_lua_state)
|
||||||
|
{
|
||||||
|
spinlock_acquire(&my_instance->lock);
|
||||||
|
lua_getglobal(my_instance->global_lua_state, "clientReply");
|
||||||
|
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
|
||||||
|
{
|
||||||
|
MXS_ERROR("luafilter: Global scope call to 'clientReply' failed: '%s'.",
|
||||||
|
lua_tostring(my_session->lua_state, -1));
|
||||||
|
}
|
||||||
|
spinlock_release(&my_instance->lock);
|
||||||
|
}
|
||||||
|
|
||||||
return my_session->up.clientReply(my_session->up.instance,
|
return my_session->up.clientReply(my_session->up.instance,
|
||||||
my_session->up.session, queue);
|
my_session->up.session, queue);
|
||||||
}
|
}
|
||||||
@ -463,8 +481,7 @@ static int routeQuery(FILTER *instance, void *session, GWBUF *queue)
|
|||||||
MXS_ERROR("luafilter: Session scope call to 'routeQuery' failed: '%s'.",
|
MXS_ERROR("luafilter: Session scope call to 'routeQuery' failed: '%s'.",
|
||||||
lua_tostring(my_session->lua_state, -1));
|
lua_tostring(my_session->lua_state, -1));
|
||||||
}
|
}
|
||||||
|
else if (lua_gettop(my_session->lua_state))
|
||||||
if (lua_gettop(my_session->lua_state))
|
|
||||||
{
|
{
|
||||||
if (lua_isstring(my_session->lua_state, -1))
|
if (lua_isstring(my_session->lua_state, -1))
|
||||||
{
|
{
|
||||||
@ -492,7 +509,7 @@ static int routeQuery(FILTER *instance, void *session, GWBUF *queue)
|
|||||||
MXS_ERROR("luafilter: Global scope call to 'routeQuery' failed: '%s'.",
|
MXS_ERROR("luafilter: Global scope call to 'routeQuery' failed: '%s'.",
|
||||||
lua_tostring(my_session->lua_state, -1));
|
lua_tostring(my_session->lua_state, -1));
|
||||||
}
|
}
|
||||||
if (lua_gettop(my_instance->global_lua_state))
|
else if (lua_gettop(my_instance->global_lua_state))
|
||||||
{
|
{
|
||||||
if (lua_isstring(my_instance->global_lua_state, -1))
|
if (lua_isstring(my_instance->global_lua_state, -1))
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user