Format filters

This commit is contained in:
Markus Mäkelä
2019-05-09 11:17:34 +03:00
parent 418ccf861d
commit fbd61967a7
54 changed files with 608 additions and 602 deletions

View File

@ -124,7 +124,7 @@ json_t* Cache::show_json() const
cache_result_t Cache::get_key(const char* zDefault_db,
const GWBUF* pQuery,
CACHE_KEY* pKey) const
CACHE_KEY* pKey) const
{
// TODO: Take config into account.
return get_default_key(zDefault_db, pQuery, pKey);
@ -133,7 +133,7 @@ cache_result_t Cache::get_key(const char* zDefault_db,
// static
cache_result_t Cache::get_default_key(const char* zDefault_db,
const GWBUF* pQuery,
CACHE_KEY* pKey)
CACHE_KEY* pKey)
{
mxb_assert(GWBUF_IS_CONTIGUOUS(pQuery));
@ -211,7 +211,7 @@ json_t* Cache::do_get_info(uint32_t what) const
}
//static
// static
uint64_t Cache::time_ms()
{
timespec t;
@ -219,7 +219,7 @@ uint64_t Cache::time_ms()
int rv = clock_gettime(CLOCK_MONOTONIC_COARSE, &t);
if (rv != 0)
{
mxb_assert(errno == EINVAL); // CLOCK_MONOTONIC_COARSE not supported.
mxb_assert(errno == EINVAL); // CLOCK_MONOTONIC_COARSE not supported.
rv = clock_gettime(CLOCK_MONOTONIC, &t);
mxb_assert(rv == 0);
}

View File

@ -112,7 +112,7 @@ public:
*/
cache_result_t get_key(const char* zDefault_db,
const GWBUF* pQuery,
CACHE_KEY* pKey) const;
CACHE_KEY* pKey) const;
/**
* Returns a key for the statement. Does not take the current config
@ -126,7 +126,7 @@ public:
*/
static cache_result_t get_default_key(const char* zDefault_db,
const GWBUF* pQuery,
CACHE_KEY* pKey);
CACHE_KEY* pKey);
/**
* See @Storage::get_value
@ -135,7 +135,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const = 0;
GWBUF** ppValue) const = 0;
/**
* See @Storage::put_value

View File

@ -231,7 +231,7 @@ typedef struct cache_storage_api
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** result);
GWBUF** result);
/**
* Put a value to the cache.

View File

@ -41,7 +41,7 @@ config::ParamDuration<std::chrono::milliseconds> CacheConfig::s_hard_ttl(
"used before it is discarded and the result is fetched from the backend. "
"See also 'soft_ttl'.",
mxs::config::INTERPRET_AS_SECONDS,
std::chrono::milliseconds { 0 }
std::chrono::milliseconds {0}
);
config::ParamDuration<std::chrono::milliseconds> CacheConfig::s_soft_ttl(
@ -51,7 +51,7 @@ config::ParamDuration<std::chrono::milliseconds> CacheConfig::s_soft_ttl(
"used before the first client querying for the result is used for refreshing "
"the cached data from the backend. See also 'hard_ttl'.",
mxs::config::INTERPRET_AS_SECONDS,
std::chrono::milliseconds { 0 }
std::chrono::milliseconds {0}
);
config::ParamCount CacheConfig::s_max_resultset_rows(
@ -107,10 +107,10 @@ config::ParamEnum<cache_thread_model_t> CacheConfig::s_thread_model(
&s_specification,
"cached_data",
"An enumeration option specifying how data is shared between threads.",
{
{ CACHE_THREAD_MODEL_MT, "shared" },
{ CACHE_THREAD_MODEL_ST, "thread_specific" }
},
{
{CACHE_THREAD_MODEL_MT, "shared"},
{CACHE_THREAD_MODEL_ST, "thread_specific"}
},
CACHE_THREAD_MODEL_ST
);
@ -119,10 +119,10 @@ config::ParamEnum<cache_selects_t> CacheConfig::s_selects(
"selects",
"An enumeration option specifying what approach the cache should take with "
"respect to SELECT statements.",
{
{ CACHE_SELECTS_ASSUME_CACHEABLE, "assume_cacheable" },
{ CACHE_SELECTS_VERIFY_CACHEABLE, "verify_cacheable" }
},
{
{CACHE_SELECTS_ASSUME_CACHEABLE, "assume_cacheable"},
{CACHE_SELECTS_VERIFY_CACHEABLE, "verify_cacheable"}
},
CACHE_SELECTS_ASSUME_CACHEABLE
);
@ -131,11 +131,11 @@ config::ParamEnum<cache_in_trxs_t> CacheConfig::s_cache_in_trxs(
"cache_in_transactions",
"An enumeration option specifying how the cache should behave when there "
"are active transactions.",
{
{ CACHE_IN_TRXS_NEVER, "never" },
{ CACHE_IN_TRXS_READ_ONLY, "read_only_transactions" },
{ CACHE_IN_TRXS_ALL, "all_transactions" }
},
{
{CACHE_IN_TRXS_NEVER, "never"},
{CACHE_IN_TRXS_READ_ONLY, "read_only_transactions"},
{CACHE_IN_TRXS_ALL, "all_transactions"}
},
CACHE_IN_TRXS_ALL
);
@ -224,7 +224,7 @@ bool CacheConfig::configure()
if (this->soft_ttl > this->hard_ttl)
{
MXS_WARNING("The value of 'soft_ttl' must be less than or equal to that of 'hard_ttl'. "
"Setting 'soft_ttl' to the same value as 'hard_ttl'.");
"Setting 'soft_ttl' to the same value as 'hard_ttl'.");
this->soft_ttl = this->hard_ttl;
}

View File

@ -42,7 +42,7 @@ public:
~CacheConfig();
CacheConfig(const CacheConfig&) = delete;
CacheConfig& operator = (const CacheConfig&) = delete;
CacheConfig& operator=(const CacheConfig&) = delete;
using milliseconds = std::chrono::milliseconds;
@ -60,9 +60,9 @@ public:
config::Enum<cache_selects_t> selects;
config::Enum<cache_in_trxs_t> cache_in_trxs;
config::Bool enabled;
char* zStorage_options { nullptr}; /**< Raw options for storage module. */
char** storage_argv { nullptr }; /**< Cooked options for storage module. */
int storage_argc { 0 }; /**< Number of cooked options. */
char* zStorage_options {nullptr}; /**< Raw options for storage module. */
char** storage_argv {nullptr}; /**< Cooked options for storage module. */
int storage_argc {0}; /**< Number of cooked options. */
static const config::Specification& specification()
{
@ -73,7 +73,7 @@ private:
bool configure() override;
private:
static config::Specification s_specification;
static config::Specification s_specification;
static config::ParamString s_storage;
static config::ParamString s_storage_options;

View File

@ -50,7 +50,7 @@ CachePT::CachePT(const std::string& name,
const CacheConfig* pConfig,
const std::vector<SCacheRules>& rules,
SStorageFactory sFactory,
const Caches& caches)
const Caches& caches)
: Cache(name, pConfig, rules, sFactory)
, m_caches(caches)
{
@ -131,7 +131,7 @@ cache_result_t CachePT::get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
return thread_cache().get_value(key, flags, soft_ttl, hard_ttl, ppValue);
}

View File

@ -36,7 +36,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const;
GWBUF** ppValue) const;
cache_result_t put_value(const CACHE_KEY& key, const GWBUF* pValue);
@ -50,7 +50,7 @@ private:
const CacheConfig* pConfig,
const std::vector<SCacheRules>& rules,
SStorageFactory sFactory,
const Caches& caches);
const Caches& caches);
static CachePT* Create(const std::string& name,
const CacheConfig* pConfig,

View File

@ -56,7 +56,7 @@ cache_result_t CacheSimple::get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
return m_pStorage->get_value(key, flags, soft_ttl, hard_ttl, ppValue);
}

View File

@ -28,7 +28,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const;
GWBUF** ppValue) const;
cache_result_t put_value(const CACHE_KEY& key, const GWBUF* pValue);

View File

@ -76,7 +76,7 @@ cache_result_t LRUStorage::do_get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
return access_value(APPROACH_GET, key, flags, soft_ttl, hard_ttl, ppValue);
}
@ -220,11 +220,11 @@ cache_result_t LRUStorage::do_get_items(uint64_t* pItems) const
}
cache_result_t LRUStorage::access_value(access_approach_t approach,
const CACHE_KEY& key,
const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
cache_result_t result = CACHE_RESULT_NOT_FOUND;

View File

@ -43,7 +43,7 @@ protected:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const;
GWBUF** ppValue) const;
/**
* @see Storage::put_value
@ -89,15 +89,15 @@ private:
};
cache_result_t access_value(access_approach_t approach,
const CACHE_KEY& key,
const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const;
GWBUF** ppValue) const;
cache_result_t peek_value(const CACHE_KEY& key,
uint32_t flags,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
return access_value(APPROACH_PEEK, key, flags, CACHE_USE_CONFIG_TTL, CACHE_USE_CONFIG_TTL, ppValue);
}

View File

@ -45,7 +45,7 @@ cache_result_t LRUStorageMT::get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
std::lock_guard<std::mutex> guard(m_lock);

View File

@ -32,7 +32,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const;
GWBUF** ppValue) const;
cache_result_t put_value(const CACHE_KEY& key,
const GWBUF* pValue);

View File

@ -43,7 +43,7 @@ cache_result_t LRUStorageST::get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
return LRUStorage::do_get_value(key, flags, soft_ttl, hard_ttl, ppValue);
}

View File

@ -29,7 +29,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const;
GWBUF** ppValue) const;
cache_result_t put_value(const CACHE_KEY& key,
const GWBUF* pValue);

View File

@ -68,11 +68,11 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const = 0;
GWBUF** ppValue) const = 0;
cache_result_t get_value(const CACHE_KEY& key,
uint32_t flags,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
return get_value(key, flags, CACHE_USE_CONFIG_TTL, CACHE_USE_CONFIG_TTL, ppValue);
}

View File

@ -32,7 +32,6 @@ const size_t INMEMORY_KEY_LENGTH = 2 * SHA512_DIGEST_LENGTH;
#if INMEMORY_KEY_LENGTH > CACHE_KEY_MAXLEN
#error storage_inmemory key is too long.
#endif
}
InMemoryStorage::InMemoryStorage(const string& name, const CACHE_STORAGE_CONFIG& config)
@ -137,7 +136,7 @@ cache_result_t InMemoryStorage::do_get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult)
GWBUF** ppResult)
{
cache_result_t result = CACHE_RESULT_NOT_FOUND;

View File

@ -37,7 +37,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult) = 0;
GWBUF** ppResult) = 0;
virtual cache_result_t put_value(const CACHE_KEY& key, const GWBUF& value) = 0;
virtual cache_result_t del_value(const CACHE_KEY& key) = 0;
@ -55,7 +55,7 @@ protected:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult);
GWBUF** ppResult);
cache_result_t do_put_value(const CACHE_KEY& key, const GWBUF& value);
cache_result_t do_del_value(const CACHE_KEY& key);

View File

@ -45,7 +45,7 @@ cache_result_t InMemoryStorageMT::get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult)
GWBUF** ppResult)
{
std::lock_guard<std::mutex> guard(m_lock);

View File

@ -35,7 +35,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult);
GWBUF** ppResult);
cache_result_t put_value(const CACHE_KEY& key, const GWBUF& value);
cache_result_t del_value(const CACHE_KEY& key);

View File

@ -43,7 +43,7 @@ cache_result_t InMemoryStorageST::get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult)
GWBUF** ppResult)
{
return do_get_value(key, flags, soft_ttl, hard_ttl, ppResult);
}

View File

@ -32,7 +32,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult);
GWBUF** ppResult);
cache_result_t put_value(const CACHE_KEY& key, const GWBUF& pValue);
cache_result_t del_value(const CACHE_KEY& key);

View File

@ -20,8 +20,8 @@
extern "C"
{
CACHE_STORAGE_API* CacheGetStorageAPI()
{
return &StorageModule<InMemoryStorage>::s_api;
}
CACHE_STORAGE_API* CacheGetStorageAPI()
{
return &StorageModule<InMemoryStorage>::s_api;
}
}

View File

@ -74,7 +74,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppResult)
GWBUF** ppResult)
{
mxb_assert(pCache_storage);
mxb_assert(pKey);

View File

@ -42,7 +42,7 @@ cache_result_t StorageReal::get_value(const CACHE_KEY& key,
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const
GWBUF** ppValue) const
{
return m_pApi->getValue(m_pStorage, &key, flags, soft_ttl, hard_ttl, ppValue);
}

View File

@ -29,7 +29,7 @@ public:
uint32_t flags,
uint32_t soft_ttl,
uint32_t hard_ttl,
GWBUF** ppValue) const;
GWBUF** ppValue) const;
cache_result_t put_value(const CACHE_KEY& key,
const GWBUF* pValue);

View File

@ -26,14 +26,14 @@ unsigned int millisleep(unsigned int milliseconds)
unsigned int seconds = milliseconds / 1000;
milliseconds -= (seconds * 1000);
timespec req = { seconds, milliseconds * 1000000 };
timespec rem = { 0, 0 };
// Parentheses required by uncrustify, otherwise it'll think it's a pointer
timespec req = {seconds, (milliseconds * 1000000)};
timespec rem = {0, 0};
nanosleep(&req, &rem);
return rem.tv_sec * 1000 + rem.tv_nsec / 1000000;
}
}
//

View File

@ -27,11 +27,11 @@
using namespace std;
TestStorage::TestStorage(ostream* pOut,
size_t threads,
size_t seconds,
size_t items,
size_t min_size,
size_t max_size)
size_t threads,
size_t seconds,
size_t items,
size_t min_size,
size_t max_size)
: m_out(*pOut)
, m_threads(threads)
, m_seconds(seconds)

View File

@ -39,7 +39,6 @@ const MXS_ENUM_VALUE option_values[] =
{"extended", PCRE2_EXTENDED},
{NULL}
};
}
class CCRFilter;
@ -62,7 +61,7 @@ private:
CCRFilter& m_instance;
int m_hints_left = 0; /* Number of hints left to add to queries */
time_t m_last_modification = 0; /* Time of the last data modifying operation */
pcre2_match_data* m_md = nullptr; /* PCRE2 match data */
pcre2_match_data* m_md = nullptr; /* PCRE2 match data */
enum CcrHintValue
{
@ -183,8 +182,8 @@ private:
int m_count = 0; /* Number of hints to add after each operation that modifies data. */
LagStats m_stats;
pcre2_code* re = nullptr; /* Compiled regex text of match */
pcre2_code* nore = nullptr; /* Compiled regex text of ignore */
pcre2_code* re = nullptr; /* Compiled regex text of match */
pcre2_code* nore = nullptr; /* Compiled regex text of ignore */
uint32_t ovector_size = 0; /* PCRE2 match data ovector size */
};
@ -343,16 +342,22 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
"V1.1.0",
RCAP_TYPE_CONTIGUOUS_INPUT,
&CCRFilter::s_object,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
NULL,
NULL,
NULL,
NULL,
{
{"count", MXS_MODULE_PARAM_COUNT, "0"},
{"time", MXS_MODULE_PARAM_DURATION, "60s"},
{PARAM_MATCH, MXS_MODULE_PARAM_REGEX},
{PARAM_IGNORE, MXS_MODULE_PARAM_REGEX},
{"options", MXS_MODULE_PARAM_ENUM, "ignorecase", MXS_MODULE_OPT_NONE, option_values},
{"count", MXS_MODULE_PARAM_COUNT, "0" },
{"time", MXS_MODULE_PARAM_DURATION, "60s"},
{PARAM_MATCH, MXS_MODULE_PARAM_REGEX},
{PARAM_IGNORE, MXS_MODULE_PARAM_REGEX},
{
"options",
MXS_MODULE_PARAM_ENUM,
"ignorecase",
MXS_MODULE_OPT_NONE,
option_values
},
{MXS_END_MODULE_PARAMS}
}
};

