From 3898a995add64ecb0802b9c9724c8e42ac251fa6 Mon Sep 17 00:00:00 2001 From: Mark Riddoch Date: Thu, 19 Feb 2015 11:07:24 +0000 Subject: [PATCH] Addition of show services command --- server/core/service.c | 70 +++++++++++++++++++ server/include/service.h | 2 + server/modules/routing/maxinfo/maxinfo_exec.c | 13 ++++ 3 files changed, 85 insertions(+) diff --git a/server/core/service.c b/server/core/service.c index c75cd98e3..98aa8b458 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -34,6 +34,7 @@ * 09/09/14 Massimiliano Pinto Added service option for localhost authentication * 13/10/14 Massimiliano Pinto Added hashtable for resources (i.e database names for MySQL services) * 06/02/15 Mark Riddoch Added caching of authentication data + * 18/02/15 Mark Riddoch Added result set management * * @endverbatim */ @@ -57,6 +58,7 @@ #include #include #include +#include /** Defined in log_manager.cc */ extern int lm_enabled_logfiles_bitmask; @@ -1533,3 +1535,71 @@ int rval = 0; spinlock_release(&service_spin); return rval; } + +/** + * Provide a row to the result set that defines the set of services + * + * @param set The result set + * @param data The index of the row to send + * @return The next row or NULL + */ +static RESULT_ROW * +serviceRowCallback(RESULTSET *set, void *data) +{ +int *rowno = (int *)data; +int i = 0;; +char buf[20]; +RESULT_ROW *row; +SERVICE *ptr; + + spinlock_acquire(&service_spin); + ptr = allServices; + while (i < *rowno && ptr) + { + ptr = ptr->next; + i++; + } + if (ptr == NULL) + { + spinlock_release(&service_spin); + free(data); + return NULL; + } + (*rowno)++; + row = resultset_make_row(set); + resultset_row_set(row, 0, ptr->name); + resultset_row_set(row, 1, ptr->routerModule); + sprintf(buf, "%d", ptr->stats.n_current); + resultset_row_set(row, 2, buf); + sprintf(buf, "%d", ptr->stats.n_sessions); + resultset_row_set(row, 3, buf); + spinlock_release(&service_spin); + return row; +} + +/** + * Return a resultset that has the current set of services in it + * + * @return A Result set + */ +RESULTSET * +serviceGetList() +{ +RESULTSET *set; +int *data; + + if ((data = (int *)malloc(sizeof(int))) == NULL) + return NULL; + *data = 0; + if ((set = resultset_create(serviceRowCallback, data)) == NULL) + { + free(data); + return NULL; + } + resultset_add_column(set, "Name", 30, COL_TYPE_VARCHAR); + resultset_add_column(set, "Router Module", 30, COL_TYPE_VARCHAR); + resultset_add_column(set, "No. Sessions", 10, COL_TYPE_VARCHAR); + resultset_add_column(set, "Total Sessions", 10, COL_TYPE_VARCHAR); + + return set; +} diff --git a/server/include/service.h b/server/include/service.h index 961e2dfb8..720c961da 100644 --- a/server/include/service.h +++ b/server/include/service.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "config.h" /** @@ -194,4 +195,5 @@ extern void dListListeners(DCB *); char* service_get_name(SERVICE* svc); void service_shutdown(); extern int serviceSessionCountAll(); +extern RESULTSET *serviceGetList(); #endif diff --git a/server/modules/routing/maxinfo/maxinfo_exec.c b/server/modules/routing/maxinfo/maxinfo_exec.c index 665b4bcf0..e489c722f 100644 --- a/server/modules/routing/maxinfo/maxinfo_exec.c +++ b/server/modules/routing/maxinfo/maxinfo_exec.c @@ -86,12 +86,25 @@ maxinfo_execute(DCB *dcb, MAXINFO_TREE *tree) } } +static void +exec_show_services(DCB *dcb, MAXINFO_TREE *tree) +{ +RESULTSET *set; + + if ((set = serviceGetList()) == NULL) + return; + + resultset_stream_mysql(set, dcb); + resultset_free(set); +} + static struct { char *name; void (*func)(DCB *, MAXINFO_TREE *); } show_commands[] = { { "variables", exec_show_variables }, { "status", exec_show_status }, + { "services", exec_show_services }, { NULL, NULL } };