MXS-2218 Add showing and to_json functionality
This commit is contained in:
@ -45,6 +45,9 @@ public:
|
|||||||
void add_task(const char* zName, TASKFN func, void* pData, int frequency);
|
void add_task(const char* zName, TASKFN func, void* pData, int frequency);
|
||||||
void remove_task(const char* zName);
|
void remove_task(const char* zName);
|
||||||
|
|
||||||
|
void show_tasks(DCB* pDcb) const;
|
||||||
|
json_t* tasks_to_json(const char* zhost) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool pre_run() override;
|
bool pre_run() override;
|
||||||
void post_run() override;
|
void post_run() override;
|
||||||
@ -53,10 +56,12 @@ private:
|
|||||||
struct Task
|
struct Task
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Task(const char* zName, TASKFN func, void* pData)
|
Task(const char* zName, TASKFN func, void* pData, int frequency)
|
||||||
: name(zName)
|
: name(zName)
|
||||||
, func(func)
|
, func(func)
|
||||||
, pData(pData)
|
, pData(pData)
|
||||||
|
, frequency(frequency)
|
||||||
|
, nextdue(time(0) + frequency)
|
||||||
, id(0)
|
, id(0)
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
@ -64,6 +69,8 @@ private:
|
|||||||
std::string name;
|
std::string name;
|
||||||
TASKFN func;
|
TASKFN func;
|
||||||
void* pData;
|
void* pData;
|
||||||
|
int frequency;
|
||||||
|
time_t nextdue;
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <maxscale/mainworker.hh>
|
#include <maxscale/mainworker.hh>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <maxscale/config.hh>
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@ -54,7 +55,7 @@ void MainWorker::add_task(const char* zName, TASKFN func, void* pData, int frequ
|
|||||||
call([=]() {
|
call([=]() {
|
||||||
mxb_assert(m_tasks_by_name.find(zName) == m_tasks_by_name.end());
|
mxb_assert(m_tasks_by_name.find(zName) == m_tasks_by_name.end());
|
||||||
|
|
||||||
Task task(zName, func, pData);
|
Task task(zName, func, pData, frequency);
|
||||||
|
|
||||||
auto p = m_tasks_by_name.insert(std::make_pair(std::string(zName), task));
|
auto p = m_tasks_by_name.insert(std::make_pair(std::string(zName), task));
|
||||||
Task& inserted_task = (*p.first).second;
|
Task& inserted_task = (*p.first).second;
|
||||||
@ -84,6 +85,65 @@ void MainWorker::remove_task(const char* zName)
|
|||||||
EXECUTE_AUTO);
|
EXECUTE_AUTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWorker::show_tasks(DCB* pDcb) const
|
||||||
|
{
|
||||||
|
// TODO: Make call() const.
|
||||||
|
MainWorker* pThis = const_cast<MainWorker*>(this);
|
||||||
|
pThis->call([this, pDcb] () {
|
||||||
|
dcb_printf(pDcb, "%-25s | Frequency | Next Due\n", "Name");
|
||||||
|
dcb_printf(pDcb, "--------------------------+-----------+-------------------------\n");
|
||||||
|
|
||||||
|
for (auto it = m_tasks_by_name.begin(); it != m_tasks_by_name.end(); ++it)
|
||||||
|
{
|
||||||
|
const Task& task = it->second;
|
||||||
|
|
||||||
|
struct tm tm;
|
||||||
|
char buf[40];
|
||||||
|
localtime_r(&task.nextdue, &tm);
|
||||||
|
asctime_r(&tm, buf);
|
||||||
|
dcb_printf(pDcb, "%-25s | %-9d | %s", task.name.c_str(), task.frequency, buf);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
EXECUTE_AUTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
json_t* MainWorker::tasks_to_json(const char* zHost) const
|
||||||
|
{
|
||||||
|
json_t* pResult = json_array();
|
||||||
|
|
||||||
|
// TODO: Make call() const.
|
||||||
|
MainWorker* pThis = const_cast<MainWorker*>(this);
|
||||||
|
pThis->call([this, zHost, pResult]() {
|
||||||
|
for (auto it = m_tasks_by_name.begin(); it != m_tasks_by_name.end(); ++it)
|
||||||
|
{
|
||||||
|
const Task& task = it->second;
|
||||||
|
|
||||||
|
struct tm tm;
|
||||||
|
char buf[40];
|
||||||
|
localtime_r(&task.nextdue, &tm);
|
||||||
|
asctime_r(&tm, buf);
|
||||||
|
char* nl = strchr(buf, '\n');
|
||||||
|
mxb_assert(nl);
|
||||||
|
*nl = '\0';
|
||||||
|
|
||||||
|
json_t* pObject = json_object();
|
||||||
|
|
||||||
|
json_object_set_new(pObject, CN_ID, json_string(task.name.c_str()));
|
||||||
|
json_object_set_new(pObject, CN_TYPE, json_string("tasks"));
|
||||||
|
|
||||||
|
json_t* pAttrs = json_object();
|
||||||
|
json_object_set_new(pAttrs, "frequency", json_integer(task.frequency));
|
||||||
|
json_object_set_new(pAttrs, "next_execution", json_string(buf));
|
||||||
|
|
||||||
|
json_object_set_new(pObject, CN_ATTRIBUTES, pAttrs);
|
||||||
|
json_array_append_new(pResult, pObject);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
EXECUTE_AUTO);
|
||||||
|
|
||||||
|
return pResult;
|
||||||
|
}
|
||||||
|
|
||||||
bool MainWorker::pre_run()
|
bool MainWorker::pre_run()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@ -107,7 +167,11 @@ bool MainWorker::call_task(Worker::Call::action_t action, MainWorker::Task* pTas
|
|||||||
|
|
||||||
call_again = pTask->func(pTask->pData);
|
call_again = pTask->func(pTask->pData);
|
||||||
|
|
||||||
if (!call_again)
|
if (call_again)
|
||||||
|
{
|
||||||
|
pTask->nextdue = time(0) + pTask->frequency;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
auto it = m_tasks_by_name.find(pTask->name);
|
auto it = m_tasks_by_name.find(pTask->name);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user