View File

@ -50,7 +50,8 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
return &info;
}
CommentFilter::CommentFilter(std::string comment) : m_comment(comment)
CommentFilter::CommentFilter(std::string comment)
: m_comment(comment)
{
MXS_INFO("Comment filter with comment [%s] created.", m_comment.c_str());
}

View File

@ -148,7 +148,7 @@ public:
if (!(m_options & m_option))
{
uint32_t options = (m_options | m_option);
MXB_AT_DEBUG(bool rv = )qc_set_options(options);
MXB_AT_DEBUG(bool rv = ) qc_set_options(options);
mxb_assert(rv);
m_disable = true;
}
@ -159,7 +159,7 @@ public:
{
if (m_disable)
{
MXB_AT_DEBUG(bool rv = )qc_set_options(m_options);
MXB_AT_DEBUG(bool rv = ) qc_set_options(m_options);
mxb_assert(rv);
}
}
@ -169,7 +169,6 @@ private:
uint32_t m_options;
bool m_disable;
};
}
bool parse_at_times(const char** tok, char** saveptr, Rule* ruledef);
@ -1799,8 +1798,8 @@ static char* create_parse_error(Dbfw* my_instance,
bool rule_matches(Dbfw* my_instance,
DbfwSession* my_session,
GWBUF* queue,
SRule rule,
char* query)
SRule rule,
char* query)
{
mxb_assert(GWBUF_IS_CONTIGUOUS(queue));
char* msg = NULL;

View File

@ -313,6 +313,6 @@ char* create_error(const char* format, ...);
bool rule_matches(Dbfw* my_instance,
DbfwSession* my_session,
GWBUF* queue,
SRule rule,
char* query);
SRule rule,
char* query);
bool rule_is_active(SRule rule);

View File

@ -87,26 +87,26 @@ extern "C"
*
* @return The module object
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static MXS_MODULE info =
{
static MXS_MODULE info =
MXS_MODULE_API_FILTER,
MXS_MODULE_ALPHA_RELEASE,
MXS_FILTER_VERSION,
"A hint parsing filter",
"V1.0.0",
RCAP_TYPE_CONTIGUOUS_INPUT,
&HintInstance::s_object,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
MXS_MODULE_API_FILTER,
MXS_MODULE_ALPHA_RELEASE,
MXS_FILTER_VERSION,
"A hint parsing filter",
"V1.0.0",
RCAP_TYPE_CONTIGUOUS_INPUT,
&HintInstance::s_object,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
{MXS_END_MODULE_PARAMS}
}
};
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
return &info;
}
}

View File

@ -36,7 +36,7 @@ void test(const std::string& input, std::initializer_list<std::string> expected)
if (it == expected.end())
{
std::cout << "Too much output: " << std::string(output.first, output.second) << std::endl;
errors++;;
errors++;
break;
}
@ -46,12 +46,12 @@ void test(const std::string& input, std::initializer_list<std::string> expected)
if (have != need)
{
std::cout << "Need " << need << " bytes but only have " << have << std::endl;
errors++;;
errors++;
}
else if (!std::equal(output.first, output.second, it->begin()))
{
std::cout << "Output not equal to expected output" << std::endl;
errors++;;
errors++;
}
if (!rval)
@ -69,7 +69,7 @@ void test(const std::string& input, std::initializer_list<std::string> expected)
{
std::cout << "Not enough output, need " << std::distance(it, expected.end())
<< " more comments" << std::endl;
errors++;;
errors++;
}
}
@ -93,7 +93,7 @@ void test_parse(const std::string& input, int expected_type)
else if (hint && hint->type != expected_type)
{
std::cout << "Expected hint of type " << expected_type << " but got type "
<< (int)hint->type << ": " << input << std::endl;
<< (int)hint->type << ": " << input << std::endl;
errors++;
}

View File

