MXS-1929: Take ResultSet into use
Replaced the previous RESULTSET with the new implementation. As the new ResultSet doesn't have a JSON streaming capability, the MaxInfo JSON interface has been removed. This should not be a big problem as the REST API offers the same information in a more secure and structured way.
This commit is contained in:
		@ -60,7 +60,7 @@
 | 
			
		||||
#include "internal/maxscale.h"
 | 
			
		||||
#include "internal/modules.h"
 | 
			
		||||
#include "internal/monitor.h"
 | 
			
		||||
#include "internal/poll.h"
 | 
			
		||||
#include "internal/poll.hh"
 | 
			
		||||
#include "internal/routingworker.hh"
 | 
			
		||||
#include "internal/service.hh"
 | 
			
		||||
#include "internal/statistics.h"
 | 
			
		||||
 | 
			
		||||
@ -21,4 +21,4 @@
 | 
			
		||||
 *
 | 
			
		||||
 * @return A Result set
 | 
			
		||||
 */
 | 
			
		||||
ResultSet *moduleGetList();
 | 
			
		||||
std::unique_ptr<ResultSet> moduleGetList();
 | 
			
		||||
 | 
			
		||||
@ -20,4 +20,4 @@
 | 
			
		||||
 | 
			
		||||
#include <maxscale/resultset.hh>
 | 
			
		||||
 | 
			
		||||
ResultSet *monitor_get_list();
 | 
			
		||||
std::unique_ptr<ResultSet> monitor_get_list();
 | 
			
		||||
 | 
			
		||||
@ -13,15 +13,13 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file core/maxscale/poll.h - The private poll interface
 | 
			
		||||
 * The private poll header
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <maxscale/cppdefs.hh>
 | 
			
		||||
#include <maxscale/poll.h>
 | 
			
		||||
 | 
			
		||||
#include <maxscale/resultset.hh>
 | 
			
		||||
 | 
			
		||||
MXS_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
struct mxs_worker;
 | 
			
		||||
 | 
			
		||||
#define MAX_EVENTS 1000
 | 
			
		||||
@ -42,6 +40,4 @@ void            dShowThreads(DCB *dcb);
 | 
			
		||||
void            dShowEventQ(DCB *dcb);
 | 
			
		||||
void            dShowEventStats(DCB *dcb);
 | 
			
		||||
 | 
			
		||||
ResultSet       *eventTimesGetList();
 | 
			
		||||
 | 
			
		||||
MXS_END_DECLS
 | 
			
		||||
std::unique_ptr<ResultSet> eventTimesGetList();
 | 
			
		||||
@ -18,4 +18,4 @@
 | 
			
		||||
 | 
			
		||||
#include <maxscale/resultset.hh>
 | 
			
		||||
 | 
			
		||||
ResultSet* serverGetList();
 | 
			
		||||
std::unique_ptr<ResultSet> serverGetList();
 | 
			
		||||
 | 
			
		||||
@ -353,5 +353,5 @@ json_t* service_relations_to_server(const SERVER* server, const char* host);
 | 
			
		||||
 */
 | 
			
		||||
json_t* service_relations_to_filter(const MXS_FILTER_DEF* filter, const char* host);
 | 
			
		||||
 | 
			
		||||
ResultSet* serviceGetList(void);
 | 
			
		||||
ResultSet* serviceGetListenerList(void);
 | 
			
		||||
std::unique_ptr<ResultSet> serviceGetList(void);
 | 
			
		||||
std::unique_ptr<ResultSet> serviceGetListenerList(void);
 | 
			
		||||
 | 
			
		||||
@ -40,4 +40,4 @@ struct RegistryTraits<MXS_SESSION>
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultSet *sessionGetList();
 | 
			
		||||
std::unique_ptr<ResultSet> sessionGetList();
 | 
			
		||||
 | 
			
		||||
@ -15,8 +15,6 @@
 | 
			
		||||
 * @file load_utils.c Utility functions for loading of modules
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "internal/modules.h"
 | 
			
		||||
 | 
			
		||||
#include <sys/param.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
@ -40,7 +38,7 @@
 | 
			
		||||
#include <maxscale/monitor.h>
 | 
			
		||||
#include <maxscale/query_classifier.h>
 | 
			
		||||
 | 
			
		||||
#include "internal/modules.h"
 | 
			
		||||
#include "internal/modules.hh"
 | 
			
		||||
#include "internal/config.hh"
 | 
			
		||||
 | 
			
		||||
namespace
 | 
			
		||||
