Abstract the session default database
The default database can now be manipulated with a set of functions exposed by the maxscale/protocol/mysql.h header. This removes the need to handle the structures themselves in the modules and is a step towards moving the dcb->data contents inside the session.
This commit is contained in:
@ -485,4 +485,23 @@ mysql_server_cmd_t mxs_mysql_current_command(MXS_SESSION* session);
|
|||||||
void mysql_num_response_packets(GWBUF *buf, uint8_t cmd,
|
void mysql_num_response_packets(GWBUF *buf, uint8_t cmd,
|
||||||
int* npackets, size_t *nbytes);
|
int* npackets, size_t *nbytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return current database of the session
|
||||||
|
*
|
||||||
|
* If no active database is in use, the database is an empty string.
|
||||||
|
*
|
||||||
|
* @param session Session to inspect
|
||||||
|
*
|
||||||
|
* @return The current database
|
||||||
|
*/
|
||||||
|
const char* mxs_mysql_get_current_db(MXS_SESSION* session);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the currently active database for a session
|
||||||
|
*
|
||||||
|
* @param session Session to modify
|
||||||
|
* @param db The new database
|
||||||
|
*/
|
||||||
|
void mxs_mysql_set_current_db(MXS_SESSION* session, const char* db);
|
||||||
|
|
||||||
MXS_END_DECLS
|
MXS_END_DECLS
|
||||||
|
2
server/modules/filter/cache/CMakeLists.txt
vendored
2
server/modules/filter/cache/CMakeLists.txt
vendored
@ -17,7 +17,7 @@ if (JANSSON_FOUND)
|
|||||||
storagefactory.cc
|
storagefactory.cc
|
||||||
storagereal.cc
|
storagereal.cc
|
||||||
)
|
)
|
||||||
target_link_libraries(cache maxscale-common ${JANSSON_LIBRARIES})
|
target_link_libraries(cache maxscale-common ${JANSSON_LIBRARIES} MySQLCommon)
|
||||||
set_target_properties(cache PROPERTIES VERSION "1.0.0")
|
set_target_properties(cache PROPERTIES VERSION "1.0.0")
|
||||||
set_target_properties(cache PROPERTIES LINK_FLAGS -Wl,-z,defs)
|
set_target_properties(cache PROPERTIES LINK_FLAGS -Wl,-z,defs)
|
||||||
install_module(cache core)
|
install_module(cache core)
|
||||||
|
@ -205,15 +205,15 @@ CacheFilterSession* CacheFilterSession::Create(Cache* pCache, MXS_SESSION* pSess
|
|||||||
ss_dassert(pSession->client_dcb);
|
ss_dassert(pSession->client_dcb);
|
||||||
ss_dassert(pSession->client_dcb->data);
|
ss_dassert(pSession->client_dcb->data);
|
||||||
|
|
||||||
MYSQL_session *pMysqlSession = (MYSQL_session*)pSession->client_dcb->data;
|
const char* zDb = mxs_mysql_get_current_db(pSession);
|
||||||
char* zDefaultDb = NULL;
|
char* zDefaultDb = NULL;
|
||||||
|
|
||||||
if (pMysqlSession->db[0] != 0)
|
if (zDb[0] != 0)
|
||||||
{
|
{
|
||||||
zDefaultDb = MXS_STRDUP(pMysqlSession->db);
|
zDefaultDb = MXS_STRDUP(zDb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pMysqlSession->db[0] == 0) || zDefaultDb)
|
if ((zDb[0] == 0) || zDefaultDb)
|
||||||
{
|
{
|
||||||
pCacheFilterSession = new (std::nothrow) CacheFilterSession(pSession, pCache, zDefaultDb);
|
pCacheFilterSession = new (std::nothrow) CacheFilterSession(pSession, pCache, zDefaultDb);
|
||||||
|
|
||||||
|
@ -7,13 +7,13 @@ if(BISON_FOUND AND FLEX_FOUND)
|
|||||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
add_library(dbfwfilter SHARED dbfwfilter.c ${BISON_ruleparser_OUTPUTS} ${FLEX_token_OUTPUTS})
|
add_library(dbfwfilter SHARED dbfwfilter.c ${BISON_ruleparser_OUTPUTS} ${FLEX_token_OUTPUTS})
|
||||||
target_link_libraries(dbfwfilter maxscale-common)
|
target_link_libraries(dbfwfilter maxscale-common MySQLCommon)
|
||||||
set_target_properties(dbfwfilter PROPERTIES VERSION "1.0.0")
|
set_target_properties(dbfwfilter PROPERTIES VERSION "1.0.0")
|
||||||
install_module(dbfwfilter core)
|
install_module(dbfwfilter core)
|
||||||
|
|
||||||
# The offline rule check utility
|
# The offline rule check utility
|
||||||
add_executable(dbfwchk dbfw_rule_check.c ${BISON_ruleparser_OUTPUTS} ${FLEX_token_OUTPUTS})
|
add_executable(dbfwchk dbfw_rule_check.c ${BISON_ruleparser_OUTPUTS} ${FLEX_token_OUTPUTS})
|
||||||
target_link_libraries(dbfwchk maxscale-common)
|
target_link_libraries(dbfwchk maxscale-common MySQLCommon)
|
||||||
install_executable(dbfwchk core)
|
install_executable(dbfwchk core)
|
||||||
|
|
||||||
else()
|
else()
|
||||||
|
@ -1745,7 +1745,7 @@ GWBUF* gen_dummy_error(FW_SESSION* session, char* msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dcb = session->session->client_dcb;
|
dcb = session->session->client_dcb;
|
||||||
mysql_session = (MYSQL_session*) dcb->data;
|
const char* db = mxs_mysql_get_current_db(session->session);
|
||||||
errlen = msg != NULL ? strlen(msg) : 0;
|
errlen = msg != NULL ? strlen(msg) : 0;
|
||||||
errmsg = (char*) MXS_MALLOC((512 + errlen) * sizeof(char));
|
errmsg = (char*) MXS_MALLOC((512 + errlen) * sizeof(char));
|
||||||
|
|
||||||
@ -1755,14 +1755,14 @@ GWBUF* gen_dummy_error(FW_SESSION* session, char* msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (mysql_session->db[0] == '\0')
|
if (db[0] == '\0')
|
||||||
{
|
{
|
||||||
sprintf(errmsg, "Access denied for user '%s'@'%s'", dcb->user, dcb->remote);
|
sprintf(errmsg, "Access denied for user '%s'@'%s'", dcb->user, dcb->remote);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(errmsg, "Access denied for user '%s'@'%s' to database '%s'",
|
sprintf(errmsg, "Access denied for user '%s'@'%s' to database '%s'",
|
||||||
dcb->user, dcb->remote, mysql_session->db);
|
dcb->user, dcb->remote, db);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg != NULL)
|
if (msg != NULL)
|
||||||
|
@ -807,21 +807,15 @@ void pushMessage(MQ_INSTANCE *instance, amqp_basic_properties_t* prop, char* msg
|
|||||||
static MXS_FILTER_SESSION *
|
static MXS_FILTER_SESSION *
|
||||||
newSession(MXS_FILTER *instance, MXS_SESSION *session)
|
newSession(MXS_FILTER *instance, MXS_SESSION *session)
|
||||||
{
|
{
|
||||||
MYSQL_session *sessauth = session->client_dcb->data;
|
const char *db = mxs_mysql_get_current_db(session);
|
||||||
char *db = sessauth->db;
|
char* my_db = NULL;
|
||||||
if (db)
|
|
||||||
|
if (*db)
|
||||||
{
|
{
|
||||||
if (strnlen(db, 128) > 0)
|
my_db = MXS_STRDUP(my_db);
|
||||||
|
if (!my_db)
|
||||||
{
|
{
|
||||||
db = MXS_STRDUP(db);
|
return NULL;
|
||||||
if (!db)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
db = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -832,11 +826,11 @@ newSession(MXS_FILTER *instance, MXS_SESSION *session)
|
|||||||
my_session->was_query = false;
|
my_session->was_query = false;
|
||||||
my_session->uid = NULL;
|
my_session->uid = NULL;
|
||||||
my_session->session = session;
|
my_session->session = session;
|
||||||
my_session->db = db;
|
my_session->db = my_db;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MXS_FREE(db);
|
MXS_FREE(my_db);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (MXS_FILTER_SESSION*)my_session;
|
return (MXS_FILTER_SESSION*)my_session;
|
||||||
|
@ -1587,3 +1587,15 @@ mysql_server_cmd_t mxs_mysql_current_command(MXS_SESSION* session)
|
|||||||
MySQLProtocol* proto = (MySQLProtocol*)session->client_dcb->protocol;
|
MySQLProtocol* proto = (MySQLProtocol*)session->client_dcb->protocol;
|
||||||
return proto->current_command;
|
return proto->current_command;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* mxs_mysql_get_current_db(MXS_SESSION* session)
|
||||||
|
{
|
||||||
|
MYSQL_session* data = (MYSQL_session*)session->client_dcb->data;
|
||||||
|
return data->db;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mxs_mysql_set_current_db(MXS_SESSION* session, const char* db)
|
||||||
|
{
|
||||||
|
MYSQL_session* data = (MYSQL_session*)session->client_dcb->data;
|
||||||
|
snprintf(data->db, sizeof(data->db), "%s", db);
|
||||||
|
}
|
||||||
|
@ -380,8 +380,7 @@ bool execute_sescmd_in_backend(backend_ref_t *backend_ref)
|
|||||||
MYSQL_session* data;
|
MYSQL_session* data;
|
||||||
unsigned int qlen;
|
unsigned int qlen;
|
||||||
|
|
||||||
data = (MYSQL_session*)dcb->session->client_dcb->data;
|
mxs_mysql_set_current_db(dcb->session, "");
|
||||||
*data->db = 0;
|
|
||||||
tmpbuf = scur->scmd_cur_cmd->my_sescmd_buf;
|
tmpbuf = scur->scmd_cur_cmd->my_sescmd_buf;
|
||||||
qlen = MYSQL_GET_PAYLOAD_LEN((unsigned char *) GWBUF_DATA(tmpbuf));
|
qlen = MYSQL_GET_PAYLOAD_LEN((unsigned char *) GWBUF_DATA(tmpbuf));
|
||||||
if (qlen)
|
if (qlen)
|
||||||
@ -394,8 +393,10 @@ bool execute_sescmd_in_backend(backend_ref_t *backend_ref)
|
|||||||
qlen = MYSQL_DATABASE_MAXLEN;
|
qlen = MYSQL_DATABASE_MAXLEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(data->db, (char*)GWBUF_DATA(tmpbuf) + 5, qlen);
|
char db[qlen + 1];
|
||||||
data->db[qlen] = 0;
|
memcpy(db, (char*)GWBUF_DATA(tmpbuf) + 5, qlen);
|
||||||
|
db[qlen] = 0;
|
||||||
|
mxs_mysql_set_current_db(dcb->session, db);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/** Fallthrough */
|
/** Fallthrough */
|
||||||
|
@ -54,8 +54,8 @@ void check_drop_tmp_table(ROUTER_CLIENT_SES *router_cli_ses, GWBUF *querybuf)
|
|||||||
|
|
||||||
for (size_t i = 0; i < n_infos; i++)
|
for (size_t i = 0; i < n_infos; i++)
|
||||||
{
|
{
|
||||||
MYSQL_session* data = static_cast<MYSQL_session*>(router_cli_ses->client_dcb->data);
|
const char* db = mxs_mysql_get_current_db(router_cli_ses->client_dcb->session);
|
||||||
std::string table = info[i].database ? info[i].database : data->db;
|
std::string table = info[i].database ? info[i].database : db;
|
||||||
table += ".";
|
table += ".";
|
||||||
|
|
||||||
if (info[i].table)
|
if (info[i].table)
|
||||||
@ -95,8 +95,8 @@ bool is_read_tmp_table(ROUTER_CLIENT_SES *router_cli_ses,
|
|||||||
|
|
||||||
for (size_t i = 0; i < n_infos; i++)
|
for (size_t i = 0; i < n_infos; i++)
|
||||||
{
|
{
|
||||||
MYSQL_session* data = static_cast<MYSQL_session*>(router_cli_ses->client_dcb->data);
|
const char* db = mxs_mysql_get_current_db(router_cli_ses->client_dcb->session);
|
||||||
std::string table = info[i].database ? info[i].database : data->db;
|
std::string table = info[i].database ? info[i].database : db;
|
||||||
table += ".";
|
table += ".";
|
||||||
|
|
||||||
if (info[i].table)
|
if (info[i].table)
|
||||||
@ -142,8 +142,8 @@ void check_create_tmp_table(ROUTER_CLIENT_SES *router_cli_ses,
|
|||||||
|
|
||||||
if (tblname && *tblname)
|
if (tblname && *tblname)
|
||||||
{
|
{
|
||||||
MYSQL_session* data = static_cast<MYSQL_session*>(router_cli_ses->client_dcb->data);
|
const char* db = mxs_mysql_get_current_db(router_cli_ses->client_dcb->session);
|
||||||
table += data->db;
|
table += db;
|
||||||
table += ".";
|
table += ".";
|
||||||
table += tblname;
|
table += tblname;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
add_library(schemarouter SHARED schemarouter.cc schemarouterinstance.cc schemaroutersession.cc shard_map.cc session_command.cc)
|
add_library(schemarouter SHARED schemarouter.cc schemarouterinstance.cc schemaroutersession.cc shard_map.cc session_command.cc)
|
||||||
target_link_libraries(schemarouter maxscale-common)
|
target_link_libraries(schemarouter maxscale-common MySQLCommon)
|
||||||
add_dependencies(schemarouter pcre2)
|
add_dependencies(schemarouter pcre2)
|
||||||
set_target_properties(schemarouter PROPERTIES VERSION "1.0.0")
|
set_target_properties(schemarouter PROPERTIES VERSION "1.0.0")
|
||||||
install_module(schemarouter core)
|
install_module(schemarouter core)
|
||||||
|
@ -46,28 +46,23 @@ SchemaRouterSession::SchemaRouterSession(MXS_SESSION* session, SchemaRouter* rou
|
|||||||
{
|
{
|
||||||
char db[MYSQL_DATABASE_MAXLEN + 1] = "";
|
char db[MYSQL_DATABASE_MAXLEN + 1] = "";
|
||||||
MySQLProtocol* protocol = (MySQLProtocol*)session->client_dcb->protocol;
|
MySQLProtocol* protocol = (MySQLProtocol*)session->client_dcb->protocol;
|
||||||
MYSQL_session* data = (MYSQL_session*)session->client_dcb->data;
|
|
||||||
bool using_db = false;
|
bool using_db = false;
|
||||||
bool have_db = false;
|
bool have_db = false;
|
||||||
|
const char* current_db = mxs_mysql_get_current_db(session);
|
||||||
|
|
||||||
/* To enable connecting directly to a sharded database we first need
|
/* To enable connecting directly to a sharded database we first need
|
||||||
* to disable it for the client DCB's protocol so that we can connect to them*/
|
* to disable it for the client DCB's protocol so that we can connect to them*/
|
||||||
if (protocol->client_capabilities & GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB &&
|
if (protocol->client_capabilities & GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB &&
|
||||||
(have_db = strnlen(data->db, MYSQL_DATABASE_MAXLEN) > 0))
|
(have_db = *current_db))
|
||||||
{
|
{
|
||||||
protocol->client_capabilities &= ~GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB;
|
protocol->client_capabilities &= ~GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB;
|
||||||
strcpy(db, data->db);
|
strcpy(db, current_db);
|
||||||
*data->db = 0;
|
mxs_mysql_set_current_db(session, "");
|
||||||
using_db = true;
|
using_db = true;
|
||||||
MXS_INFO("Client logging in directly to a database '%s', "
|
MXS_INFO("Client logging in directly to a database '%s', "
|
||||||
"postponing until databases have been mapped.", db);
|
"postponing until databases have been mapped.", db);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!have_db)
|
|
||||||
{
|
|
||||||
MXS_INFO("Client'%s' connecting with empty database.", data->user);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (using_db)
|
if (using_db)
|
||||||
{
|
{
|
||||||
m_state |= INIT_USE_DB;
|
m_state |= INIT_USE_DB;
|
||||||
|
Reference in New Issue
Block a user