@ -97,47 +97,47 @@ extern "C"
*
* @return The module object
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static MXS_FILTER_OBJECT MyObject =
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL,
};
static MXS_FILTER_OBJECT MyObject =
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_EXPERIMENTAL,
MXS_FILTER_VERSION,
"Data streaming filter",
"1.0.0",
RCAP_TYPE_TRANSACTION_TRACKING,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL,
};
{"source", MXS_MODULE_PARAM_STRING },
{"user", MXS_MODULE_PARAM_STRING },
{MXS_END_MODULE_PARAMS}
}
};
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_EXPERIMENTAL,
MXS_FILTER_VERSION,
"Data streaming filter",
"1.0.0",
RCAP_TYPE_TRANSACTION_TRACKING,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
{"source", MXS_MODULE_PARAM_STRING },
{"user", MXS_MODULE_PARAM_STRING },
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
return &info;
}
}
/**

View File

@ -47,7 +47,6 @@ extern "C"
#include <lua.h>
#include <lualib.h>
#include <string.h>
}
#include <mutex>
@ -87,46 +86,46 @@ extern "C"
*
* @return The module object
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static MXS_FILTER_OBJECT MyObject =
{
static MXS_FILTER_OBJECT MyObject =
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
static MXS_MODULE info =
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_EXPERIMENTAL,
MXS_FILTER_VERSION,
"Lua Filter",
"V1.0.0",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
MXS_MODULE_API_FILTER,
MXS_MODULE_EXPERIMENTAL,
MXS_FILTER_VERSION,
"Lua Filter",
"V1.0.0",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
{"global_script", MXS_MODULE_PARAM_PATH, NULL, MXS_MODULE_OPT_PATH_R_OK},
{"session_script", MXS_MODULE_PARAM_PATH, NULL, MXS_MODULE_OPT_PATH_R_OK},
{MXS_END_MODULE_PARAMS}
}
};
{"global_script", MXS_MODULE_PARAM_PATH, NULL, MXS_MODULE_OPT_PATH_R_OK},
{"session_script", MXS_MODULE_PARAM_PATH, NULL, MXS_MODULE_OPT_PATH_R_OK},
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
return &info;
}
}
static int id_pool = 0;

View File

@ -90,10 +90,10 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
"V1.0.0",
RCAP_TYPE_CONTIGUOUS_INPUT | RCAP_TYPE_CONTIGUOUS_OUTPUT,
&MaskingFilter::s_object,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
{
Config::rules_name,

View File

@ -17,24 +17,23 @@
namespace
{
const char config_name_check_subqueries[] = "check_subqueries";
const char config_name_check_unions[] = "check_unions";
const char config_name_check_user_variables[] = "check_user_variables";
const char config_name_large_payload[] = "large_payload";
const char config_name_prevent_function_usage[] = "prevent_function_usage";
const char config_name_require_fully_parsed[] = "require_fully_parsed";
const char config_name_rules[] = "rules";
const char config_name_warn_type_mismatch[] = "warn_type_mismatch";
const char config_name_check_subqueries[] = "check_subqueries";
const char config_name_check_unions[] = "check_unions";
const char config_name_check_user_variables[] = "check_user_variables";
const char config_name_large_payload[] = "large_payload";
const char config_name_prevent_function_usage[] = "prevent_function_usage";
const char config_name_require_fully_parsed[] = "require_fully_parsed";
const char config_name_rules[] = "rules";
const char config_name_warn_type_mismatch[] = "warn_type_mismatch";
const char config_name_treat_string_arg_as_field[] = "treat_string_arg_as_field";
const char config_value_abort[] = "abort";
const char config_value_abort[] = "abort";
const char config_value_always[] = "always";
const char config_value_ignore[] = "ignore";
const char config_value_never[] = "never";
const char config_value_never[] = "never";
const char config_value_true[] = "true";
}
/*

View File

@ -67,7 +67,7 @@ public:
if (!(m_options & m_option))
{
uint32_t options = (m_options | m_option);
MXB_AT_DEBUG(bool rv = )qc_set_options(options);
MXB_AT_DEBUG(bool rv = ) qc_set_options(options);
mxb_assert(rv);
m_disable = true;
}
@ -78,7 +78,7 @@ public:
{
if (m_disable)
{
MXB_AT_DEBUG(bool rv = )qc_set_options(m_options);
MXB_AT_DEBUG(bool rv = ) qc_set_options(m_options);
mxb_assert(rv);
}
}
@ -88,7 +88,6 @@ private:
uint32_t m_options;
bool m_disable;
};
}
MaskingFilterSession::MaskingFilterSession(MXS_SESSION* pSession, const MaskingFilter* pFilter)
@ -580,19 +579,19 @@ bool MaskingFilterSession::is_function_used(GWBUF* pPacket, const char* zUser, c
SMaskingRules sRules = m_filter.rules();
auto pred1 = [&sRules, zUser, zHost](const QC_FIELD_INFO& field_info) {
const MaskingRules::Rule* pRule = sRules->get_rule_for(field_info, zUser, zHost);
const MaskingRules::Rule* pRule = sRules->get_rule_for(field_info, zUser, zHost);
return pRule ? true : false;
};
return pRule ? true : false;
};
auto pred2 = [&sRules, zUser, zHost, &pred1](const QC_FUNCTION_INFO& function_info) {
const QC_FIELD_INFO* begin = function_info.fields;
const QC_FIELD_INFO* end = begin + function_info.n_fields;
const QC_FIELD_INFO* begin = function_info.fields;
const QC_FIELD_INFO* end = begin + function_info.n_fields;
auto i = std::find_if(begin, end, pred1);
auto i = std::find_if(begin, end, pred1);
return i != end;
};
return i != end;
};
const QC_FUNCTION_INFO* pInfos;
size_t nInfos;
@ -627,20 +626,20 @@ bool MaskingFilterSession::is_variable_defined(GWBUF* pPacket, const char* zUser
SMaskingRules sRules = m_filter.rules();
auto pred = [&sRules, zUser, zHost](const QC_FIELD_INFO& field_info) {
bool rv = false;
bool rv = false;
if (strcmp(field_info.column, "*") == 0)
{
// If "*" is used, then we must block if there is any rule for the current user.
rv = sRules->has_rule_for(zUser, zHost);
}
else
{
rv = sRules->get_rule_for(field_info, zUser, zHost) ? true : false;
}
if (strcmp(field_info.column, "*") == 0)
{
// If "*" is used, then we must block if there is any rule for the current user.
rv = sRules->has_rule_for(zUser, zHost);
}
else
{
rv = sRules->get_rule_for(field_info, zUser, zHost) ? true : false;
}
return rv;
};
return rv;
};
const QC_FIELD_INFO* pInfos;
size_t nInfos;
@ -701,23 +700,23 @@ bool MaskingFilterSession::is_union_or_subquery_used(GWBUF* pPacket, const char*
}
auto pred = [&sRules, mask, zUser, zHost](const QC_FIELD_INFO& field_info) {
bool rv = false;
bool rv = false;
if (field_info.context & mask)
{
if (strcmp(field_info.column, "*") == 0)
if (field_info.context & mask)
{
// If "*" is used, then we must block if there is any rule for the current user.
rv = sRules->has_rule_for(zUser, zHost);
if (strcmp(field_info.column, "*") == 0)
{
// If "*" is used, then we must block if there is any rule for the current user.
rv = sRules->has_rule_for(zUser, zHost);
}
else
{
rv = sRules->get_rule_for(field_info, zUser, zHost) ? true : false;
}
}
else
{
rv = sRules->get_rule_for(field_info, zUser, zHost) ? true : false;
}
}
return rv;
};
return rv;
};
const QC_FIELD_INFO* pInfos;
size_t nInfos;

View File

@ -187,7 +187,7 @@ public:
private:
AccountRegexp(const string& user,
const string& host,
pcre2_code* pCode)
pcre2_code* pCode)
: m_user(user)
, m_host(host)
, m_pCode(pCode)
@ -692,7 +692,7 @@ static bool rule_get_common_values(json_t* pRule,
std::string* column,
std::string* table,
std::string* database,
const char* rule_type)
const char* rule_type)
{
// Get database, table && column
json_t* pDatabase = json_object_get(pRule, KEY_DATABASE);
@ -745,7 +745,7 @@ bool rule_get_values(json_t* pRule,
std::string* column,
std::string* table,
std::string* database,
const char* rule_type)
const char* rule_type)
{
json_t* pKeyObj;
// Get Key object based on 'rule_type' param
@ -1174,8 +1174,8 @@ bool MaskingRules::Rule::matches_account(const char* zUser,
template<class FillIter, class OutIter>
inline void fill_buffer(FillIter f_first,
FillIter f_last,
OutIter o_first,
OutIter o_last)
OutIter o_first,
OutIter o_last)
{
FillIter pFill = f_first;
while (o_first != o_last)
@ -1471,8 +1471,8 @@ const MaskingRules::Rule* MaskingRules::get_rule_for(const QC_FIELD_INFO& field_
bool MaskingRules::has_rule_for(const char* zUser, const char* zHost) const
{
auto i = std::find_if(m_rules.begin(), m_rules.end(), [zUser, zHost](SRule sRule) {
return sRule->matches_account(zUser, zHost);
});
return sRule->matches_account(zUser, zHost);
});
return i != m_rules.end();
}

View File

@ -83,66 +83,66 @@ extern "C"
*
* @return The module object.
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static MXS_FILTER_OBJECT object =
{
static MXS_FILTER_OBJECT object =
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostics,
diagnostics_json,
getCapabilities,
NULL, // No destroyInstance
};
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostics,
diagnostics_json,
getCapabilities,
NULL, // No destroyInstance
};
static MXS_MODULE info =
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_IN_DEVELOPMENT,
MXS_FILTER_VERSION,
"A filter that is capable of limiting the resultset number of rows.",
"V1.0.0",
RCAP_TYPE_STMT_INPUT | RCAP_TYPE_STMT_OUTPUT,
&object,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
MXS_MODULE_API_FILTER,
MXS_MODULE_IN_DEVELOPMENT,
MXS_FILTER_VERSION,
"A filter that is capable of limiting the resultset number of rows.",
"V1.0.0",
RCAP_TYPE_STMT_INPUT | RCAP_TYPE_STMT_OUTPUT,
&object,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
{
"max_resultset_rows",
MXS_MODULE_PARAM_COUNT,
MAXROWS_DEFAULT_MAX_RESULTSET_ROWS
},
{
"max_resultset_size",
MXS_MODULE_PARAM_SIZE,
MAXROWS_DEFAULT_MAX_RESULTSET_SIZE
},
{
"debug",
MXS_MODULE_PARAM_COUNT,
MAXROWS_DEFAULT_DEBUG
},
{
"max_resultset_return",
MXS_MODULE_PARAM_ENUM,
"empty",
MXS_MODULE_OPT_ENUM_UNIQUE,
return_option_values
},
{MXS_END_MODULE_PARAMS}
}
};
"max_resultset_rows",
MXS_MODULE_PARAM_COUNT,
MAXROWS_DEFAULT_MAX_RESULTSET_ROWS
},
{
"max_resultset_size",
MXS_MODULE_PARAM_SIZE,
MAXROWS_DEFAULT_MAX_RESULTSET_SIZE
},
{
"debug",
MXS_MODULE_PARAM_COUNT,
MAXROWS_DEFAULT_DEBUG
},
{
"max_resultset_return",
MXS_MODULE_PARAM_ENUM,
"empty",
MXS_MODULE_OPT_ENUM_UNIQUE,
return_option_values
},
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
return &info;
}
}
/* Implementation */