@ -580,6 +578,29 @@ json_t* module_list_to_json(const char* host)
 | 
			
		||||
    return mxs_json_resource(host, MXS_JSON_API_MODULES, arr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char* module_status_to_string(LOADED_MODULE* ptr)
 | 
			
		||||
{
 | 
			
		||||
    switch (ptr->info->status)
 | 
			
		||||
    {
 | 
			
		||||
        case MXS_MODULE_IN_DEVELOPMENT:
 | 
			
		||||
            return "In Development";
 | 
			
		||||
 | 
			
		||||
        case MXS_MODULE_ALPHA_RELEASE:
 | 
			
		||||
            return "Alpha";
 | 
			
		||||
 | 
			
		||||
        case MXS_MODULE_BETA_RELEASE:
 | 
			
		||||
            return "Beta";
 | 
			
		||||
 | 
			
		||||
        case MXS_MODULE_GA:
 | 
			
		||||
            return "GA";
 | 
			
		||||
 | 
			
		||||
        case MXS_MODULE_EXPERIMENTAL:
 | 
			
		||||
            return "Experimental";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return "Unknown";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provide a row to the result set that defines the set of modules
 | 
			
		||||
 *
 | 
			
		||||
@ -587,70 +608,24 @@ json_t* module_list_to_json(const char* host)
 | 
			
		||||
 * @param data  The index of the row to send
 | 
			
		||||
 * @return The next row or NULL
 | 
			
		||||
 */
 | 
			
		||||
static RESULT_ROW *
 | 
			
		||||
moduleRowCallback(RESULTSET *set, void *data)
 | 
			
		||||
static void moduleRowCallback(std::unique_ptr<ResultSet>& set)
 | 
			
		||||
{
 | 
			
		||||
    int *rowno = (int *)data;
 | 
			
		||||
    int i = 0;;
 | 
			
		||||
    char *stat, buf[20];
 | 
			
		||||
    RESULT_ROW *row;
 | 
			
		||||
    LOADED_MODULE *ptr;
 | 
			
		||||
 | 
			
		||||
    ptr = registered;
 | 
			
		||||
    while (i < *rowno && ptr)
 | 
			
		||||
    for (LOADED_MODULE* ptr = registered; ptr; ptr = ptr->next)
 | 
			
		||||
    {
 | 
			
		||||
        i++;
 | 
			
		||||
        ptr = ptr->next;
 | 
			
		||||
        char buf[40];
 | 
			
		||||
        snprintf(buf, sizeof(buf), "%d.%d.%d",
 | 
			
		||||
                 ptr->info->api_version.major,
 | 
			
		||||
                 ptr->info->api_version.minor,
 | 
			
		||||
                 ptr->info->api_version.patch);
 | 
			
		||||
        set->add_row({ptr->module, ptr->type, ptr->version, buf, module_status_to_string(ptr)});
 | 
			
		||||
    }
 | 
			
		||||
    if (ptr == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    (*rowno)++;
 | 
			
		||||
    row = resultset_make_row(set);
 | 
			
		||||
    resultset_row_set(row, 0, ptr->module);
 | 
			
		||||
    resultset_row_set(row, 1, ptr->type);
 | 
			
		||||
    resultset_row_set(row, 2, ptr->version);
 | 
			
		||||
    snprintf(buf, 19, "%d.%d.%d", ptr->info->api_version.major,
 | 
			
		||||
             ptr->info->api_version.minor,
 | 
			
		||||
             ptr->info->api_version.patch);
 | 
			
		||||
    buf[19] = '\0';
 | 
			
		||||
    resultset_row_set(row, 3, buf);
 | 
			
		||||
    resultset_row_set(row, 4, ptr->info->status == MXS_MODULE_IN_DEVELOPMENT
 | 
			
		||||
                      ? "In Development"
 | 
			
		||||
                      : (ptr->info->status == MXS_MODULE_ALPHA_RELEASE
 | 
			
		||||
                         ? "Alpha"
 | 
			
		||||
                         : (ptr->info->status == MXS_MODULE_BETA_RELEASE
 | 
			
		||||
                            ? "Beta"
 | 
			
		||||
                            : (ptr->info->status == MXS_MODULE_GA
 | 
			
		||||
                               ? "GA"
 | 
			
		||||
                               : (ptr->info->status == MXS_MODULE_EXPERIMENTAL
 | 
			
		||||
                                  ? "Experimental" : "Unknown")))));
 | 
			
		||||
    return row;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RESULTSET *moduleGetList()
 | 
			
		||||
std::unique_ptr<ResultSet> moduleGetList()
 | 
			
		||||
{
 | 
			
		||||
    RESULTSET       *set;
 | 
			
		||||
    int             *data;
 | 
			
		||||
 | 
			
		||||
    if ((data = (int *)MXS_MALLOC(sizeof(int))) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    *data = 0;
 | 
			
		||||
    if ((set = resultset_create(moduleRowCallback, data)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    resultset_add_column(set, "Module Name", 18, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Module Type", 12, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Version", 10, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "API Version", 8, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Status", 15, COL_TYPE_VARCHAR);
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<ResultSet> set = ResultSet::create({"Module Name", "Module Type", "Version", "API Version", "Status"});
 | 
			
		||||
    moduleRowCallback(set);
 | 
			
		||||
    return set;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@
 | 
			
		||||
 | 
			
		||||
#include "internal/config.hh"
 | 
			
		||||
#include "internal/externcmd.h"
 | 
			
		||||
#include "internal/monitor.h"
 | 
			
		||||
#include "internal/monitor.hh"
 | 
			
		||||
#include "internal/modules.h"
 | 
			
		||||
 | 
			
		||||
/** Schema version, journals must have a matching version */
 | 
			
		||||
@ -750,68 +750,23 @@ bool monitor_set_network_timeout(MXS_MONITOR *mon, int type, int value, const ch
 | 
			
		||||
    return rval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provide a row to the result set that defines the set of monitors
 | 
			
		||||
 *
 | 
			
		||||
 * @param set   The result set
 | 
			
		||||
 * @param data  The index of the row to send
 | 
			
		||||
 * @return The next row or NULL
 | 
			
		||||
 */
 | 
			
		||||
static RESULT_ROW *
 | 
			
		||||
monitorRowCallback(RESULTSET *set, void *data)
 | 
			
		||||
{
 | 
			
		||||
    int *rowno = (int *)data;
 | 
			
		||||
    int i = 0;;
 | 
			
		||||
    char buf[20];
 | 
			
		||||
    RESULT_ROW *row;
 | 
			
		||||
    MXS_MONITOR *ptr;
 | 
			
		||||
 | 
			
		||||
    spinlock_acquire(&monLock);
 | 
			
		||||
    ptr = allMonitors;
 | 
			
		||||
    while (i < *rowno && ptr)
 | 
			
		||||
    {
 | 
			
		||||
        i++;
 | 
			
		||||
        ptr = ptr->next;
 | 
			
		||||
    }
 | 
			
		||||
    if (ptr == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_release(&monLock);
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    (*rowno)++;
 | 
			
		||||
    row = resultset_make_row(set);
 | 
			
		||||
    resultset_row_set(row, 0, ptr->name);
 | 
			
		||||
    resultset_row_set(row, 1, ptr->state & MONITOR_STATE_RUNNING
 | 
			
		||||
                      ? "Running" : "Stopped");
 | 
			
		||||
    spinlock_release(&monLock);
 | 
			
		||||
    return row;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return a resultset that has the current set of monitors in it
 | 
			
		||||
 *
 | 
			
		||||
 * @return A Result set
 | 
			
		||||
 */
 | 
			
		||||
RESULTSET *
 | 
			
		||||
monitor_get_list()
 | 
			
		||||
std::unique_ptr<ResultSet> monitor_get_list()
 | 
			
		||||
{
 | 
			
		||||
    RESULTSET *set;
 | 
			
		||||
    int *data;
 | 
			
		||||
    std::unique_ptr<ResultSet> set = ResultSet::create({"Monitor", "Status"});
 | 
			
		||||
    spinlock_acquire(&monLock);
 | 
			
		||||
 | 
			
		||||
    if ((data = (int *)MXS_MALLOC(sizeof(int))) == NULL)
 | 
			
		||||
    for (MXS_MONITOR* ptr = allMonitors; ptr; ptr = ptr->next)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
        const char* state = ptr->state & MONITOR_STATE_RUNNING ? "Running" : "Stopped";
 | 
			
		||||
        set->add_row({ptr->name, state});
 | 
			
		||||
    }
 | 
			
		||||
    *data = 0;
 | 
			
		||||
    if ((set = resultset_create(monitorRowCallback, data)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    resultset_add_column(set, "Monitor", 20, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Status", 10, COL_TYPE_VARCHAR);
 | 
			
		||||
 | 
			
		||||
    spinlock_release(&monLock);
 | 
			
		||||
    return set;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@
 | 
			
		||||
#include <maxscale/platform.h>
 | 
			
		||||
#include <maxscale/server.h>
 | 
			
		||||
#include <maxscale/statistics.h>
 | 
			
		||||
#include "internal/poll.h"
 | 
			
		||||
#include "internal/poll.hh"
 | 
			
		||||
#include "internal/routingworker.hh"
 | 
			
		||||
 | 
			
		||||
using maxscale::Worker;
 | 
			
		||||
@ -231,92 +231,28 @@ poll_get_stat(POLL_STAT what)
 | 
			
		||||
    return RoutingWorker::get_one_statistic(what);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
struct EVENT_TIMES_CB_DATA
 | 
			
		||||
{
 | 
			
		||||
    int rowno;
 | 
			
		||||
    Worker::STATISTICS stats;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provide a row to the result set that defines the event queue statistics
 | 
			
		||||
 *
 | 
			
		||||
 * @param set   The result set
 | 
			
		||||
 * @param data  The index of the row to send
 | 
			
		||||
 * @return The next row or NULL
 | 
			
		||||
 */
 | 
			
		||||
static RESULT_ROW *
 | 
			
		||||
eventTimesRowCallback(RESULTSET *set, void *v)
 | 
			
		||||
{
 | 
			
		||||
    EVENT_TIMES_CB_DATA* data = (EVENT_TIMES_CB_DATA*)v;
 | 
			
		||||
 | 
			
		||||
    char buf[40];
 | 
			
		||||
    RESULT_ROW *row;
 | 
			
		||||
 | 
			
		||||
    if (data->rowno >= Worker::STATISTICS::N_QUEUE_TIMES)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    row = resultset_make_row(set);
 | 
			
		||||
    if (data->rowno == 0)
 | 
			
		||||
    {
 | 
			
		||||
        resultset_row_set(row, 0, "< 100ms");
 | 
			
		||||
    }
 | 
			
		||||
    else if (data->rowno == Worker::STATISTICS::N_QUEUE_TIMES - 1)
 | 
			
		||||
    {
 | 
			
		||||
        snprintf(buf, 39, "> %2d00ms", Worker::STATISTICS::N_QUEUE_TIMES);
 | 
			
		||||
        buf[39] = '\0';
 | 
			
		||||
        resultset_row_set(row, 0, buf);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        snprintf(buf, 39, "%2d00 - %2d00ms", data->rowno, data->rowno + 1);
 | 
			
		||||
        buf[39] = '\0';
 | 
			
		||||
        resultset_row_set(row, 0, buf);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    snprintf(buf, 39, "%u", data->stats.qtimes[data->rowno]);
 | 
			
		||||
    buf[39] = '\0';
 | 
			
		||||
    resultset_row_set(row, 1, buf);
 | 
			
		||||
    snprintf(buf, 39, "%u", data->stats.exectimes[data->rowno]);
 | 
			
		||||
    buf[39] = '\0';
 | 
			
		||||
    resultset_row_set(row, 2, buf);
 | 
			
		||||
    data->rowno++;
 | 
			
		||||
    return row;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return a result set that has the current set of services in it
 | 
			
		||||
 *
 | 
			
		||||
 * @return A Result set
 | 
			
		||||
 */
 | 
			
		||||
RESULTSET *
 | 
			
		||||
eventTimesGetList()
 | 
			
		||||
std::unique_ptr<ResultSet> eventTimesGetList()
 | 
			
		||||
{
 | 
			
		||||
    RESULTSET *set;
 | 
			
		||||
    EVENT_TIMES_CB_DATA *data;
 | 
			
		||||
    std::unique_ptr<ResultSet> set = ResultSet::create({"Duration", "No. Events Queued", "No. Events Executed"});
 | 
			
		||||
    char buf[40];
 | 
			
		||||
    Worker::STATISTICS stats = RoutingWorker::get_statistics();
 | 
			
		||||
 | 
			
		||||
    if ((data = (EVENT_TIMES_CB_DATA*)MXS_MALLOC(sizeof(EVENT_TIMES_CB_DATA))) == NULL)
 | 
			
		||||
    set->add_row({"< 100ms", std::to_string(stats.qtimes[0]), std::to_string(stats.exectimes[0])});
 | 
			
		||||
 | 
			
		||||
    for (int i = 1; i < Worker::STATISTICS::N_QUEUE_TIMES - 1; i++)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
        snprintf(buf, sizeof(buf), "%2d00 - %2d00ms", i, i + 1);
 | 
			
		||||
        set->add_row({buf, std::to_string(stats.qtimes[i]), std::to_string(stats.exectimes[i])});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data->rowno = 0;
 | 
			
		||||
    data->stats = RoutingWorker::get_statistics();
 | 
			
		||||
 | 
			
		||||
    if ((set = resultset_create(eventTimesRowCallback, data)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    resultset_add_column(set, "Duration", 20, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "No. Events Queued", 12, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "No. Events Executed", 12, COL_TYPE_VARCHAR);
 | 
			
		||||
    int idx = Worker::STATISTICS::N_QUEUE_TIMES - 1;
 | 
			
		||||
    snprintf(buf, sizeof(buf), "> %2d00ms", Worker::STATISTICS::N_QUEUE_TIMES);
 | 
			
		||||
    set->add_row({buf, std::to_string(stats.qtimes[idx]), std::to_string(stats.exectimes[idx])});
 | 
			
		||||
 | 
			
		||||
    return set;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@
 | 
			
		||||
 | 
			
		||||
#include "internal/dcb.h"
 | 
			
		||||
#include "internal/modules.h"
 | 
			
		||||
#include "internal/poll.h"
 | 
			
		||||
#include "internal/poll.hh"
 | 
			
		||||
#include "internal/service.hh"
 | 
			
		||||
#include "internal/statistics.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@
 | 
			
		||||
#include <maxscale/server.hh>
 | 
			
		||||
 | 
			
		||||
#include "internal/monitor.h"
 | 
			
		||||
#include "internal/poll.h"
 | 
			
		||||
#include "internal/poll.hh"
 | 
			
		||||
#include "internal/routingworker.hh"
 | 
			
		||||
#include "internal/config.hh"
 | 
			
		||||
#include "internal/service.hh"
 | 
			
		||||
@ -1020,80 +1020,28 @@ size_t server_get_parameter(const SERVER *server, const char *name, char* out, s
 | 
			
		||||
    return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provide a row to the result set that defines the set of servers
 | 
			
		||||
 *
 | 
			
		||||
 * @param set   The result set
 | 
			
		||||
 * @param data  The index of the row to send
 | 
			
		||||
 * @return The next row or NULL
 | 
			
		||||
 */
 | 
			
		||||
static RESULT_ROW *
 | 
			
		||||
serverRowCallback(RESULTSET *set, void *data)
 | 
			
		||||
{
 | 
			
		||||
    int *rowno = (int *)data;
 | 
			
		||||
    int i = 0;
 | 
			
		||||
    char *stat = NULL, buf[20];
 | 
			
		||||
    RESULT_ROW *row = NULL;
 | 
			
		||||
    SERVER *server = NULL;
 | 
			
		||||
 | 
			
		||||
    spinlock_acquire(&server_spin);
 | 
			
		||||
    server = allServers;
 | 
			
		||||
    while (i < *rowno && server)
 | 
			
		||||
    {
 | 
			
		||||
        i++;
 | 
			
		||||
        server = server->next;
 | 
			
		||||
    }
 | 
			
		||||
    if (server == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_release(&server_spin);
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    (*rowno)++;
 | 
			
		||||
    if (server_is_active(server))
 | 
			
		||||
    {
 | 
			
		||||
        row = resultset_make_row(set);
 | 
			
		||||
        resultset_row_set(row, 0, server->name);
 | 
			
		||||
        resultset_row_set(row, 1, server->address);
 | 
			
		||||
        sprintf(buf, "%d", server->port);
 | 
			
		||||
        resultset_row_set(row, 2, buf);
 | 
			
		||||
        sprintf(buf, "%d", server->stats.n_current);
 | 
			
		||||
        resultset_row_set(row, 3, buf);
 | 
			
		||||
        stat = server_status(server);
 | 
			
		||||
        resultset_row_set(row, 4, stat);
 | 
			
		||||
        MXS_FREE(stat);
 | 
			
		||||
    }
 | 
			
		||||
    spinlock_release(&server_spin);
 | 
			
		||||
    return row;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return a resultset that has the current set of servers in it
 | 
			
		||||
 *
 | 
			
		||||
 * @return A Result set
 | 
			
		||||
 */
 | 
			
		||||
RESULTSET *
 | 
			
		||||
serverGetList()
 | 
			
		||||
std::unique_ptr<ResultSet> serverGetList()
 | 
			
		||||
{
 | 
			
		||||
    RESULTSET *set;
 | 
			
		||||
    int *data;
 | 
			
		||||
    std::unique_ptr<ResultSet> set = ResultSet::create({"Server", "Address", "Port", "Connections", "Status"});
 | 
			
		||||
    spinlock_acquire(&server_spin);
 | 
			
		||||
 | 
			
		||||
    if ((data = (int *)MXS_MALLOC(sizeof(int))) == NULL)
 | 
			
		||||
    for (SERVER* server = allServers; server; server = server->next)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
        if (server_is_active(server))
 | 
			
		||||
        {
 | 
			
		||||
            char* stat = server_status(server);
 | 
			
		||||
            set->add_row({server->name, server->address, std::to_string(server->port),
 | 
			
		||||
                         std::to_string(server->stats.n_current), stat});
 | 
			
		||||
            MXS_FREE(stat);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    *data = 0;
 | 
			
		||||
    if ((set = resultset_create(serverRowCallback, data)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    resultset_add_column(set, "Server", 20, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Address", 15, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Port", 5, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Connections", 8, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Status", 20, COL_TYPE_VARCHAR);
 | 
			
		||||
 | 
			
		||||
    spinlock_release(&server_spin);
 | 
			
		||||
    return set;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@
 | 
			
		||||
#include <maxscale/log_manager.h>
 | 
			
		||||
#include <maxscale/poll.h>
 | 
			
		||||
#include <maxscale/protocol.h>
 | 
			
		||||
#include <maxscale/resultset.h>
 | 
			
		||||
#include <maxscale/resultset.hh>
 | 
			
		||||
#include <maxscale/router.h>
 | 
			
		||||
#include <maxscale/server.h>
 | 
			
		||||
#include <maxscale/session.h>
 | 
			
		||||
@ -1741,146 +1741,30 @@ serviceSessionCountAll()
 | 
			
		||||
    return rval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provide a row to the result set that defines the set of service
 | 
			
		||||
 * listeners
 | 
			
		||||
 *
 | 
			
		||||
 * TODO: Replace these
 | 
			
		||||
 *
 | 
			
		||||
 * @param set   The result set
 | 
			
		||||
 * @param data  The index of the row to send
 | 
			
		||||
 * @return The next row or NULL
 | 
			
		||||
 */
 | 
			
		||||
static RESULT_ROW *
 | 
			
		||||
serviceListenerRowCallback(RESULTSET *set, void *data)
 | 
			
		||||
{
 | 
			
		||||
    int *rowno = (int *)data;
 | 
			
		||||
    int i = 0;;
 | 
			
		||||
    char buf[20];
 | 
			
		||||
    RESULT_ROW *row;
 | 
			
		||||
    /* TODO: Fix this
 | 
			
		||||
    SERVICE *service;
 | 
			
		||||
    SERV_LISTENER *lptr = NULL;
 | 
			
		||||
 | 
			
		||||
    spinlock_acquire(&service_spin);
 | 
			
		||||
    service = allServices;
 | 
			
		||||
    if (service)
 | 
			
		||||
    {
 | 
			
		||||
        lptr = service->ports;
 | 
			
		||||
    }
 | 
			
		||||
    while (i < *rowno && service)
 | 
			
		||||
    {
 | 
			
		||||
        lptr = service->ports;
 | 
			
		||||
        while (i < *rowno && lptr)
 | 
			
		||||
        {
 | 
			
		||||
            if ((lptr = lptr->next) != NULL)
 | 
			
		||||
            {
 | 
			
		||||
                i++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (i < *rowno)
 | 
			
		||||
        {
 | 
			
		||||
            service = service->next;
 | 
			
		||||
            if (service && (lptr = service->ports) != NULL)
 | 
			
		||||
            {
 | 
			
		||||
                i++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (lptr == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_release(&service_spin);
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    (*rowno)++;
 | 
			
		||||
    row = resultset_make_row(set);
 | 
			
		||||
    resultset_row_set(row, 0, service->name);
 | 
			
		||||
    resultset_row_set(row, 1, lptr->protocol);
 | 
			
		||||
    resultset_row_set(row, 2, (lptr && lptr->address) ? lptr->address : "*");
 | 
			
		||||
    sprintf(buf, "%d", lptr->port);
 | 
			
		||||
    resultset_row_set(row, 3, buf);
 | 
			
		||||
    resultset_row_set(row, 4, listener_state_to_string(lptr));
 | 
			
		||||
    spinlock_release(&service_spin);
 | 
			
		||||
    return row;
 | 
			
		||||
    */
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return a resultset that has the current set of services in it
 | 
			
		||||
 *
 | 
			
		||||
 * @return A Result set
 | 
			
		||||
 */
 | 
			
		||||
RESULTSET *
 | 
			
		||||
serviceGetListenerList()
 | 
			
		||||
std::unique_ptr<ResultSet> serviceGetListenerList()
 | 
			
		||||
{
 | 
			
		||||
    RESULTSET *set;
 | 
			
		||||
    /* TODO: Fix this
 | 
			
		||||
    int *data;
 | 
			
		||||
 | 
			
		||||
    if ((data = (int *)MXS_MALLOC(sizeof(int))) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    *data = 0;
 | 
			
		||||
    if ((set = resultset_create(serviceListenerRowCallback, data)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    resultset_add_column(set, "Service Name", 25, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Protocol Module", 20, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Address", 15, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Port", 5, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "State", 8, COL_TYPE_VARCHAR);
 | 
			
		||||
    return set;
 | 
			
		||||
     */
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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;
 | 
			
		||||
    /* TODO: Fix this
 | 
			
		||||
    SERVICE *service;
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<ResultSet> set = ResultSet::create({"Service Name", "Protocol Module", "Address", "Port", "State"});
 | 
			
		||||
    spinlock_acquire(&service_spin);
 | 
			
		||||
    service = allServices;
 | 
			
		||||
    while (i < *rowno && service)
 | 
			
		||||
 | 
			
		||||
    for (Service* service : allServices)
 | 
			
		||||
    {
 | 
			
		||||
        i++;
 | 
			
		||||
        service = service->next;
 | 
			
		||||
        LISTENER_ITERATOR iter;
 | 
			
		||||
 | 
			
		||||
        for (SERV_LISTENER* lptr = listener_iterator_init(service, &iter);
 | 
			
		||||
             lptr; lptr = listener_iterator_next(&iter))
 | 
			
		||||
        {
 | 
			
		||||
            set->add_row({service->name, lptr->protocol, lptr->address,
 | 
			
		||||
                         std::to_string(lptr->port), listener_state_to_string(lptr)});
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (service == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_release(&service_spin);
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    (*rowno)++;
 | 
			
		||||
    row = resultset_make_row(set);
 | 
			
		||||
    resultset_row_set(row, 0, service->name);
 | 
			
		||||
    resultset_row_set(row, 1, service->routerModule);
 | 
			
		||||
    sprintf(buf, "%d", service->stats.n_current);
 | 
			
		||||
    resultset_row_set(row, 2, buf);
 | 
			
		||||
    sprintf(buf, "%d", service->stats.n_sessions);
 | 
			
		||||
    resultset_row_set(row, 3, buf);
 | 
			
		||||
 | 
			
		||||
    spinlock_release(&service_spin);
 | 
			
		||||
    return row;
 | 
			
		||||
    */
 | 
			
		||||
    return NULL;
 | 
			
		||||
    return set;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -1888,27 +1772,18 @@ serviceRowCallback(RESULTSET *set, void *data)
 | 
			
		||||
 *
 | 
			
		||||
 * @return A Result set
 | 
			
		||||
 */
 | 
			
		||||
RESULTSET *
 | 
			
		||||
serviceGetList()
 | 
			
		||||
std::unique_ptr<ResultSet> serviceGetList()
 | 
			
		||||
{
 | 
			
		||||
    RESULTSET *set;
 | 
			
		||||
    int *data;
 | 
			
		||||
    std::unique_ptr<ResultSet> set = ResultSet::create({"Service Name", "Router Module", "No. Sessions", "Total Sessions"});
 | 
			
		||||
    spinlock_acquire(&service_spin);
 | 
			
		||||
 | 
			
		||||
    if ((data = (int *)MXS_MALLOC(sizeof(int))) == NULL)
 | 
			
		||||
    for (Service* s : allServices)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
        set->add_row({s->name, s->routerModule, std::to_string(s->stats.n_current),
 | 
			
		||||
                     std::to_string(s->stats.n_sessions)});
 | 
			
		||||
    }
 | 
			
		||||
    *data = 0;
 | 
			
		||||
    if ((set = resultset_create(serviceRowCallback, data)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    resultset_add_column(set, "Service Name", 25, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Router Module", 20, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "No. Sessions", 10, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Total Sessions", 10, COL_TYPE_VARCHAR);
 | 
			
		||||
 | 
			
		||||
    spinlock_release(&service_spin);
 | 
			
		||||
    return set;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -807,79 +807,21 @@ session_get_user(const MXS_SESSION *session)
 | 
			
		||||
    return (session && session->client_dcb) ? session->client_dcb->user : NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Callback structure for the session list extraction
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    int index;
 | 
			
		||||
    int current;
 | 
			
		||||
    SESSIONLISTFILTER filter;
 | 
			
		||||
    RESULT_ROW *row;
 | 
			
		||||
    RESULTSET *set;
 | 
			
		||||
} SESSIONFILTER;
 | 
			
		||||
 | 
			
		||||
bool dcb_iter_cb(DCB *dcb, void *data)
 | 
			
		||||
{
 | 
			
		||||
    SESSIONFILTER *cbdata = (SESSIONFILTER*)data;
 | 
			
		||||
 | 
			
		||||
    if (cbdata->current < cbdata->index)
 | 
			
		||||
    {
 | 
			
		||||
        if (cbdata->filter == SESSION_LIST_ALL ||
 | 
			
		||||
            (cbdata->filter == SESSION_LIST_CONNECTION &&
 | 
			
		||||
             (dcb->session->state != SESSION_STATE_LISTENER)))
 | 
			
		||||
        {
 | 
			
		||||
            cbdata->current++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    if (dcb->dcb_role == DCB_ROLE_CLIENT_HANDLER)
 | 
			
		||||
    {
 | 
			
		||||
        ResultSet* set = static_cast<ResultSet*>(data);
 | 
			
		||||
        MXS_SESSION *ses = dcb->session;
 | 
			
		||||
        char buf[20];
 | 
			
		||||
        MXS_SESSION *list_session = dcb->session;
 | 
			
		||||
        snprintf(buf, sizeof(buf), "%p", ses);
 | 
			
		||||
 | 
			
		||||
        cbdata->index++;
 | 
			
		||||
        cbdata->row = resultset_make_row(cbdata->set);
 | 
			
		||||
        snprintf(buf, sizeof(buf), "%p", list_session);
 | 
			
		||||
        resultset_row_set(cbdata->row, 0, buf);
 | 
			
		||||
        resultset_row_set(cbdata->row, 1, ((list_session->client_dcb && list_session->client_dcb->remote)
 | 
			
		||||
                                           ? list_session->client_dcb->remote : ""));
 | 
			
		||||
        resultset_row_set(cbdata->row, 2, (list_session->service && list_session->service->name
 | 
			
		||||
                                           ? list_session->service->name : ""));
 | 
			
		||||
        resultset_row_set(cbdata->row, 3, session_state(list_session->state));
 | 
			
		||||
        return false;
 | 
			
		||||
        set->add_row({buf, ses->client_dcb->remote, ses->service->name, session_state(ses->state)});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provide a row to the result set that defines the set of sessions
 | 
			
		||||
 *
 | 
			
		||||
 * @param set   The result set
 | 
			
		||||
 * @param data  The index of the row to send
 | 
			
		||||
 * @return The next row or NULL
 | 
			
		||||
 */
 | 
			
		||||
static RESULT_ROW *
 | 
			
		||||
sessionRowCallback(RESULTSET *set, void *data)
 | 
			
		||||
{
 | 
			
		||||
    SESSIONFILTER *cbdata = (SESSIONFILTER*)data;
 | 
			
		||||
    RESULT_ROW *row = NULL;
 | 
			
		||||
 | 
			
		||||
    cbdata->current = 0;
 | 
			
		||||
    dcb_foreach(dcb_iter_cb, cbdata);
 | 
			
		||||
 | 
			
		||||
    if (cbdata->row)
 | 
			
		||||
    {
 | 
			
		||||
        row = cbdata->row;
 | 
			
		||||
        cbdata->row = NULL;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(cbdata);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return row;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return a resultset that has the current set of sessions in it
 | 
			
		||||
 *
 | 
			
		||||
@ -890,38 +832,12 @@ sessionRowCallback(RESULTSET *set, void *data)
 | 
			
		||||
 * so we suppress the warning. In fact, the function call results in return
 | 
			
		||||
 * of the set structure which includes a pointer to data
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*lint -e429 */
 | 
			
		||||
RESULTSET *
 | 
			
		||||
sessionGetList(SESSIONLISTFILTER filter)
 | 
			
		||||
std::unique_ptr<ResultSet> sessionGetList()
 | 
			
		||||
{
 | 
			
		||||
    RESULTSET *set;
 | 
			
		||||
    SESSIONFILTER *data;
 | 
			
		||||
 | 
			
		||||
    if ((data = (SESSIONFILTER *)MXS_MALLOC(sizeof(SESSIONFILTER))) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    data->index = 0;
 | 
			
		||||
    data->filter = filter;
 | 
			
		||||
    data->current = 0;
 | 
			
		||||
    data->row = NULL;
 | 
			
		||||
 | 
			
		||||
    if ((set = resultset_create(sessionRowCallback, data)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        MXS_FREE(data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data->set = set;
 | 
			
		||||
    resultset_add_column(set, "Session", 16, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Client", 15, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "Service", 15, COL_TYPE_VARCHAR);
 | 
			
		||||
    resultset_add_column(set, "State", 15, COL_TYPE_VARCHAR);
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<ResultSet> set = ResultSet::create({"Session", "Client", "Service", "State"});
 | 
			
		||||
    dcb_foreach(dcb_iter_cb, set.get());
 | 
			
		||||
    return set;
 | 
			
		||||
}
 | 
			
		||||
/*lint +e429 */
 | 
			
		||||
 | 
			
		||||
mxs_session_trx_state_t session_get_trx_state(const MXS_SESSION* ses)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,7 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
 | 
			
		||||
#include "../internal/poll.h"
 | 
			
		||||
#include "../internal/poll.hh"
 | 
			
		||||
#include "../internal/routingworker.hh"
 | 
			
		||||
#include "../internal/statistics.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <maxscale/worker.hh>
 | 
			
		||||
#include "../internal/poll.h"
 | 
			
		||||
#include "../internal/poll.hh"
 | 
			
		||||
 | 
			
		||||
using namespace maxscale;
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@
 | 
			
		||||
 | 
			
		||||
#include "internal/dcb.h"
 | 
			
		||||
#include "internal/modules.h"
 | 
			
		||||
#include "internal/poll.h"
 | 
			
		||||
#include "internal/poll.hh"
 | 
			
		||||
#include "internal/service.hh"
 | 
			
		||||
#include "internal/statistics.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user