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 # 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")

View File

@ -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")

View File

@ -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))
{ {