View File

@ -263,78 +263,84 @@ extern "C"
*
* @return The module object
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static MXS_FILTER_OBJECT MyObject =
{
static MXS_FILTER_OBJECT MyObject =
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
static MXS_MODULE info =
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_ALPHA_RELEASE,
MXS_FILTER_VERSION,
"A RabbitMQ query logging filter",
"V1.0.2",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
MXS_MODULE_API_FILTER,
MXS_MODULE_ALPHA_RELEASE,
MXS_FILTER_VERSION,
"A RabbitMQ query logging filter",
"V1.0.2",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL, /* Process init. */
NULL, /* Process finish. */
NULL, /* Thread init. */
NULL, /* Thread finish. */
{"hostname", MXS_MODULE_PARAM_STRING, "localhost" },
{"username", MXS_MODULE_PARAM_STRING, "guest" },
{"password", MXS_MODULE_PARAM_STRING, "guest" },
{"vhost", MXS_MODULE_PARAM_STRING, "/" },
{"port", MXS_MODULE_PARAM_COUNT, "5672" },
{"exchange", MXS_MODULE_PARAM_STRING, "default_exchange"},
{"key", MXS_MODULE_PARAM_STRING, "key" },
{"queue", MXS_MODULE_PARAM_STRING},
{"exchange_type", MXS_MODULE_PARAM_STRING, "direct" },
{"logging_source_user", MXS_MODULE_PARAM_STRING},
{"logging_source_host", MXS_MODULE_PARAM_STRING},
{"logging_schema", MXS_MODULE_PARAM_STRING},
{"logging_object", MXS_MODULE_PARAM_STRING},
{"logging_log_all", MXS_MODULE_PARAM_BOOL, "false" },
{"logging_strict", MXS_MODULE_PARAM_BOOL, "true" },
{
{"hostname", MXS_MODULE_PARAM_STRING,
"localhost"},
{"username", MXS_MODULE_PARAM_STRING,
"guest"},
{"password", MXS_MODULE_PARAM_STRING,
"guest"},
{"vhost", MXS_MODULE_PARAM_STRING,
"/"},
{"port", MXS_MODULE_PARAM_COUNT,
"5672"},
{"exchange", MXS_MODULE_PARAM_STRING,
"default_exchange"},
{"key", MXS_MODULE_PARAM_STRING,
"key"},
{"queue", MXS_MODULE_PARAM_STRING},
{"ssl_client_certificate", MXS_MODULE_PARAM_PATH, NULL,
MXS_MODULE_OPT_PATH_R_OK},
{"ssl_client_key", MXS_MODULE_PARAM_PATH, NULL,
MXS_MODULE_OPT_PATH_R_OK},
{"ssl_CA_cert", MXS_MODULE_PARAM_PATH, NULL,
MXS_MODULE_OPT_PATH_R_OK},
{"exchange_type", MXS_MODULE_PARAM_STRING,
"direct"},
{"logging_trigger", MXS_MODULE_PARAM_ENUM, "all",
MXS_MODULE_OPT_NONE,
trigger_values},
{"logging_source_user", MXS_MODULE_PARAM_STRING},
{"logging_source_host", MXS_MODULE_PARAM_STRING},
{"logging_schema", MXS_MODULE_PARAM_STRING},
{"logging_object", MXS_MODULE_PARAM_STRING},
{"logging_log_all", MXS_MODULE_PARAM_BOOL,
"false"},
{"logging_strict", MXS_MODULE_PARAM_BOOL,
"true"},
{MXS_END_MODULE_PARAMS}
}
};
"ssl_client_certificate",
MXS_MODULE_PARAM_PATH,
NULL,
MXS_MODULE_OPT_PATH_R_OK
},
{
"ssl_client_key",
MXS_MODULE_PARAM_PATH,
NULL,
MXS_MODULE_OPT_PATH_R_OK
},
{
"ssl_CA_cert",
MXS_MODULE_PARAM_PATH,
NULL,
MXS_MODULE_OPT_PATH_R_OK},
return &info;
}
{
"logging_trigger",
MXS_MODULE_PARAM_ENUM,
"all",
MXS_MODULE_OPT_NONE,
trigger_values
},
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
}
/**

View File

@ -878,7 +878,7 @@ bool RegexHintFilter::add_source_address(const char* input_host, SourceHostVecto
}
void RegexHintFilter::set_source_addresses(const std::string& input_host_names,
SourceHostVector& source_hosts,
SourceHostVector& source_hosts,
StringVector& hostnames)
{
std::string host_names(input_host_names);

View File

@ -204,7 +204,7 @@ QlaInstance* QlaInstance::create(const std::string name, MXS_CONFIG_PARAMETER* p
QlaFilterSession* QlaInstance::newSession(MXS_SESSION* session)
{
auto my_session = new (std::nothrow) QlaFilterSession(*this, session);
auto my_session = new(std::nothrow) QlaFilterSession(*this, session);
if (my_session)
{
if (!my_session->prepare())
@ -311,7 +311,7 @@ void QlaInstance::diagnostics(DCB* dcb) const
}
if (!m_settings.exclude.empty())
{
output += string_printf("\t\tExclude queries that match %s\n", m_settings.exclude.c_str());
output += string_printf("\t\tExclude queries that match %s\n", m_settings.exclude.c_str());
}
output += string_printf("\t\tColumn separator %s\n", m_settings.separator.c_str());
@ -878,7 +878,6 @@ void diagnostic(MXS_FILTER* instance, MXS_FILTER_SESSION* fsession, DCB* dcb)
{
auto my_instance = static_cast<QlaInstance*>(instance);
my_instance->diagnostics(dcb);
}
}
@ -910,7 +909,6 @@ bool cb_log(const MODULECMD_ARG* argv, json_t** output)
return instance->read_to_json(start, end, output);
}
}
/**

View File

@ -42,15 +42,15 @@ public:
~QlaInstance();
/* Log file save mode flags. */
static const int64_t LOG_FILE_SESSION = (1 << 0); /**< Default value, session specific files */
static const int64_t LOG_FILE_UNIFIED = (1 << 1); /**< One file shared by all sessions */
static const int64_t LOG_FILE_SESSION = (1 << 0); /**< Default value, session specific files */
static const int64_t LOG_FILE_UNIFIED = (1 << 1); /**< One file shared by all sessions */
/* Flags for controlling extra log entry contents */
static const int64_t LOG_DATA_SERVICE = (1 << 0);
static const int64_t LOG_DATA_SESSION = (1 << 1);
static const int64_t LOG_DATA_DATE = (1 << 2);
static const int64_t LOG_DATA_USER = (1 << 3);
static const int64_t LOG_DATA_QUERY = (1 << 4);
static const int64_t LOG_DATA_SERVICE = (1 << 0);
static const int64_t LOG_DATA_SESSION = (1 << 1);
static const int64_t LOG_DATA_DATE = (1 << 2);
static const int64_t LOG_DATA_USER = (1 << 3);
static const int64_t LOG_DATA_QUERY = (1 << 4);
static const int64_t LOG_DATA_REPLY_TIME = (1 << 5);
/**
@ -80,15 +80,15 @@ public:
*/
bool read_to_json(int start, int end, json_t** output) const;
void diagnostics(DCB* dcb) const;
void diagnostics(DCB* dcb) const;
json_t* diagnostics_json() const;
std::string generate_log_header(uint64_t data_flags) const;
FILE* open_session_log_file(const std::string& filename) const;
void check_reopen_session_file(const std::string& filename, FILE** ppFile) const;
void write_unified_log_entry(const std::string& contents);
bool write_to_logfile(FILE* fp, const std::string& contents) const;
void check_reopen_session_file(const std::string& filename, FILE** ppFile) const;
void write_unified_log_entry(const std::string& contents);
bool write_to_logfile(FILE* fp, const std::string& contents) const;
class Settings
{
@ -97,39 +97,38 @@ public:
bool write_unified_log {false};
bool write_session_log {false};
uint32_t log_file_data_flags {0}; /* What data is saved to the files */
std::string filebase; /* The filename base */
bool flush_writes {false}; /* Flush log file after every write? */
bool append {false}; /* Open files in append-mode? */
std::string query_newline; /* Character(s) used to replace a newline within a query */
std::string separator; /* Character(s) used to separate elements */
std::string user_name; /* The user name to filter on */
std::string source; /* The source of the client connection to filter on */
std::string match; /* Optional text to match against */
std::string exclude; /* Optional text to match against for exclusion */
uint32_t log_file_data_flags {0}; /* What data is saved to the files */
std::string filebase; /* The filename base */
bool flush_writes {false}; /* Flush log file after every write? */
bool append {false}; /* Open files in append-mode? */
std::string query_newline; /* Character(s) used to replace a newline within a query */
std::string separator; /* Character(s) used to separate elements */
std::string user_name; /* The user name to filter on */
std::string source; /* The source of the client connection to filter on */
std::string match; /* Optional text to match against */
std::string exclude; /* Optional text to match against for exclusion */
};
Settings m_settings;
const std::string m_name; /* Filter definition name */
pcre2_code* m_re_match {nullptr}; /* Compiled regex text */
pcre2_code* m_re_exclude {nullptr}; /* Compiled regex nomatch text */
uint32_t m_ovec_size {0}; /* PCRE2 match data ovector size */
pcre2_code* m_re_match {nullptr}; /* Compiled regex text */
pcre2_code* m_re_exclude {nullptr}; /* Compiled regex nomatch text */
uint32_t m_ovec_size {0}; /* PCRE2 match data ovector size */
uint64_t m_session_data_flags {0}; /* What data is printed to session files */
uint64_t m_session_data_flags {0}; /* What data is printed to session files */
private:
bool open_unified_logfile();
bool open_unified_logfile();
FILE* open_log_file(uint64_t data_flags, const std::string& filename) const;
void check_reopen_file(const std::string& filename, uint64_t data_flags, FILE** ppFile) const;
std::mutex m_file_lock; /* Protects access to the unified log file */
std::string m_unified_filename; /* Filename of the unified log file */
FILE* m_unified_fp {nullptr}; /* Unified log file. */
int m_rotation_count {0}; /* Log rotation counter */
bool m_write_error_logged {false}; /* Avoid repeatedly printing some errors/warnings. */
void check_reopen_file(const std::string& filename, uint64_t data_flags, FILE** ppFile) const;
std::mutex m_file_lock; /* Protects access to the unified log file */
std::string m_unified_filename; /* Filename of the unified log file */
FILE* m_unified_fp {nullptr}; /* Unified log file. */
int m_rotation_count {0}; /* Log rotation counter */
bool m_write_error_logged {false}; /* Avoid repeatedly printing some errors/warnings. */
};
/* The session structure for this QLA filter. */
@ -172,26 +171,26 @@ public:
MXS_UPSTREAM up;
MXS_DOWNSTREAM down;
std::string m_filename; /* The session-specific log file name */
std::string m_filename; /* The session-specific log file name */
private:
QlaInstance& m_instance;
QlaInstance& m_instance;
const std::string m_user; /* Client username */
const std::string m_remote; /* Client address */
const std::string m_service; /* The service name this filter is attached to. */
const uint64_t m_ses_id {0}; /* The session this filter session serves. */
const std::string m_user; /* Client username */
const std::string m_remote; /* Client address */
const std::string m_service; /* The service name this filter is attached to. */
const uint64_t m_ses_id {0}; /* The session this filter session serves. */
bool m_active {false}; /* Is session active? */
pcre2_match_data* m_mdata {nullptr}; /* Regex match data */
FILE* m_logfile {nullptr}; /* The session-specific log file */
int m_rotation_count {0}; /* Log rotation counter */
bool m_write_error_logged {false}; /* Has write error been logged */
FILE* m_logfile {nullptr}; /* The session-specific log file */
int m_rotation_count {0}; /* Log rotation counter */
bool m_write_error_logged {false}; /* Has write error been logged */
/**
* Helper struct for holding data before it's written to file.
*/
* Helper struct for holding data before it's written to file.
*/
class LogEventData
{
public:
@ -224,10 +223,10 @@ private:
timespec begin_time {0, 0}; // Timer value at the moment of receiving query.
};
LogEventData m_event_data; /* Information about the latest event, used if logging execution time. */
LogEventData m_event_data; /* Information about the latest event, used if logging execution time. */
void write_log_entries(const LogEventElems& elems);
void write_session_log_entry(const std::string& entry);
void write_log_entries(const LogEventElems& elems);
void write_session_log_entry(const std::string& entry);
std::string generate_log_entry(uint64_t data_flags, const LogEventElems& elems) const;
};
@ -237,15 +236,16 @@ private:
*/
struct LogEventElems
{
const char* date_string {nullptr}; /**< Formatted date */
const char* query {nullptr}; /**< Query. Not necessarily 0-terminated */
int querylen {0}; /**< Length of query */
int elapsed_ms {0}; /**< Processing time on backend */
const char* date_string {nullptr}; /**< Formatted date */
const char* query {nullptr}; /**< Query. Not necessarily 0-terminated */
int querylen {0}; /**< Length of query */
int elapsed_ms {0}; /**< Processing time on backend */
LogEventElems(const char* date_string, const char* query, int querylen, int elapsed_ms = -1)
: date_string(date_string)
, query(query)
, querylen(querylen)
, elapsed_ms(elapsed_ms)
{}
: date_string(date_string)
, query(query)
, querylen(querylen)
, elapsed_ms(elapsed_ms)
{
}
};

