Skip to content
Permalink
Browse files
MDEV-5313 Improving audit api.
JSON api implementations and tests pushed.
sql_acl.cc fixed with the new function names.
  • Loading branch information
Alexey Botchkov committed Jan 16, 2019
1 parent edba047 commit 294d9bf
Show file tree
Hide file tree
Showing 10 changed files with 174 additions and 127 deletions.
@@ -425,10 +425,6 @@ int json_path_compare(const json_path_t *a, const json_path_t *b,

int json_valid(const char *js, size_t js_len, CHARSET_INFO *cs);

int json_get_object_by_key(const char *js, size_t js_len,
const char *key, size_t key_len,
enum json_value_types *value_type,
const char **value_start, size_t *value_len);
#ifdef __cplusplus
}
#endif
@@ -388,33 +388,33 @@
};
extern struct json_service_st {
enum json_types (*json_type)(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_array_item)(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_object_key)(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types (*json_get_object_nkey)(const char *js,const char *js_end,
int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int (*json_escape_string)(const char *str,const char *str_end,
char *json, char *json_end);
int (*json_unescape_json)(const char *json_str, const char *json_end,
char *res, char *res_end);
} *json_service;
enum json_types json_type(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_array_item(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_object_key(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types json_get_object_nkey(const char *js,const char *js_end, int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int json_escape_string(const char *str,const char *str_end,
char *json, char *json_end);
int json_unescape_json(const char *json_str, const char *json_end,
@@ -388,33 +388,33 @@
};
extern struct json_service_st {
enum json_types (*json_type)(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_array_item)(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_object_key)(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types (*json_get_object_nkey)(const char *js,const char *js_end,
int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int (*json_escape_string)(const char *str,const char *str_end,
char *json, char *json_end);
int (*json_unescape_json)(const char *json_str, const char *json_end,
char *res, char *res_end);
} *json_service;
enum json_types json_type(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_array_item(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_object_key(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types json_get_object_nkey(const char *js,const char *js_end, int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int json_escape_string(const char *str,const char *str_end,
char *json, char *json_end);
int json_unescape_json(const char *json_str, const char *json_end,
@@ -388,33 +388,33 @@
};
extern struct json_service_st {
enum json_types (*json_type)(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_array_item)(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_object_key)(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types (*json_get_object_nkey)(const char *js,const char *js_end,
int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int (*json_escape_string)(const char *str,const char *str_end,
char *json, char *json_end);
int (*json_unescape_json)(const char *json_str, const char *json_end,
char *res, char *res_end);
} *json_service;
enum json_types json_type(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_array_item(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_object_key(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types json_get_object_nkey(const char *js,const char *js_end, int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int json_escape_string(const char *str,const char *str_end,
char *json, char *json_end);
int json_unescape_json(const char *json_str, const char *json_end,
@@ -388,33 +388,33 @@
};
extern struct json_service_st {
enum json_types (*json_type)(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_array_item)(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_object_key)(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types (*json_get_object_nkey)(const char *js,const char *js_end,
int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int (*json_escape_string)(const char *str,const char *str_end,
char *json, char *json_end);
int (*json_unescape_json)(const char *json_str, const char *json_end,
char *res, char *res_end);
} *json_service;
enum json_types json_type(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_array_item(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_object_key(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types json_get_object_nkey(const char *js,const char *js_end, int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int json_escape_string(const char *str,const char *str_end,
char *json, char *json_end);
int json_unescape_json(const char *json_str, const char *json_end,
@@ -388,33 +388,33 @@
};
extern struct json_service_st {
enum json_types (*json_type)(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_array_item)(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_object_key)(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types (*json_get_object_nkey)(const char *js,const char *js_end,
int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int (*json_escape_string)(const char *str,const char *str_end,
char *json, char *json_end);
int (*json_unescape_json)(const char *json_str, const char *json_end,
char *res, char *res_end);
} *json_service;
enum json_types json_type(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_array_item(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_object_key(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types json_get_object_nkey(const char *js,const char *js_end, int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int json_escape_string(const char *str,const char *str_end,
char *json, char *json_end);
int json_unescape_json(const char *json_str, const char *json_end,
@@ -61,17 +61,17 @@ enum json_types

extern struct json_service_st {
enum json_types (*json_type)(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_array_item)(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types (*json_get_object_key)(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types (*json_get_object_nkey)(const char *js,const char *js_end,
int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int (*json_escape_string)(const char *str,const char *str_end,
char *json, char *json_end);
int (*json_unescape_json)(const char *json_str, const char *json_end,
@@ -90,16 +90,16 @@ extern struct json_service_st {
#else

enum json_types json_type(const char *js, const char *js_end,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_array_item(const char *js, const char *js_end,
int n_item,
const char **v, int *vlen);
const char **value, int *value_len);
enum json_types json_get_object_key(const char *js, const char *js_end,
const char *key,
const char **v, int *vlen);
const char *key, const char *key_end,
const char **value, int *value_len);
enum json_types json_get_object_nkey(const char *js,const char *js_end, int nkey,
const char **keyname, const char **keyname_end,
const char **v, int *vlen);
const char **value, int *value_len);
int json_escape_string(const char *str,const char *str_end,
char *json, char *json_end);
int json_unescape_json(const char *json_str, const char *json_end,
@@ -1291,20 +1291,23 @@ class User_table_json: public User_table
return 0;
}
bool get_value(const char *key, size_t klen,
enum json_value_types vt, const char **v, size_t *vl) const
enum json_types vt, const char **v, size_t *vl) const
{
enum json_value_types value_type;
enum json_types value_type;
int int_vl;
String str, *res= m_table->field[2]->val_str(&str);
if (!res || json_get_object_by_key(res->ptr(), res->length(), key, klen,
&value_type, v, vl))
if (!res ||
(value_type= json_get_object_key(res->ptr(), res->end(),
key, key+klen, v, &int_vl)) == JSV_BAD_JSON)
return 1; // invalid
*vl= int_vl;
return value_type != vt;
}
const char *get_str_value(MEM_ROOT *root, const char *key, size_t klen) const
{
size_t value_len;
const char *value_start;
if (get_value(key, klen, JSON_VALUE_STRING, &value_start, &value_len))
if (get_value(key, klen, JSV_STRING, &value_start, &value_len))
return "";
char *ptr= (char*)alloca(value_len);
int len= json_unescape(m_table->field[2]->charset(),
@@ -1321,7 +1324,7 @@ class User_table_json: public User_table
int err;
size_t value_len;
const char *value_start;
if (get_value(key, klen, JSON_VALUE_NUMBER, &value_start, &value_len))
if (get_value(key, klen, JSV_NUMBER, &value_start, &value_len))
return 0;
const char *value_end= value_start + value_len;
return my_strtoll10(value_start, (char**)&value_end, &err);
@@ -1331,7 +1334,7 @@ class User_table_json: public User_table
int err;
size_t value_len;
const char *value_start;
if (get_value(key, klen, JSON_VALUE_NUMBER, &value_start, &value_len))
if (get_value(key, klen, JSV_NUMBER, &value_start, &value_len))
return 0;
const char *value_end= value_start + value_len;
return my_strtod(value_start, (char**)&value_end, &err);
@@ -1340,25 +1343,26 @@ class User_table_json: public User_table
{
size_t value_len;
const char *value_start;
if (get_value(key, klen, JSON_VALUE_TRUE, &value_start, &value_len))
if (get_value(key, klen, JSV_TRUE, &value_start, &value_len))
return false;
return true;
}
bool set_value(const char *key, size_t klen,
const char *val, size_t vlen, bool string) const
{
size_t value_len;
int value_len;
const char *value_start;
enum json_value_types value_type;
enum json_types value_type;
String str, *res= m_table->field[2]->val_str(&str);
if (!res || !res->length())
(res= &str)->set(STRING_WITH_LEN("{}"), m_table->field[2]->charset());
if (json_get_object_by_key(res->ptr(), res->length(), key, klen,
&value_type, &value_start, &value_len))
value_type= json_get_object_key(res->ptr(), res->end(), key, key+klen,
&value_start, &value_len);
if (value_type == JSV_BAD_JSON)
return 1; // invalid
StringBuffer<JSON_SIZE> json(res->charset());
json.copy(res->ptr(), value_start - res->ptr(), res->charset());
if (!value_type)
if (value_type == JSV_NOTHING)
{
if (value_len)
json.append(',');

0 comments on commit 294d9bf

Please sign in to comment.