QC: Setup and initialization separated
This is in preparation for using the general process/thread initialization mechanism.
This commit is contained in:
@ -127,7 +127,8 @@ typedef struct qc_field_info
|
||||
*/
|
||||
typedef struct query_classifier
|
||||
{
|
||||
bool (*qc_init)(const char* args);
|
||||
bool (*qc_setup)(const char* args);
|
||||
bool (*qc_init)(void);
|
||||
void (*qc_end)(void);
|
||||
|
||||
bool (*qc_thread_init)(void);
|
||||
|
@ -78,7 +78,12 @@ void qc_sqlite_get_field_info(GWBUF* query, const QC_FIELD_INFO** infos, size_t*
|
||||
*n_infos = 0;
|
||||
}
|
||||
|
||||
bool qc_init(const char* args)
|
||||
bool qc_setup(const char* args)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool qc_init(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -102,6 +107,7 @@ extern "C"
|
||||
{
|
||||
static QUERY_CLASSIFIER qc =
|
||||
{
|
||||
qc_setup,
|
||||
qc_init,
|
||||
qc_end,
|
||||
qc_thread_init,
|
||||
|
@ -2487,16 +2487,21 @@ void configure_options(const char* datadir, const char* langdir)
|
||||
|
||||
}
|
||||
|
||||
bool qc_init(const char* args)
|
||||
bool qc_setup(const char* args)
|
||||
{
|
||||
bool inited = false;
|
||||
|
||||
if (args)
|
||||
{
|
||||
MXS_WARNING("qc_mysqlembedded: '%s' provided as arguments, "
|
||||
"even though no arguments are supported.", args);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool qc_init(void)
|
||||
{
|
||||
bool inited = false;
|
||||
|
||||
if (strlen(get_langdir()) >= PATH_MAX)
|
||||
{
|
||||
fprintf(stderr, "MaxScale: error: Language path is too long: %s.", get_langdir());
|
||||
@ -2561,6 +2566,7 @@ MXS_MODULE* MXS_CREATE_MODULE()
|
||||
{
|
||||
static QUERY_CLASSIFIER qc =
|
||||
{
|
||||
qc_setup,
|
||||
qc_init,
|
||||
qc_end,
|
||||
qc_thread_init,
|
||||
|
@ -100,6 +100,7 @@ typedef enum qc_log_level
|
||||
static struct
|
||||
{
|
||||
bool initialized;
|
||||
bool setup;
|
||||
qc_log_level_t log_level;
|
||||
} this_unit;
|
||||
|
||||
@ -2596,7 +2597,8 @@ void maxscaleUse(Parse* pParse, Token* pToken)
|
||||
/**
|
||||
* API
|
||||
*/
|
||||
static bool qc_sqlite_init(const char* args);
|
||||
static bool qc_sqlite_setup(const char* args);
|
||||
static bool qc_sqlite_init(void);
|
||||
static void qc_sqlite_end(void);
|
||||
static bool qc_sqlite_thread_init(void);
|
||||
static void qc_sqlite_thread_end(void);
|
||||
@ -2628,10 +2630,10 @@ static bool get_key_and_value(char* arg, const char** pkey, const char** pvalue)
|
||||
|
||||
static char ARG_LOG_UNRECOGNIZED_STATEMENTS[] = "log_unrecognized_statements";
|
||||
|
||||
static bool qc_sqlite_init(const char* args)
|
||||
static bool qc_sqlite_setup(const char* args)
|
||||
{
|
||||
QC_TRACE();
|
||||
assert(!this_unit.initialized);
|
||||
assert(!this_unit.setup);
|
||||
|
||||
qc_log_level_t log_level = QC_LOG_NOTHING;
|
||||
|
||||
@ -2672,20 +2674,31 @@ static bool qc_sqlite_init(const char* args)
|
||||
}
|
||||
}
|
||||
|
||||
this_unit.setup = true;
|
||||
this_unit.log_level = log_level;
|
||||
|
||||
return this_unit.setup;
|
||||
}
|
||||
|
||||
static bool qc_sqlite_init(void)
|
||||
{
|
||||
QC_TRACE();
|
||||
assert(this_unit.setup);
|
||||
assert(!this_unit.initialized);
|
||||
|
||||
if (sqlite3_initialize() == 0)
|
||||
{
|
||||
init_builtin_functions();
|
||||
|
||||
this_unit.initialized = true;
|
||||
this_unit.log_level = log_level;
|
||||
|
||||
if (qc_sqlite_thread_init())
|
||||
{
|
||||
if (log_level != QC_LOG_NOTHING)
|
||||
if (this_unit.log_level != QC_LOG_NOTHING)
|
||||
{
|
||||
const char* message;
|
||||
|
||||
switch (log_level)
|
||||
switch (this_unit.log_level)
|
||||
{
|
||||
case QC_LOG_NON_PARSED:
|
||||
message = "Statements that cannot be parsed completely are logged.";
|
||||
@ -3176,6 +3189,7 @@ MXS_MODULE* MXS_CREATE_MODULE()
|
||||
{
|
||||
static QUERY_CLASSIFIER qc =
|
||||
{
|
||||
qc_sqlite_setup,
|
||||
qc_sqlite_init,
|
||||
qc_sqlite_end,
|
||||
qc_sqlite_thread_init,
|
||||
|
@ -163,9 +163,9 @@ QUERY_CLASSIFIER* get_classifier(const char* zName, const char* zArgs)
|
||||
|
||||
if (pClassifier)
|
||||
{
|
||||
if (!pClassifier->qc_init(zArgs))
|
||||
if (!pClassifier->qc_setup(zArgs) || !pClassifier->qc_init())
|
||||
{
|
||||
cerr << "error: Could not init classifier " << zName << "." << endl;
|
||||
cerr << "error: Could not setup or init classifier " << zName << "." << endl;
|
||||
qc_unload(pClassifier);
|
||||
pClassifier = 0;
|
||||
}
|
||||
|
@ -54,7 +54,12 @@ bool qc_init(const char* plugin_name, const char* plugin_args)
|
||||
|
||||
if (classifier)
|
||||
{
|
||||
success = classifier->qc_init(plugin_args);
|
||||
success = classifier->qc_setup(plugin_args);
|
||||
|
||||
if (success)
|
||||
{
|
||||
success = classifier->qc_init();
|
||||
}
|
||||
}
|
||||
|
||||
return success;
|
||||
|
Reference in New Issue
Block a user