View File

@ -58,13 +58,13 @@ static char* regex_replace(const char* sql,
*/
struct RegexInstance
{
char* source; /*< Source address to restrict matches */
char* user; /*< User name to restrict matches */
char* match; /*< Regular expression to match */
char* replace; /*< Replacement text */
pcre2_code* re; /*< Compiled regex text */
FILE* logfile; /*< Log file */
bool log_trace; /*< Whether messages should be printed to tracelog */
char* source; /*< Source address to restrict matches */
char* user; /*< User name to restrict matches */
char* match; /*< Regular expression to match */
char* replace; /*< Replacement text */
pcre2_code* re; /*< Compiled regex text */
FILE* logfile; /*< Log file */
bool log_trace; /*< Whether messages should be printed to tracelog */
};
/**
@ -72,10 +72,10 @@ struct RegexInstance
*/
struct RegexSession
{
MXS_DOWNSTREAM down; /* The downstream filter */
pthread_mutex_t lock;
int no_change; /* No. of unchanged requests */
int replacements; /* No. of changed requests */
MXS_DOWNSTREAM down; /* The downstream filter */
pthread_mutex_t lock;
int no_change; /* No. of unchanged requests */
int replacements; /* No. of changed requests */
pcre2_match_data* match_data; /*< Matching data used by the compiled regex */
};
@ -100,73 +100,73 @@ extern "C"
*
* @return The module object
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static MXS_FILTER_OBJECT MyObject =
{
static MXS_FILTER_OBJECT MyObject =
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
NULL, // No Upstream requirement
routeQuery,
NULL, // No clientReply
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
NULL, // No Upstream requirement
routeQuery,
NULL, // No clientReply
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
static const char description[] = "A query rewrite filter that uses regular "
"expressions to rewrite queries";
static MXS_MODULE info =
static const char description[] = "A query rewrite filter that uses regular "
"expressions to rewrite queries";
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_GA,
MXS_FILTER_VERSION,
description,
"V1.1.0",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
MXS_MODULE_API_FILTER,
MXS_MODULE_GA,
MXS_FILTER_VERSION,
description,
"V1.1.0",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
{
"match",
MXS_MODULE_PARAM_STRING,
NULL,
MXS_MODULE_OPT_REQUIRED
},
{
"replace",
MXS_MODULE_PARAM_STRING,
NULL,
MXS_MODULE_OPT_REQUIRED
},
{
"options",
MXS_MODULE_PARAM_ENUM,
"ignorecase",
MXS_MODULE_OPT_NONE,
option_values
},
{
"log_trace",
MXS_MODULE_PARAM_BOOL,
"false"
},
{"source", MXS_MODULE_PARAM_STRING },
{"user", MXS_MODULE_PARAM_STRING },
{"log_file", MXS_MODULE_PARAM_STRING },
{MXS_END_MODULE_PARAMS}
}
};
"match",
MXS_MODULE_PARAM_STRING,
NULL,
MXS_MODULE_OPT_REQUIRED
},
{
"replace",
MXS_MODULE_PARAM_STRING,
NULL,
MXS_MODULE_OPT_REQUIRED
},
{
"options",
MXS_MODULE_PARAM_ENUM,
"ignorecase",
MXS_MODULE_OPT_NONE,
option_values
},
{
"log_trace",
MXS_MODULE_PARAM_BOOL,
"false"
},
{"source", MXS_MODULE_PARAM_STRING },
{"user", MXS_MODULE_PARAM_STRING },
{"log_file", MXS_MODULE_PARAM_STRING },
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
return &info;
}
}
/**
@ -247,7 +247,7 @@ bool matching_connection(RegexInstance* my_instance, MXS_SESSION* session)
{
rval = false;
}
else if (my_instance->user && strcmp(session_get_user(session), my_instance->user) != 0)
else if (my_instance->user && strcmp(session_get_user(session), my_instance->user) != 0)
{
rval = false;
}

View File

@ -21,7 +21,7 @@
TeeSession::TeeSession(MXS_SESSION* session,
LocalClient* client,
pcre2_code* match,
pcre2_code* match,
pcre2_match_data* md_match,
pcre2_code* exclude,
pcre2_match_data* md_exclude)

View File

@ -39,7 +39,7 @@ public:
private:
TeeSession(MXS_SESSION* session,
LocalClient* client,
pcre2_code* match,
pcre2_code* match,
pcre2_match_data* md_match,
pcre2_code* exclude,
pcre2_match_data* md_exclude);

View File

@ -46,8 +46,8 @@ public:
* @param pHandler Optional handler.
*/
Dcb(MXS_SESSION* pSession,
const char* zUser,
const char* zHost,
const char* zUser,
const char* zHost,
Handler* pHandler = NULL);
~Dcb();

