MXS-1779 Add initial support for classification URL
This commit introduces the plumbing support for obtaining classification information of a statement using the REST-API. It introduces a URL like /v1/maxscale/query_classifier/classify?sql=SELECT+1 that in the response will return a JSON object with the information. Subsequent commits will provide the actual information.
This commit is contained in:
@ -110,6 +110,7 @@ extern const char CN_AUTH_READ_TIMEOUT[];
|
|||||||
extern const char CN_AUTH_WRITE_TIMEOUT[];
|
extern const char CN_AUTH_WRITE_TIMEOUT[];
|
||||||
extern const char CN_AUTO[];
|
extern const char CN_AUTO[];
|
||||||
extern const char CN_CACHE_SIZE[];
|
extern const char CN_CACHE_SIZE[];
|
||||||
|
extern const char CN_CLASSIFY[];
|
||||||
extern const char CN_CONNECTION_TIMEOUT[];
|
extern const char CN_CONNECTION_TIMEOUT[];
|
||||||
extern const char CN_DUMP_LAST_STATEMENTS[];
|
extern const char CN_DUMP_LAST_STATEMENTS[];
|
||||||
extern const char CN_DATA[];
|
extern const char CN_DATA[];
|
||||||
|
@ -36,6 +36,7 @@ MXS_BEGIN_DECLS
|
|||||||
#define MXS_JSON_API_MODULES "/maxscale/modules/"
|
#define MXS_JSON_API_MODULES "/maxscale/modules/"
|
||||||
#define MXS_JSON_API_QC_STATS "/maxscale/qc_stats/"
|
#define MXS_JSON_API_QC_STATS "/maxscale/qc_stats/"
|
||||||
#define MXS_JSON_API_QC "/maxscale/query_classifier/"
|
#define MXS_JSON_API_QC "/maxscale/query_classifier/"
|
||||||
|
#define MXS_JSON_API_QC_CLASSIFY "/maxscale/query_classifier/classify"
|
||||||
#define MXS_JSON_API_USERS "/users/"
|
#define MXS_JSON_API_USERS "/users/"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,6 +91,7 @@ const char CN_AUTH_READ_TIMEOUT[] = "auth_read_timeout";
|
|||||||
const char CN_AUTH_WRITE_TIMEOUT[] = "auth_write_timeout";
|
const char CN_AUTH_WRITE_TIMEOUT[] = "auth_write_timeout";
|
||||||
const char CN_AUTO[] = "auto";
|
const char CN_AUTO[] = "auto";
|
||||||
const char CN_CACHE_SIZE[] = "cache_size";
|
const char CN_CACHE_SIZE[] = "cache_size";
|
||||||
|
const char CN_CLASSIFY[] = "classify";
|
||||||
const char CN_CONNECTION_TIMEOUT[] = "connection_timeout";
|
const char CN_CONNECTION_TIMEOUT[] = "connection_timeout";
|
||||||
const char CN_DATA[] = "data";
|
const char CN_DATA[] = "data";
|
||||||
const char CN_DEFAULT[] = "default";
|
const char CN_DEFAULT[] = "default";
|
||||||
|
@ -56,4 +56,14 @@ std::unique_ptr<json_t> qc_as_json(const char* zHost);
|
|||||||
*/
|
*/
|
||||||
bool qc_alter_from_json(json_t* pJson);
|
bool qc_alter_from_json(json_t* pJson);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classify statement
|
||||||
|
*
|
||||||
|
* @param zHost The MaxScale host.
|
||||||
|
* @param statement The statement to be classified.
|
||||||
|
*
|
||||||
|
* @return A json object containing information about the statement.
|
||||||
|
*/
|
||||||
|
std::unique_ptr<json_t> qc_classify_as_json(const char* zHost, const std::string& statement);
|
||||||
|
|
||||||
MXS_END_DECLS
|
MXS_END_DECLS
|
||||||
|
@ -1376,3 +1376,21 @@ bool qc_alter_from_json(json_t* pJson)
|
|||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::unique_ptr<json_t> qc_classify_as_json(const char* zHost, const std::string& statement)
|
||||||
|
{
|
||||||
|
json_t* pParams = json_object();
|
||||||
|
|
||||||
|
// TODO: Fill object with classification information.
|
||||||
|
|
||||||
|
json_t* pAttributes = json_object();
|
||||||
|
json_object_set_new(pAttributes, CN_PARAMETERS, pParams);
|
||||||
|
|
||||||
|
json_t* pSelf = json_object();
|
||||||
|
json_object_set_new(pSelf, CN_ID, json_string(CN_CLASSIFY));
|
||||||
|
json_object_set_new(pSelf, CN_TYPE, json_string(CN_CLASSIFY));
|
||||||
|
json_object_set_new(pSelf, CN_ATTRIBUTES, pAttributes);
|
||||||
|
|
||||||
|
return std::unique_ptr<json_t>(mxs_json_resource(zHost, MXS_JSON_API_QC_CLASSIFY, pSelf));
|
||||||
|
}
|
||||||
|
@ -677,6 +677,13 @@ HttpResponse cb_qc(const HttpRequest& request)
|
|||||||
return HttpResponse(MHD_HTTP_OK, qc_as_json(request.host()).release());
|
return HttpResponse(MHD_HTTP_OK, qc_as_json(request.host()).release());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HttpResponse cb_qc_classify(const HttpRequest& request)
|
||||||
|
{
|
||||||
|
string sql = request.get_option("sql");
|
||||||
|
|
||||||
|
return HttpResponse(MHD_HTTP_OK, qc_classify_as_json(request.host(), sql).release());
|
||||||
|
}
|
||||||
|
|
||||||
HttpResponse cb_thread(const HttpRequest& request)
|
HttpResponse cb_thread(const HttpRequest& request)
|
||||||
{
|
{
|
||||||
int id = atoi(request.last_uri_part().c_str());
|
int id = atoi(request.last_uri_part().c_str());
|
||||||
@ -950,6 +957,8 @@ public:
|
|||||||
|
|
||||||
m_get.push_back(SResource(new Resource(cb_maxscale, 1, "maxscale")));
|
m_get.push_back(SResource(new Resource(cb_maxscale, 1, "maxscale")));
|
||||||
m_get.push_back(SResource(new Resource(cb_qc, 2, "maxscale", "query_classifier")));
|
m_get.push_back(SResource(new Resource(cb_qc, 2, "maxscale", "query_classifier")));
|
||||||
|
m_get.push_back(SResource(new Resource(cb_qc_classify, 3,
|
||||||
|
"maxscale", "query_classifier", "classify")));
|
||||||
m_get.push_back(SResource(new Resource(cb_all_threads, 2, "maxscale", "threads")));
|
m_get.push_back(SResource(new Resource(cb_all_threads, 2, "maxscale", "threads")));
|
||||||
m_get.push_back(SResource(new Resource(cb_thread, 3, "maxscale", "threads", ":thread")));
|
m_get.push_back(SResource(new Resource(cb_thread, 3, "maxscale", "threads", ":thread")));
|
||||||
m_get.push_back(SResource(new Resource(cb_logs, 2, "maxscale", "logs")));
|
m_get.push_back(SResource(new Resource(cb_logs, 2, "maxscale", "logs")));
|
||||||
|
Reference in New Issue
Block a user