diff --git a/include/maxscale/filter.h b/include/maxscale/filter.h index 56cc932f5..15194eaa2 100644 --- a/include/maxscale/filter.h +++ b/include/maxscale/filter.h @@ -92,7 +92,7 @@ typedef struct mxs_filter_object * This is basically the link between a plugin to load and the * optons to pass to that plugin. */ -typedef struct filter_def +typedef struct mxs_filter_def { char *name; /**< The Filter name */ char *module; /**< The module to load */ @@ -101,13 +101,37 @@ typedef struct filter_def MXS_FILTER* filter; /**< The runtime filter */ MXS_FILTER_OBJECT *obj; /**< The "MODULE_OBJECT" for the filter */ SPINLOCK spin; /**< Spinlock to protect the filter definition */ - struct filter_def *next; /**< Next filter in the chain of all filters */ -} FILTER_DEF; + struct mxs_filter_def *next; /**< Next filter in the chain of all filters */ +} MXS_FILTER_DEF; -FILTER_DEF *filter_find(const char *); +/** + * Lookup a filter definition using the unique section name in + * the configuration file. + * + * @param name The name of a filter. + * + * @return A filter definition or NULL if not found. + */ +MXS_FILTER_DEF *filter_def_find(const char *name); + +/** + * Get module name of a filter definition. + * + * @param filter_def A filter definition. + * + * @return The module name. + */ +const char* filter_def_get_module_name(const MXS_FILTER_DEF* filter_def); + +/** + * Get the filter instance of a particular filter definition. + * + * @return A filter instance. + */ +MXS_FILTER* filter_def_get_instance(const MXS_FILTER_DEF* filter_def); void dprintAllFilters(DCB *); -void dprintFilter(DCB *, const FILTER_DEF *); +void dprintFilter(DCB *, const MXS_FILTER_DEF *); void dListFilters(DCB *); /** diff --git a/include/maxscale/modulecmd.h b/include/maxscale/modulecmd.h index 8d9a11aef..a5dc38e9b 100644 --- a/include/maxscale/modulecmd.h +++ b/include/maxscale/modulecmd.h @@ -83,14 +83,14 @@ struct arg_node modulecmd_arg_type_t type; union { - char *string; - bool boolean; - SERVICE *service; - SERVER *server; - SESSION *session; - DCB *dcb; - MONITOR *monitor; - FILTER_DEF *filter; + char *string; + bool boolean; + SERVICE *service; + SERVER *server; + SESSION *session; + DCB *dcb; + MONITOR *monitor; + MXS_FILTER_DEF *filter; } value; }; diff --git a/include/maxscale/service.h b/include/maxscale/service.h index 9ec330a23..c1564b94a 100644 --- a/include/maxscale/service.h +++ b/include/maxscale/service.h @@ -163,7 +163,7 @@ typedef struct service * when querying them from the server. MySQL Workbench seems * to escape at least the underscore character. */ SERVICE_REFRESH_RATE rate_limit; /**< The refresh rate limit for users table */ - FILTER_DEF **filters; /**< Ordered list of filters */ + MXS_FILTER_DEF **filters; /**< Ordered list of filters */ int n_filters; /**< Number of filters */ long conn_idle_timeout; /**< Session timeout in seconds */ char *weightby; /**< Service weighting parameter name */ diff --git a/include/maxscale/session.h b/include/maxscale/session.h index 0420c0329..0266c5b4b 100644 --- a/include/maxscale/session.h +++ b/include/maxscale/session.h @@ -45,7 +45,7 @@ MXS_BEGIN_DECLS struct dcb; struct service; -struct filter_def; +struct mxs_filter_def; struct server; /** @@ -132,7 +132,7 @@ typedef struct mxs_upstream */ typedef struct { - struct filter_def *filter; + struct mxs_filter_def *filter; void *instance; void *session; } SESSION_FILTER; diff --git a/server/core/filter.c b/server/core/filter.c index 59d386487..23663a931 100644 --- a/server/core/filter.c +++ b/server/core/filter.c @@ -34,9 +34,9 @@ #include static SPINLOCK filter_spin = SPINLOCK_INIT; /**< Protects the list of all filters */ -static FILTER_DEF *allFilters = NULL; /**< The list of all filters */ +static MXS_FILTER_DEF *allFilters = NULL; /**< The list of all filters */ -static void filter_free_parameters(FILTER_DEF *filter); +static void filter_free_parameters(MXS_FILTER_DEF *filter); /** * Allocate a new filter within MaxScale @@ -47,13 +47,13 @@ static void filter_free_parameters(FILTER_DEF *filter); * * @return The newly created filter or NULL if an error occured */ -FILTER_DEF * +MXS_FILTER_DEF * filter_alloc(const char *name, const char *module) { char* my_name = MXS_STRDUP(name); char* my_module = MXS_STRDUP(module); - FILTER_DEF *filter = (FILTER_DEF *)MXS_MALLOC(sizeof(FILTER_DEF)); + MXS_FILTER_DEF *filter = (MXS_FILTER_DEF *)MXS_MALLOC(sizeof(MXS_FILTER_DEF)); if (!my_name || !my_module || !filter) { @@ -87,9 +87,9 @@ filter_alloc(const char *name, const char *module) * @return Returns true if the server was freed */ void -filter_free(FILTER_DEF *filter) +filter_free(MXS_FILTER_DEF *filter) { - FILTER_DEF *ptr; + MXS_FILTER_DEF *ptr; if (filter) { @@ -132,17 +132,10 @@ filter_free(FILTER_DEF *filter) } } -/** - * Find an existing filter using the unique section name in - * configuration file - * - * @param name The filter name - * @return The server or NULL if not found - */ -FILTER_DEF * -filter_find(const char *name) +MXS_FILTER_DEF * +filter_def_find(const char *name) { - FILTER_DEF *filter; + MXS_FILTER_DEF *filter; spinlock_acquire(&filter_spin); filter = allFilters; @@ -158,6 +151,16 @@ filter_find(const char *name) return filter; } +const char* filter_def_get_module_name(const MXS_FILTER_DEF* filter_def) +{ + return filter_def->module; +} + +MXS_FILTER* filter_def_get_instance(const MXS_FILTER_DEF* filter_def) +{ + return filter_def->filter; +} + /** * Check a parameter to see if it is a standard filter parameter * @@ -182,7 +185,7 @@ filter_standard_parameter(const char *name) void dprintAllFilters(DCB *dcb) { - FILTER_DEF *ptr; + MXS_FILTER_DEF *ptr; int i; spinlock_acquire(&filter_spin); @@ -220,7 +223,7 @@ dprintAllFilters(DCB *dcb) * to display all active filters in MaxScale */ void -dprintFilter(DCB *dcb, const FILTER_DEF *filter) +dprintFilter(DCB *dcb, const MXS_FILTER_DEF *filter) { int i; @@ -248,7 +251,7 @@ dprintFilter(DCB *dcb, const FILTER_DEF *filter) void dListFilters(DCB *dcb) { - FILTER_DEF *ptr; + MXS_FILTER_DEF *ptr; int i; spinlock_acquire(&filter_spin); @@ -287,7 +290,7 @@ dListFilters(DCB *dcb) * @param option The option string */ void -filter_add_option(FILTER_DEF *filter, const char *option) +filter_add_option(MXS_FILTER_DEF *filter, const char *option) { int i; @@ -323,7 +326,7 @@ filter_add_option(FILTER_DEF *filter, const char *option) * @param value The parameter value */ void -filter_add_parameter(FILTER_DEF *filter, const char *name, const char *value) +filter_add_parameter(MXS_FILTER_DEF *filter, const char *name, const char *value) { CONFIG_CONTEXT ctx = {.object = ""}; @@ -336,7 +339,7 @@ filter_add_parameter(FILTER_DEF *filter, const char *name, const char *value) * Free filter parameters * @param filter Filter whose parameters are to be freed */ -static void filter_free_parameters(FILTER_DEF *filter) +static void filter_free_parameters(MXS_FILTER_DEF *filter) { config_parameter_free(filter->parameters); } @@ -346,7 +349,7 @@ static void filter_free_parameters(FILTER_DEF *filter) * @param filter Filter definition * @return True if module was successfully loaded, false if an error occurred */ -bool filter_load(FILTER_DEF* filter) +bool filter_load(MXS_FILTER_DEF* filter) { bool rval = false; if (filter) @@ -400,7 +403,7 @@ bool filter_load(FILTER_DEF* filter) * if the filter could not be created */ MXS_DOWNSTREAM * -filter_apply(FILTER_DEF *filter, SESSION *session, MXS_DOWNSTREAM *downstream) +filter_apply(MXS_FILTER_DEF *filter, SESSION *session, MXS_DOWNSTREAM *downstream) { MXS_DOWNSTREAM *me; @@ -435,7 +438,7 @@ filter_apply(FILTER_DEF *filter, SESSION *session, MXS_DOWNSTREAM *downstream) * @return The upstream component for the next filter */ MXS_UPSTREAM * -filter_upstream(FILTER_DEF *filter, void *fsession, MXS_UPSTREAM *upstream) +filter_upstream(MXS_FILTER_DEF *filter, void *fsession, MXS_UPSTREAM *upstream) { MXS_UPSTREAM *me = NULL; diff --git a/server/core/maxscale/filter.h b/server/core/maxscale/filter.h index f683b4f51..df84e24b9 100644 --- a/server/core/maxscale/filter.h +++ b/server/core/maxscale/filter.h @@ -20,13 +20,13 @@ MXS_BEGIN_DECLS -void filter_add_option(FILTER_DEF *filter_def, const char *option); -void filter_add_parameter(FILTER_DEF *filter_def, const char *name, const char *value); -FILTER_DEF *filter_alloc(const char *name, const char *module_name); -MXS_DOWNSTREAM *filter_apply(FILTER_DEF *filter_def, SESSION *session, MXS_DOWNSTREAM *downstream); -void filter_free(FILTER_DEF *filter_def); -bool filter_load(FILTER_DEF *filter_def); +void filter_add_option(MXS_FILTER_DEF *filter_def, const char *option); +void filter_add_parameter(MXS_FILTER_DEF *filter_def, const char *name, const char *value); +MXS_FILTER_DEF *filter_alloc(const char *name, const char *module_name); +MXS_DOWNSTREAM *filter_apply(MXS_FILTER_DEF *filter_def, SESSION *session, MXS_DOWNSTREAM *downstream); +void filter_free(MXS_FILTER_DEF *filter_def); +bool filter_load(MXS_FILTER_DEF *filter_def); int filter_standard_parameter(const char *name); -MXS_UPSTREAM *filter_upstream(FILTER_DEF *filter_def, void *fsession, MXS_UPSTREAM *upstream); +MXS_UPSTREAM *filter_upstream(MXS_FILTER_DEF *filter_def, void *fsession, MXS_UPSTREAM *upstream); MXS_END_DECLS diff --git a/server/core/modulecmd.c b/server/core/modulecmd.c index d3cdd38b3..030a018cf 100644 --- a/server/core/modulecmd.c +++ b/server/core/modulecmd.c @@ -303,7 +303,7 @@ static bool process_argument(modulecmd_arg_type_t *type, const void* value, break; case MODULECMD_ARG_FILTER: - if ((arg->value.filter = filter_find((char*)value))) + if ((arg->value.filter = filter_def_find((char*)value))) { arg->type.type = MODULECMD_ARG_FILTER; rval = true; diff --git a/server/core/service.c b/server/core/service.c index 5eb558a05..9d51237a2 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1205,13 +1205,13 @@ void serviceSetRetryOnFailure(SERVICE *service, char* value) bool serviceSetFilters(SERVICE *service, char *filters) { - FILTER_DEF **flist; + MXS_FILTER_DEF **flist; char *ptr, *brkt; int n = 0; bool rval = true; uint64_t capabilities = 0; - if ((flist = (FILTER_DEF **) MXS_MALLOC(sizeof(FILTER_DEF *))) == NULL) + if ((flist = (MXS_FILTER_DEF **) MXS_MALLOC(sizeof(MXS_FILTER_DEF *))) == NULL) { return false; } @@ -1219,9 +1219,9 @@ serviceSetFilters(SERVICE *service, char *filters) while (ptr) { n++; - FILTER_DEF **tmp; - if ((tmp = (FILTER_DEF **) MXS_REALLOC(flist, - (n + 1) * sizeof(FILTER_DEF *))) == NULL) + MXS_FILTER_DEF **tmp; + if ((tmp = (MXS_FILTER_DEF **) MXS_REALLOC(flist, + (n + 1) * sizeof(MXS_FILTER_DEF *))) == NULL) { rval = false; break; @@ -1230,7 +1230,7 @@ serviceSetFilters(SERVICE *service, char *filters) flist = tmp; char *filter_name = trim(ptr); - if ((flist[n - 1] = filter_find(filter_name))) + if ((flist[n - 1] = filter_def_find(filter_name))) { if (filter_load(flist[n - 1])) { @@ -1852,7 +1852,7 @@ void service_destroy_instances(void) } if (svc->n_filters) { - FILTER_DEF **filters = svc->filters; + MXS_FILTER_DEF **filters = svc->filters; for (int i = 0; i < svc->n_filters; i++) { if (filters[i]->obj->destroyInstance && filters[i]->filter) diff --git a/server/core/test/testfilter.c b/server/core/test/testfilter.c index ebdf84a6f..18364e461 100644 --- a/server/core/test/testfilter.c +++ b/server/core/test/testfilter.c @@ -43,22 +43,22 @@ static int test1() { - FILTER_DEF *f1, *f2; + MXS_FILTER_DEF *f1, *f2; if ((f1 = filter_alloc("test1", "module")) == NULL) { fprintf(stderr, "filter_alloc: test 1 failed.\n"); return 1; } - if ((f2 = filter_find("test1")) == NULL) + if ((f2 = filter_def_find("test1")) == NULL) { - fprintf(stderr, "filter_find: test 2 failed.\n"); + fprintf(stderr, "filter_def_find: test 2 failed.\n"); return 1; } filter_free(f1); - if ((f2 = filter_find("test1")) != NULL) + if ((f2 = filter_def_find("test1")) != NULL) { - fprintf(stderr, "filter_find: test 3 failed delete.\n"); + fprintf(stderr, "filter_def_find: test 3 failed delete.\n"); return 1; } @@ -76,7 +76,7 @@ test1() static int test2() { - FILTER_DEF *f1; + MXS_FILTER_DEF *f1; if ((f1 = filter_alloc("test1", "module")) == NULL) { @@ -100,7 +100,7 @@ test2() static int test3() { - FILTER_DEF *f1; + MXS_FILTER_DEF *f1; char name[40]; int i, n_filters = 1000; @@ -117,25 +117,25 @@ test3() for (i = 0; i < n_filters; i++) { sprintf(name, "filter%d", i); - if ((f1 = filter_find(name)) == NULL) + if ((f1 = filter_def_find(name)) == NULL) { - fprintf(stderr, "filter_find: test 3 failed.\n"); + fprintf(stderr, "filter_def_find: test 3 failed.\n"); return 1; } } for (i = 0; i < n_filters; i++) { sprintf(name, "filter%d", i); - if ((f1 = filter_find(name)) == NULL) + if ((f1 = filter_def_find(name)) == NULL) { - fprintf(stderr, "filter_find: test 3 failed.\n"); + fprintf(stderr, "filter_def_find: test 3 failed.\n"); return 1; } filter_free(f1); - if ((f1 = filter_find(name)) != NULL) + if ((f1 = filter_def_find(name)) != NULL) { fprintf(stderr, - "filter_find: test 3 failed - found deleted filter.\n"); + "filter_def_find: test 3 failed - found deleted filter.\n"); return 1; } } diff --git a/server/modules/filter/cache/cachefilter.cc b/server/modules/filter/cache/cachefilter.cc index 05bd3b01b..1476eef70 100644 --- a/server/modules/filter/cache/cachefilter.cc +++ b/server/modules/filter/cache/cachefilter.cc @@ -91,7 +91,7 @@ bool cache_command_show(const MODULECMD_ARG* pArgs) DCB* pDcb = pArgs->argv[0].value.dcb; ss_dassert(pDcb); - const FILTER_DEF* pFilterDef = pArgs->argv[1].value.filter; + const MXS_FILTER_DEF* pFilterDef = pArgs->argv[1].value.filter; ss_dassert(pFilterDef); if (strcmp(pFilterDef->module, "cache") == 0) diff --git a/server/modules/filter/dbfwfilter/dbfwfilter.c b/server/modules/filter/dbfwfilter/dbfwfilter.c index 2e6c27dfe..b29c570b8 100644 --- a/server/modules/filter/dbfwfilter/dbfwfilter.c +++ b/server/modules/filter/dbfwfilter/dbfwfilter.c @@ -683,7 +683,7 @@ TIMERANGE* split_reverse_time(TIMERANGE* tr) bool dbfw_reload_rules(const MODULECMD_ARG *argv) { bool rval = true; - FILTER_DEF *filter = argv->argv[0].value.filter; + MXS_FILTER_DEF *filter = argv->argv[0].value.filter; FW_INSTANCE *inst = (FW_INSTANCE*)filter->filter; if (modulecmd_arg_is_present(argv, 1)) @@ -748,7 +748,7 @@ bool dbfw_reload_rules(const MODULECMD_ARG *argv) bool dbfw_show_rules(const MODULECMD_ARG *argv) { DCB *dcb = argv->argv[0].value.dcb; - FILTER_DEF *filter = argv->argv[1].value.filter; + MXS_FILTER_DEF *filter = argv->argv[1].value.filter; FW_INSTANCE *inst = (FW_INSTANCE*)filter->filter; dcb_printf(dcb, "Rule, Type, Times Matched\n"); diff --git a/server/modules/filter/masking/maskingfilter.cc b/server/modules/filter/masking/maskingfilter.cc index a34e4997c..0ca34f887 100644 --- a/server/modules/filter/masking/maskingfilter.cc +++ b/server/modules/filter/masking/maskingfilter.cc @@ -41,7 +41,7 @@ bool masking_command_reload(const MODULECMD_ARG* pArgs) DCB* pDcb = pArgs->argv[0].value.dcb; ss_dassert(pDcb); - const FILTER_DEF* pFilterDef = pArgs->argv[1].value.filter; + const MXS_FILTER_DEF* pFilterDef = pArgs->argv[1].value.filter; ss_dassert(pFilterDef); if (strcmp(pFilterDef->module, "masking") == 0) diff --git a/server/modules/filter/masking/test/testprepared.cc b/server/modules/filter/masking/test/testprepared.cc deleted file mode 100644 index 9a7897327..000000000 --- a/server/modules/filter/masking/test/testprepared.cc +++ /dev/null @@ -1,167 +0,0 @@ -#include -#include -#include -#include -#include - -using namespace std; - -namespace -{ - -void print_usage_and_exit(ostream& out, const char* zName) -{ - out << "usage: " << zName << "[-h host] [-P port] [-u user] [-p password] -s statement" << endl; - exit(EXIT_FAILURE); -} - -int test_prepared(MYSQL* pMysql, const char* zStatement) -{ - int rc = EXIT_FAILURE; - MYSQL_STMT* pStmt = mysql_stmt_init(pMysql); - - if (pStmt) - { - if (mysql_stmt_prepare(pStmt, zStatement, strlen(zStatement)) == 0) - { - if (mysql_stmt_execute(pStmt) == 0) - { - int nColumns = mysql_stmt_field_count(pStmt); - cout << "Columns: " << nColumns << endl; - - typedef char Buffer[256]; - - Buffer buffers[nColumns]; - MYSQL_BIND bind[nColumns]; - unsigned long lengths[nColumns]; - my_bool nulls[nColumns]; - - for (int i = 0; i < nColumns; ++i) - { - memset(&bind[i], 0, sizeof(MYSQL_BIND)); - bind[i].buffer_type = MYSQL_TYPE_STRING; - bind[i].buffer = buffers[i]; - bind[i].buffer_length = 256; - bind[i].length = &lengths[i]; - bind[i].is_null = &nulls[i]; - } - - if (mysql_stmt_bind_result(pStmt, bind) == 0) - { - while (mysql_stmt_fetch(pStmt) == 0) - { - for (int j = 0; j < nColumns; ++j) - { - if (nulls[j]) - { - cout << "NULL"; - } - else - { - cout.write(buffers[j], lengths[j]); - } - - if (j < nColumns - 1) - { - cout << ", "; - } - } - - cout << endl; - } - } - else - { - cerr << "error (mysql_stmt_bind_result): " << mysql_stmt_error(pStmt) << endl; - } - } - else - { - cerr << "error (mysql_stmt_execute): " << mysql_stmt_error(pStmt) << endl; - } - } - else - { - cerr << "error (mysql_stmt_prepare): " << mysql_stmt_error(pStmt) << endl; - } - - mysql_stmt_close(pStmt); - } - else - { - cerr << "error (mysql_stmt_init): " << mysql_error(pMysql) << endl; - } - - return rc; -} - -} - -int main(int argc, char* argv[]) -{ - int rc = EXIT_FAILURE; - - const char* zHost = "127.0.0.1"; - int port = 3306; - const char* zUser = getenv("USER"); - const char* zPassword = NULL; - const char* zStatement = NULL; - - int opt; - while ((opt = getopt(argc, argv, "h:P:u:p:s:")) != -1) - { - switch (opt) - { - case 'h': - zHost = optarg; - break; - - case 'p': - zPassword = optarg; - break; - - case 'u': - zUser = optarg; - break; - - case 'P': - port = atoi(optarg); - break; - - case 's': - zStatement = optarg; - break; - - default: - print_usage_and_exit(cerr, argv[0]); - } - } - - if (!zStatement) - { - print_usage_and_exit(cerr, argv[0]); - } - - MYSQL* pMysql = mysql_init(NULL); - - if (pMysql) - { - if (mysql_real_connect(pMysql, zHost, zUser, zPassword, NULL, port, NULL, 0)) - { - rc = test_prepared(pMysql, zStatement); - } - else - { - cerr << "error: " << mysql_error(pMysql) << endl; - } - - mysql_close(pMysql); - pMysql = NULL; - } - else - { - cerr << "error: " << mysql_error(NULL) << endl; - } - - return rc; -} diff --git a/server/modules/routing/debugcli/debugcmd.c b/server/modules/routing/debugcli/debugcmd.c index dd458597e..ed15fdfcf 100644 --- a/server/modules/routing/debugcli/debugcmd.c +++ b/server/modules/routing/debugcli/debugcmd.c @@ -1524,7 +1524,7 @@ convert_arg(char *arg, int arg_type) break; case ARG_TYPE_FILTER: - rval = (unsigned long)filter_find(arg); + rval = (unsigned long)filter_def_find(arg); break; case ARG_TYPE_NUMERIC: