MXS-2218 Add showing and to_json functionality
This commit is contained in:
parent
d50ae1fb8a
commit
2d2f62ed6f
@ -45,6 +45,9 @@ public:
|
||||
void add_task(const char* zName, TASKFN func, void* pData, int frequency);
|
||||
void remove_task(const char* zName);
|
||||
|
||||
void show_tasks(DCB* pDcb) const;
|
||||
json_t* tasks_to_json(const char* zhost) const;
|
||||
|
||||
private:
|
||||
bool pre_run() override;
|
||||
void post_run() override;
|
||||
@ -53,10 +56,12 @@ private:
|
||||
struct Task
|
||||
{
|
||||
public:
|
||||
Task(const char* zName, TASKFN func, void* pData)
|
||||
Task(const char* zName, TASKFN func, void* pData, int frequency)
|
||||
: name(zName)
|
||||
, func(func)
|
||||
, pData(pData)
|
||||
, frequency(frequency)
|
||||
, nextdue(time(0) + frequency)
|
||||
, id(0)
|
||||
{
|
||||
};
|
||||
@ -64,6 +69,8 @@ private:
|
||||
std::string name;
|
||||
TASKFN func;
|
||||
void* pData;
|
||||
int frequency;
|
||||
time_t nextdue;
|
||||
uint32_t id;
|
||||
};
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include <maxscale/mainworker.hh>
|
||||
#include <signal.h>
|
||||
#include <maxscale/config.hh>
|
||||
|
||||
namespace
|
||||
{
|
||||
@ -54,7 +55,7 @@ void MainWorker::add_task(const char* zName, TASKFN func, void* pData, int frequ
|
||||
call([=]() {
|
||||
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));
|
||||
Task& inserted_task = (*p.first).second;
|
||||
@ -84,6 +85,65 @@ void MainWorker::remove_task(const char* zName)
|
||||
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()
|
||||
{
|
||||
return true;
|
||||
@ -107,7 +167,11 @@ bool MainWorker::call_task(Worker::Call::action_t action, MainWorker::Task* pTas
|
||||
|
||||
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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user