From c6378e100663d3fa455ae743618ced4f2423896d Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Mon, 5 Nov 2018 16:33:13 +0200 Subject: [PATCH] MXS-1780 Make retained statements available via REST-API --- server/core/internal/session.hh | 2 + server/core/session.cc | 65 ++++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/server/core/internal/session.hh b/server/core/internal/session.hh index 105ca4ca5..8c8002455 100644 --- a/server/core/internal/session.hh +++ b/server/core/internal/session.hh @@ -82,6 +82,8 @@ public: void retain_statement(GWBUF* pBuffer); void dump_statements() const; + json_t* statements_as_json() const; + void link_backend_dcb(DCB* dcb) { mxb_assert(m_dcb_set.count(dcb) == 0); diff --git a/server/core/session.cc b/server/core/session.cc index 2c9eee259..0de912e9a 100644 --- a/server/core/session.cc +++ b/server/core/session.cc @@ -897,6 +897,9 @@ json_t* session_json_data(const Session* session, const char* host) json_object_set_new(attr, "connections", dcb_arr); + json_t* statements = session->statements_as_json(); + json_object_set_new(attr, "statements", statements); + json_object_set_new(data, CN_ATTRIBUTES, attr); json_object_set_new(data, CN_LINKS, mxs_json_self_link(host, CN_SESSIONS, ss.str().c_str())); @@ -1187,6 +1190,28 @@ Session::~Session() } } +namespace +{ + +bool get_stmt(GWBUF* pBuffer, char** ppStmt, int* pLen) +{ + mxb_assert(modutil_is_SQL(pBuffer)); + + if (GWBUF_IS_CONTIGUOUS(pBuffer)) + { + modutil_extract_SQL(pBuffer, ppStmt, pLen); + } + else + { + *ppStmt = modutil_get_SQL(pBuffer); + *pLen = strlen(*ppStmt); + } + + return !GWBUF_IS_CONTIGUOUS(pBuffer); +} + +} + void Session::dump_statements() const { if (retain_last_statements) @@ -1205,22 +1230,11 @@ void Session::dump_statements() const for (auto i = m_last_statements.rbegin(); i != m_last_statements.rend(); ++i) { - std::shared_ptr sBuffer = *i; - GWBUF* pBuffer = sBuffer.get(); - - mxb_assert(modutil_is_SQL(pBuffer)); + const std::shared_ptr& sBuffer = *i; char* pStmt; int len; - - if (GWBUF_IS_CONTIGUOUS(pBuffer)) - { - modutil_extract_SQL(pBuffer, &pStmt, &len); - } - else - { - pStmt = modutil_get_SQL(pBuffer); - } + bool deallocate = get_stmt(sBuffer.get(), &pStmt, &len); if (id != 0) { @@ -1234,7 +1248,7 @@ void Session::dump_statements() const MXS_NOTICE("(%" PRIu64 ") Stmt %d: %.*s", ses_id, n, len, pStmt); } - if (!GWBUF_IS_CONTIGUOUS(pBuffer)) + if (deallocate) { MXS_FREE(pStmt); } @@ -1244,6 +1258,29 @@ void Session::dump_statements() const } } +json_t* Session::statements_as_json() const +{ + json_t* pStatements = json_array(); + + for (auto i = m_last_statements.rbegin(); i != m_last_statements.rend(); ++i) + { + const std::shared_ptr& sBuffer = *i; + + char* pStmt; + int len; + bool deallocate = get_stmt(sBuffer.get(), &pStmt, &len); + + json_array_append_new(pStatements, json_stringn(pStmt, len)); + + if (deallocate) + { + MXS_FREE(pStmt); + } + } + + return pStatements; +} + bool Session::setup_filters(Service* service) { for (const auto& a : service->get_filters())