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:
Markus Makela 2016-01-21 19:08:23 +02:00
parent b2742f02b9
commit e1a8a6f373
3 changed files with 86 additions and 69 deletions

View File

@ -65,6 +65,9 @@ macro(set_variables)
# Build the 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
set(GCOV FALSE CACHE BOOL "Use gcov build flags")

View File

@ -36,20 +36,17 @@ target_link_libraries(topfilter maxscale-common)
set_target_properties(topfilter PROPERTIES VERSION "1.0.1")
install(TARGETS topfilter DESTINATION ${MAXSCALE_LIBDIR})
if(LUA_FOUND)
include_directories(${LUA_INCLUDE_DIR})
add_library(luafilter SHARED luafilter.c)
target_link_libraries(luafilter log_manager utils ${LUA_LIBRARIES})
install(TARGETS luafilter DESTINATION ${MAXSCALE_LIBDIR})
else()
message(STATUS "Lua was not found, luafilter will not be built.")
if(BUILD_LUAFILTER)
if(LUA_FOUND)
include_directories(${LUA_INCLUDE_DIR})
add_library(luafilter SHARED luafilter.c)
target_link_libraries(luafilter log_manager utils ${LUA_LIBRARIES})
install(TARGETS luafilter DESTINATION ${MAXSCALE_LIBDIR})
else()
message(STATUS "Lua was not found, luafilter will not be built.")
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)
target_link_libraries(namedserverfilter maxscale-common)
set_target_properties(namedserverfilter PROPERTIES VERSION "1.1.0")

View File

@ -173,23 +173,38 @@ static FILTER *
createInstance(char **options, FILTER_PARAMETER **params)
{
LUA_INSTANCE *my_instance;
bool error = false;
if ((my_instance = (LUA_INSTANCE*) calloc(1, sizeof(LUA_INSTANCE))) == 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)
{
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)
{
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)
@ -205,16 +220,16 @@ createInstance(char **options, FILTER_PARAMETER **params)
free(my_instance->global_script);
free(my_instance->session_script);
free(my_instance);
return NULL;
my_instance = NULL;
}
if (my_instance->global_lua_state)
else if (my_instance->global_lua_state)
{
lua_getglobal(my_instance->global_lua_state, "createInstance");
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
{
MXS_ERROR("luafilter: Failed to get global variable 'createInstance': %s.",
lua_tostring(my_instance->global_lua_state, -1));
MXS_WARNING("luafilter: Failed to get global variable 'createInstance': %s."
" 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.");
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_close(my_session->lua_state);
free(my_session);
return NULL;
my_session = NULL;
}
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))
else
{
MXS_ERROR("luafilter: Failed to get global variable 'newSession': '%s'.",
lua_tostring(my_session->lua_state, -1));
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_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);
lua_getglobal(my_instance->global_lua_state, "newSession");
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));
}
spinlock_release(&my_instance->lock);
}
return my_session;
}
@ -320,11 +338,10 @@ static void closeSession(FILTER *instance, void *session)
lua_getglobal(my_session->lua_state, "closeSession");
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_close(my_session->lua_state);
spinlock_release(&my_session->lock);
}
@ -334,8 +351,9 @@ static void closeSession(FILTER *instance, void *session)
lua_getglobal(my_instance->global_lua_state, "closeSession");
if (lua_pcall(my_instance->global_lua_state, 0, 0, 0))
{
MXS_ERROR("luafilter: Failed to get global variable 'closeSession': '%s'.",
lua_tostring(my_instance->global_lua_state, -1));
MXS_WARNING("luafilter: Failed to get global variable 'closeSession': '%s'."
" 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);
}
@ -350,6 +368,7 @@ static void closeSession(FILTER *instance, void *session)
static void freeSession(FILTER *instance, void *session)
{
LUA_SESSION *my_session = (LUA_SESSION *) session;
lua_close(my_session->lua_state);
free(my_session);
}
@ -367,6 +386,12 @@ static void setDownstream(FILTER *instance, void *session, DOWNSTREAM *downstrea
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)
{
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_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);
if (my_session->lua_state)
spinlock_acquire(&my_session->lock);
lua_getglobal(my_session->lua_state, "clientReply");
if (lua_pcall(my_session->lua_state, 0, 0, 0))
{
spinlock_acquire(&my_session->lock);
lua_getglobal(my_session->lua_state, "clientReply");
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);
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");
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,
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'.",
lua_tostring(my_session->lua_state, -1));
}
if (lua_gettop(my_session->lua_state))
else if (lua_gettop(my_session->lua_state))
{
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'.",
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))
{