fix dblink bugs
This commit is contained in:
102
deps/oblib/src/lib/mysqlclient/ob_mysql_proxy.cpp
vendored
102
deps/oblib/src/lib/mysqlclient/ob_mysql_proxy.cpp
vendored
@ -423,118 +423,112 @@ int ObDbLinkProxy::switch_dblink_conn_pool(DblinkDriverProto type, ObISQLConnect
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDbLinkProxy::create_dblink_pool(uint64_t tenant_id, uint64_t dblink_id, DblinkDriverProto dblink_type, const ObAddr &server,
|
||||
int ObDbLinkProxy::create_dblink_pool(const dblink_param_ctx ¶m_ctx, const ObAddr &server,
|
||||
const ObString &db_tenant, const ObString &db_user,
|
||||
const ObString &db_pass, const ObString &db_name,
|
||||
const common::ObString &conn_str,
|
||||
const common::ObString &cluster_str,
|
||||
const dblink_param_ctx ¶m_ctx)
|
||||
const common::ObString &cluster_str)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObISQLConnectionPool *dblink_pool = NULL;
|
||||
if (!is_inited()) {
|
||||
ret = OB_NOT_INIT;
|
||||
LOG_WARN("mysql proxy not inited");
|
||||
} else if (OB_FAIL(switch_dblink_conn_pool(dblink_type, dblink_pool))) {
|
||||
} else if (OB_FAIL(switch_dblink_conn_pool(param_ctx.link_type_, dblink_pool))) {
|
||||
LOG_WARN("failed to get dblink interface", K(ret));
|
||||
} else if (OB_FAIL(dblink_pool->create_dblink_pool(tenant_id, dblink_id, server, db_tenant,
|
||||
} else if (OB_FAIL(dblink_pool->create_dblink_pool(param_ctx, server, db_tenant,
|
||||
db_user, db_pass, db_name,
|
||||
conn_str, cluster_str, param_ctx))) {
|
||||
LOG_WARN("create dblink pool failed", K(ret), K(dblink_id), K(server),
|
||||
conn_str, cluster_str))) {
|
||||
LOG_WARN("create dblink pool failed", K(ret), K(param_ctx), K(server),
|
||||
K(db_tenant), K(db_user), K(db_pass), K(db_name));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDbLinkProxy::acquire_dblink(uint64_t tenant_id, uint64_t dblink_id,
|
||||
DblinkDriverProto dblink_type,
|
||||
const dblink_param_ctx ¶m_ctx,
|
||||
ObISQLConnection *&dblink_conn,
|
||||
uint32_t sessid,
|
||||
int64_t sql_request_level,
|
||||
const char *set_sql_mode_cstr)
|
||||
int ObDbLinkProxy::acquire_dblink(const dblink_param_ctx ¶m_ctx, ObISQLConnection *&dblink_conn)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObISQLConnectionPool *dblink_pool = NULL;
|
||||
if (!is_inited()) {
|
||||
ret = OB_NOT_INIT;
|
||||
LOG_WARN("dblink proxy not inited");
|
||||
} else if (OB_FAIL(switch_dblink_conn_pool(dblink_type, dblink_pool))) {
|
||||
LOG_WARN("failed to get dblink interface", K(ret), K(dblink_type));
|
||||
} else if (OB_FAIL(dblink_pool->acquire_dblink(tenant_id, dblink_id, param_ctx, dblink_conn,
|
||||
sessid, sql_request_level))) {
|
||||
LOG_WARN("acquire dblink failed", K(ret), K(dblink_id), K(dblink_type));
|
||||
} else if (OB_FAIL(prepare_enviroment(dblink_conn, dblink_type, set_sql_mode_cstr))) {
|
||||
} else if (OB_FAIL(switch_dblink_conn_pool(param_ctx.link_type_, dblink_pool))) {
|
||||
LOG_WARN("failed to get dblink interface", K(ret), K(param_ctx));
|
||||
} else if (OB_FAIL(dblink_pool->acquire_dblink(param_ctx, dblink_conn))) {
|
||||
LOG_WARN("acquire dblink failed", K(ret), K(param_ctx));
|
||||
} else if (OB_FAIL(prepare_enviroment(param_ctx, dblink_conn))) {
|
||||
LOG_WARN("failed to prepare dblink env", K(ret));
|
||||
} else {
|
||||
dblink_conn->set_dblink_id(dblink_id);
|
||||
dblink_conn->set_dblink_driver_proto(static_cast<int64_t>(dblink_type));
|
||||
dblink_conn->set_dblink_id(param_ctx.dblink_id_);
|
||||
dblink_conn->set_dblink_driver_proto(param_ctx.link_type_);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDbLinkProxy::prepare_enviroment(ObISQLConnection *dblink_conn, int link_type, const char *set_sql_mode_cstr)
|
||||
int ObDbLinkProxy::prepare_enviroment(const sqlclient::dblink_param_ctx ¶m_ctx, ObISQLConnection *dblink_conn)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
bool is_inited = false;
|
||||
if (OB_ISNULL(dblink_conn)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("dblink is null", K(ret));
|
||||
} else if (OB_FAIL(dblink_conn->is_session_inited(set_sql_mode_cstr, is_inited))) {
|
||||
} else if (OB_FAIL(dblink_conn->is_session_inited(param_ctx, is_inited))) {
|
||||
LOG_WARN("failed to get init status", K(ret));
|
||||
} else if (is_inited) {
|
||||
// do nothing
|
||||
} else {
|
||||
if (OB_FAIL(execute_init_sql(dblink_conn, link_type, set_sql_mode_cstr))) {
|
||||
if (OB_FAIL(execute_init_sql(param_ctx, dblink_conn))) {
|
||||
LOG_WARN("failed to execute init sql", K(ret));
|
||||
} else {
|
||||
LOG_DEBUG("set session variable nls_date_format");
|
||||
dblink_conn->set_init_remote_env(true);
|
||||
dblink_conn->set_session_init_status(true);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDbLinkProxy::execute_init_sql(ObISQLConnection *dblink_conn, int link_type, const char *set_sql_mode_cstr)
|
||||
int ObDbLinkProxy::execute_init_sql(const sqlclient::dblink_param_ctx ¶m_ctx,
|
||||
ObISQLConnection *dblink_conn)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
typedef const char * sql_ptr_type;
|
||||
if (!lib::is_oracle_mode()) {
|
||||
const int64_t sql_ptr_count = 2;
|
||||
sql_ptr_type sql_ptr[sql_ptr_count] = {set_sql_mode_cstr,
|
||||
"set character_set_results = NULL"};
|
||||
if (OB_ISNULL(set_sql_mode_cstr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null ptr", K(ret), KP(set_sql_mode_cstr));
|
||||
} else {
|
||||
ObMySQLStatement stmt;
|
||||
ObMySQLConnection *mysql_conn = static_cast<ObMySQLConnection *>(dblink_conn);
|
||||
for (int i = 0; OB_SUCC(ret) && i < sql_ptr_count; ++i) {
|
||||
if (OB_FAIL(stmt.init(*mysql_conn, sql_ptr[i]))) {
|
||||
LOG_WARN("create statement failed", K(ret), K(link_type));
|
||||
} else if (OB_FAIL(stmt.execute_update())) {
|
||||
LOG_WARN("execute sql failed", K(ret), K(link_type));
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
sql_ptr_type sql_ptr[] = {param_ctx.set_sql_mode_cstr_,
|
||||
param_ctx.set_client_charset_cstr_,
|
||||
param_ctx.set_connection_charset_cstr_,
|
||||
param_ctx.set_results_charset_cstr_};
|
||||
ObMySQLStatement stmt;
|
||||
ObMySQLConnection *mysql_conn = static_cast<ObMySQLConnection *>(dblink_conn);
|
||||
for (int i = 0; OB_SUCC(ret) && i < sizeof(sql_ptr) / sizeof(sql_ptr_type); ++i) {
|
||||
if (OB_ISNULL(sql_ptr[i])) {
|
||||
//do nothing
|
||||
} else if (OB_FAIL(stmt.init(*mysql_conn, sql_ptr[i]))) {
|
||||
LOG_WARN("create statement failed", K(ret), K(param_ctx));
|
||||
} else if (OB_FAIL(stmt.execute_update())) {
|
||||
LOG_WARN("execute sql failed", K(ret), K(param_ctx));
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
} else if (DBLINK_DRV_OB == link_type) {
|
||||
} else if (DBLINK_DRV_OB == param_ctx.link_type_) {
|
||||
static sql_ptr_type sql_ptr[] = {
|
||||
"set character_set_results = NULL",
|
||||
param_ctx.set_client_charset_cstr_,
|
||||
param_ctx.set_connection_charset_cstr_,
|
||||
param_ctx.set_results_charset_cstr_,
|
||||
"set nls_date_format='YYYY-MM-DD HH24:MI:SS'",
|
||||
"set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF'",
|
||||
"set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF TZR TZD'"
|
||||
};
|
||||
int64_t sql_ptr_count = sizeof(sql_ptr) / sizeof(sql_ptr_type);
|
||||
// todo statement may different
|
||||
ObMySQLStatement stmt;
|
||||
ObMySQLConnection *mysql_conn = static_cast<ObMySQLConnection *>(dblink_conn);
|
||||
for (int i = 0; OB_SUCC(ret) && i < sql_ptr_count; ++i) {
|
||||
if (OB_FAIL(stmt.init(*mysql_conn, sql_ptr[i]))) {
|
||||
LOG_WARN("create statement failed", K(ret), K(link_type));
|
||||
for (int i = 0; OB_SUCC(ret) && i < sizeof(sql_ptr) / sizeof(sql_ptr_type); ++i) {
|
||||
if (OB_ISNULL(sql_ptr[i])) {
|
||||
//do nothing
|
||||
} else if (OB_FAIL(stmt.init(*mysql_conn, sql_ptr[i]))) {
|
||||
LOG_WARN("create statement failed", K(ret), K(param_ctx));
|
||||
} else if (OB_FAIL(stmt.execute_update())) {
|
||||
LOG_WARN("execute sql failed", K(ret), K(link_type));
|
||||
LOG_WARN("execute sql failed", K(ret), K(param_ctx));
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
@ -543,7 +537,7 @@ int ObDbLinkProxy::execute_init_sql(ObISQLConnection *dblink_conn, int link_type
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDbLinkProxy::release_dblink(/*uint64_t dblink_id,*/ DblinkDriverProto dblink_type, ObISQLConnection *dblink_conn, uint32_t sessid)
|
||||
int ObDbLinkProxy::release_dblink(/*uint64_t dblink_id,*/ DblinkDriverProto dblink_type, ObISQLConnection *dblink_conn)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObISQLConnectionPool *dblink_pool = NULL;
|
||||
@ -552,8 +546,8 @@ int ObDbLinkProxy::release_dblink(/*uint64_t dblink_id,*/ DblinkDriverProto dbli
|
||||
LOG_WARN("dblink proxy not inited");
|
||||
} else if (OB_FAIL(switch_dblink_conn_pool(dblink_type, dblink_pool))) {
|
||||
LOG_WARN("failed to get dblink interface", K(ret));
|
||||
} else if (OB_FAIL(dblink_pool->release_dblink(dblink_conn, sessid))) {
|
||||
LOG_WARN("release dblink failed", K(ret), K(sessid));
|
||||
} else if (OB_FAIL(dblink_pool->release_dblink(dblink_conn))) {
|
||||
LOG_WARN("release dblink failed", K(ret), K(dblink_conn));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user