View File

@ -107,7 +107,7 @@ private:
Backend* m_pBackend;
FilterModule::Session* m_pUpstream_filter_session;
maxscale::mock::Session* m_pSession;
maxscale::mock::Session* m_pSession;
};
}
}

View File

@ -31,8 +31,8 @@ namespace mock
{
Dcb::Dcb(MXS_SESSION* pSession,
const char* zUser,
const char* zHost,
const char* zUser,
const char* zHost,
Handler* pHandler)
: DCB(DCB::Role::CLIENT, pSession)
, m_user(zUser)

View File

@ -43,7 +43,7 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
NULL, /* Thread init. */
NULL, /* Thread finish. */
{
{MAX_QPS_CFG, MXS_MODULE_PARAM_INT },
{MAX_QPS_CFG, MXS_MODULE_PARAM_INT },
{SAMPLING_DURATION_CFG, MXS_MODULE_PARAM_DURATION, "250ms"},
{THROTTLE_DURATION_CFG, MXS_MODULE_PARAM_DURATION },
{CONTINUOUS_DURATION_CFG, MXS_MODULE_PARAM_DURATION, "2000ms"},
@ -57,7 +57,8 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
namespace throttle
{
ThrottleFilter::ThrottleFilter(const ThrottleConfig& config) : m_config(config)
ThrottleFilter::ThrottleFilter(const ThrottleConfig& config)
: m_config(config)
{
}

View File

@ -141,58 +141,58 @@ extern "C"
*
* @return The module object
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static MXS_FILTER_OBJECT MyObject =
{
static MXS_FILTER_OBJECT MyObject =
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
NULL, // No destroyInstance
};
static MXS_MODULE info =
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_GA,
MXS_FILTER_VERSION,
"A top N query "
"logging filter",
"V1.0.1",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
MXS_MODULE_API_FILTER,
MXS_MODULE_GA,
MXS_FILTER_VERSION,
"A top N query "
"logging filter",
"V1.0.1",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{"count", MXS_MODULE_PARAM_COUNT, "10" },
{"filebase", MXS_MODULE_PARAM_STRING, NULL, MXS_MODULE_OPT_REQUIRED},
{"match", MXS_MODULE_PARAM_STRING},
{"exclude", MXS_MODULE_PARAM_STRING},
{"source", MXS_MODULE_PARAM_STRING},
{"user", MXS_MODULE_PARAM_STRING},
{
{"count", MXS_MODULE_PARAM_COUNT, "10" },
{"filebase", MXS_MODULE_PARAM_STRING, NULL, MXS_MODULE_OPT_REQUIRED},
{"match", MXS_MODULE_PARAM_STRING},
{"exclude", MXS_MODULE_PARAM_STRING},
{"source", MXS_MODULE_PARAM_STRING},
{"user", MXS_MODULE_PARAM_STRING},
{
"options",
MXS_MODULE_PARAM_ENUM,
"ignorecase",
MXS_MODULE_OPT_NONE,
option_values
},
{MXS_END_MODULE_PARAMS}
}
};
"options",
MXS_MODULE_PARAM_ENUM,
"ignorecase",
MXS_MODULE_OPT_NONE,
option_values
},
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
return &info;
}
}
/**

View File

@ -160,51 +160,51 @@ extern "C"
*
* @return The module object
*/
MXS_MODULE* MXS_CREATE_MODULE()
MXS_MODULE* MXS_CREATE_MODULE()
{
static const char description[] = "Transaction Performance Monitoring filter";
static MXS_FILTER_OBJECT MyObject =
{
static const char description[] = "Transaction Performance Monitoring filter";
static MXS_FILTER_OBJECT MyObject =
{
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
destroyInstance
};
createInstance,
newSession,
closeSession,
freeSession,
setDownstream,
setUpstream,
routeQuery,
clientReply,
diagnostic,
diagnostic_json,
getCapabilities,
destroyInstance
};
static MXS_MODULE info =
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_GA,
MXS_FILTER_VERSION,
description,
"V1.0.1",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
MXS_MODULE_API_FILTER,
MXS_MODULE_GA,
MXS_FILTER_VERSION,
description,
"V1.0.1",
RCAP_TYPE_CONTIGUOUS_INPUT,
&MyObject,
NULL,
NULL,
NULL,
NULL,
{
{"named_pipe", MXS_MODULE_PARAM_STRING, DEFAULT_NAMED_PIPE },
{"filename", MXS_MODULE_PARAM_STRING, DEFAULT_FILE_NAME },
{"delimiter", MXS_MODULE_PARAM_STRING, DEFAULT_LOG_DELIMITER },
{"query_delimiter", MXS_MODULE_PARAM_STRING, DEFAULT_QUERY_DELIMITER},
{"source", MXS_MODULE_PARAM_STRING},
{"user", MXS_MODULE_PARAM_STRING},
{MXS_END_MODULE_PARAMS}
}
};
{"named_pipe", MXS_MODULE_PARAM_STRING, DEFAULT_NAMED_PIPE },
{"filename", MXS_MODULE_PARAM_STRING, DEFAULT_FILE_NAME },
{"delimiter", MXS_MODULE_PARAM_STRING, DEFAULT_LOG_DELIMITER },
{"query_delimiter", MXS_MODULE_PARAM_STRING, DEFAULT_QUERY_DELIMITER},
{"source", MXS_MODULE_PARAM_STRING},
{"user", MXS_MODULE_PARAM_STRING},
{MXS_END_MODULE_PARAMS}
}
};
return &info;
}
return &info;
}
}
/**