mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
6c30220780
Remove the dead-code, in Spider, which is related to the Spider's HandlerSocket support. The code has been disabled for a long time and it is unlikely that the code will be enabled. - rm all files under storage/spider/hs_client/ except hs_compat.h - rm storage/spider/spd_db_handlersocket.* - unifdef -UHS_HAS_SQLCOM -UHAVE_HANDLERSOCKET \ -m storage/spider/spd_* storage/spider/ha_spider.* storage/spider/hs_client/* - remove relevant files from storage/spider/CMakeLists.txt
1732 lines
56 KiB
C++
1732 lines
56 KiB
C++
/* Copyright (C) 2009-2020 Kentoku Shiba
|
|
Copyright (C) 2019-2020 MariaDB corp
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
|
|
|
|
#define MYSQL_SERVER 1
|
|
#include <my_global.h>
|
|
#include "mysql_version.h"
|
|
#include "spd_environ.h"
|
|
#include "sql_priv.h"
|
|
#include "probes_mysql.h"
|
|
#include "sql_class.h"
|
|
#include "sql_partition.h"
|
|
#include "sql_base.h"
|
|
#include "sql_servers.h"
|
|
#include "tztime.h"
|
|
#include "spd_err.h"
|
|
#include "spd_param.h"
|
|
#include "spd_db_include.h"
|
|
#include "spd_include.h"
|
|
#include "spd_sys_table.h"
|
|
#include "ha_spider.h"
|
|
#include "spd_db_conn.h"
|
|
#include "spd_trx.h"
|
|
#include "spd_conn.h"
|
|
#include "spd_table.h"
|
|
#include "spd_direct_sql.h"
|
|
#include "spd_udf.h"
|
|
#include "spd_malloc.h"
|
|
|
|
#define SPIDER_NEED_INIT_ONE_TABLE_FOR_FIND_TEMPORARY_TABLE
|
|
|
|
extern const char **spd_defaults_extra_file;
|
|
extern const char **spd_defaults_file;
|
|
|
|
extern handlerton *spider_hton_ptr;
|
|
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
|
|
|
|
#ifdef HAVE_PSI_INTERFACE
|
|
extern PSI_mutex_key spd_key_mutex_mta_conn;
|
|
extern PSI_mutex_key spd_key_mutex_bg_direct_sql;
|
|
extern PSI_cond_key spd_key_cond_bg_direct_sql;
|
|
#endif
|
|
|
|
extern HASH spider_open_connections;
|
|
extern HASH spider_ipport_conns;
|
|
extern pthread_mutex_t spider_conn_mutex;
|
|
extern pthread_mutex_t spider_conn_id_mutex;
|
|
extern pthread_mutex_t spider_ipport_conn_mutex;
|
|
extern ulonglong spider_conn_id;
|
|
|
|
/* UTC time zone for timestamp columns */
|
|
extern Time_zone *UTC;
|
|
|
|
uint spider_udf_calc_hash(
|
|
char *key,
|
|
uint mod
|
|
) {
|
|
uint sum = 0;
|
|
DBUG_ENTER("spider_udf_calc_hash");
|
|
while (*key != '\0')
|
|
{
|
|
sum += *key;
|
|
key++;
|
|
}
|
|
DBUG_PRINT("info",("spider calc hash = %u", sum % mod));
|
|
DBUG_RETURN(sum % mod);
|
|
}
|
|
|
|
int spider_udf_direct_sql_create_table_list(
|
|
SPIDER_DIRECT_SQL *direct_sql,
|
|
char *table_name_list,
|
|
uint table_name_list_length
|
|
) {
|
|
int table_count, roop_count, length;
|
|
char *tmp_ptr, *tmp_ptr2, *tmp_ptr3, *tmp_name_ptr;
|
|
THD *thd = direct_sql->trx->thd;
|
|
DBUG_ENTER("spider_udf_direct_sql_create_table_list");
|
|
tmp_ptr = table_name_list;
|
|
while (*tmp_ptr == ' ')
|
|
tmp_ptr++;
|
|
if (*tmp_ptr)
|
|
table_count = 1;
|
|
else {
|
|
direct_sql->table_count = 0;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
while (TRUE)
|
|
{
|
|
if ((tmp_ptr2 = strchr(tmp_ptr, ' ')))
|
|
{
|
|
table_count++;
|
|
tmp_ptr = tmp_ptr2 + 1;
|
|
while (*tmp_ptr == ' ')
|
|
tmp_ptr++;
|
|
} else
|
|
break;
|
|
}
|
|
if (!(direct_sql->db_names = (char**)
|
|
spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_TABLE_LIST_2, MYF(MY_WME | MY_ZEROFILL),
|
|
&direct_sql->db_names, (uint) (sizeof(char*) * table_count),
|
|
&direct_sql->table_names, (uint) (sizeof(char*) * table_count),
|
|
&direct_sql->tables, (uint) (sizeof(TABLE*) * table_count),
|
|
&tmp_name_ptr, (uint) (sizeof(char) * (
|
|
table_name_list_length +
|
|
SPIDER_THD_db_length(thd) * table_count +
|
|
2 * table_count
|
|
)),
|
|
&direct_sql->iop, (uint) (sizeof(int) * table_count),
|
|
&direct_sql->table_list, (uint) (sizeof(TABLE_LIST) * table_count),
|
|
&direct_sql->real_table_bitmap,
|
|
(uint) (sizeof(uchar) * ((table_count + 7) / 8)),
|
|
NullS))
|
|
)
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
|
|
tmp_ptr = table_name_list;
|
|
while (*tmp_ptr == ' ')
|
|
tmp_ptr++;
|
|
roop_count = 0;
|
|
while (TRUE)
|
|
{
|
|
if ((tmp_ptr2 = strchr(tmp_ptr, ' ')))
|
|
*tmp_ptr2 = '\0';
|
|
|
|
direct_sql->db_names[roop_count] = tmp_name_ptr;
|
|
|
|
if ((tmp_ptr3 = strchr(tmp_ptr, '.')))
|
|
{
|
|
/* exist database name */
|
|
*tmp_ptr3 = '\0';
|
|
length = strlen(tmp_ptr);
|
|
memcpy(tmp_name_ptr, tmp_ptr, length + 1);
|
|
tmp_name_ptr += length + 1;
|
|
tmp_ptr = tmp_ptr3 + 1;
|
|
} else {
|
|
if (SPIDER_THD_db_str(thd))
|
|
{
|
|
memcpy(tmp_name_ptr, SPIDER_THD_db_str(thd),
|
|
SPIDER_THD_db_length(thd) + 1);
|
|
tmp_name_ptr += SPIDER_THD_db_length(thd) + 1;
|
|
} else {
|
|
direct_sql->db_names[roop_count] = (char *) "";
|
|
}
|
|
}
|
|
|
|
direct_sql->table_names[roop_count] = tmp_name_ptr;
|
|
length = strlen(tmp_ptr);
|
|
memcpy(tmp_name_ptr, tmp_ptr, length + 1);
|
|
tmp_name_ptr += length + 1;
|
|
|
|
DBUG_PRINT("info",("spider db=%s",
|
|
direct_sql->db_names[roop_count]));
|
|
DBUG_PRINT("info",("spider table_name=%s",
|
|
direct_sql->table_names[roop_count]));
|
|
|
|
if (!tmp_ptr2)
|
|
break;
|
|
tmp_ptr = tmp_ptr2 + 1;
|
|
while (*tmp_ptr == ' ')
|
|
tmp_ptr++;
|
|
roop_count++;
|
|
}
|
|
direct_sql->table_count = table_count;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_udf_direct_sql_create_conn_key(
|
|
SPIDER_DIRECT_SQL *direct_sql
|
|
) {
|
|
char *tmp_name, port_str[6];
|
|
DBUG_ENTER("spider_udf_direct_sql_create_conn_key");
|
|
|
|
uint roop_count2;
|
|
bool tables_on_different_db_are_joinable = TRUE;
|
|
direct_sql->dbton_id = SPIDER_DBTON_SIZE;
|
|
DBUG_PRINT("info",("spider direct_sql->tgt_wrapper=%s",
|
|
direct_sql->tgt_wrapper));
|
|
for (roop_count2 = 0; roop_count2 < SPIDER_DBTON_SIZE; roop_count2++)
|
|
{
|
|
DBUG_PRINT("info",("spider spider_dbton[%d].wrapper=%s", roop_count2,
|
|
spider_dbton[roop_count2].wrapper ?
|
|
spider_dbton[roop_count2].wrapper : "NULL"));
|
|
if (
|
|
spider_dbton[roop_count2].wrapper &&
|
|
!strcmp(direct_sql->tgt_wrapper, spider_dbton[roop_count2].wrapper)
|
|
) {
|
|
if (spider_dbton[roop_count2].db_access_type ==
|
|
SPIDER_DB_ACCESS_TYPE_SQL)
|
|
{
|
|
direct_sql->dbton_id = roop_count2;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (direct_sql->dbton_id == SPIDER_DBTON_SIZE)
|
|
{
|
|
my_printf_error(
|
|
ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
|
|
ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
|
|
MYF(0), direct_sql->tgt_wrapper);
|
|
DBUG_RETURN(ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM);
|
|
}
|
|
|
|
tables_on_different_db_are_joinable =
|
|
spider_dbton[direct_sql->dbton_id].db_util->
|
|
tables_on_different_db_are_joinable();
|
|
direct_sql->conn_key_length
|
|
= 1
|
|
+ direct_sql->tgt_wrapper_length + 1
|
|
+ direct_sql->tgt_host_length + 1
|
|
+ 5 + 1
|
|
+ direct_sql->tgt_socket_length + 1
|
|
+ (tables_on_different_db_are_joinable ?
|
|
0 : direct_sql->tgt_default_db_name_length + 1)
|
|
+ direct_sql->tgt_username_length + 1
|
|
+ direct_sql->tgt_password_length + 1
|
|
+ direct_sql->tgt_ssl_ca_length + 1
|
|
+ direct_sql->tgt_ssl_capath_length + 1
|
|
+ direct_sql->tgt_ssl_cert_length + 1
|
|
+ direct_sql->tgt_ssl_cipher_length + 1
|
|
+ direct_sql->tgt_ssl_key_length + 1
|
|
+ 1 + 1
|
|
+ direct_sql->tgt_default_file_length + 1
|
|
+ direct_sql->tgt_default_group_length + 1
|
|
+ direct_sql->tgt_dsn_length;
|
|
if (!(direct_sql->conn_key = (char *)
|
|
spider_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_KEY_1, direct_sql->conn_key_length + 1,
|
|
MYF(MY_WME | MY_ZEROFILL)))
|
|
)
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
if (direct_sql->connection_channel > 48)
|
|
*direct_sql->conn_key = '0' + 48 - direct_sql->connection_channel;
|
|
else
|
|
*direct_sql->conn_key = '0' + direct_sql->connection_channel;
|
|
DBUG_PRINT("info",("spider tgt_wrapper=%s", direct_sql->tgt_wrapper));
|
|
tmp_name = strmov(direct_sql->conn_key + 1, direct_sql->tgt_wrapper);
|
|
DBUG_PRINT("info",("spider tgt_host=%s", direct_sql->tgt_host));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_host);
|
|
my_sprintf(port_str, (port_str, "%05ld", direct_sql->tgt_port));
|
|
DBUG_PRINT("info",("spider port_str=%s", port_str));
|
|
tmp_name = strmov(tmp_name + 1, port_str);
|
|
if (direct_sql->tgt_socket)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_socket=%s", direct_sql->tgt_socket));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_socket);
|
|
} else
|
|
tmp_name++;
|
|
if (!tables_on_different_db_are_joinable)
|
|
{
|
|
if (direct_sql->tgt_default_db_name)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_default_db_name=%s",
|
|
direct_sql->tgt_default_db_name));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_db_name);
|
|
} else
|
|
tmp_name++;
|
|
}
|
|
if (direct_sql->tgt_username)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_username=%s", direct_sql->tgt_username));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_username);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_password)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_password=%s", direct_sql->tgt_password));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_password);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_ssl_ca)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_ssl_ca=%s", direct_sql->tgt_ssl_ca));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_ca);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_ssl_capath)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_ssl_capath=%s",
|
|
direct_sql->tgt_ssl_capath));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_capath);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_ssl_cert)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_ssl_cert=%s", direct_sql->tgt_ssl_cert));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_cert);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_ssl_cipher)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_ssl_cipher=%s",
|
|
direct_sql->tgt_ssl_cipher));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_cipher);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_ssl_key)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_ssl_key=%s", direct_sql->tgt_ssl_key));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_key);
|
|
} else
|
|
tmp_name++;
|
|
tmp_name++;
|
|
*tmp_name = '0' + ((char) direct_sql->tgt_ssl_vsc);
|
|
if (direct_sql->tgt_default_file)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_default_file=%s",
|
|
direct_sql->tgt_default_file));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_file);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_default_group)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_default_group=%s",
|
|
direct_sql->tgt_default_group));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_group);
|
|
} else
|
|
tmp_name++;
|
|
if (direct_sql->tgt_dsn)
|
|
{
|
|
DBUG_PRINT("info",("spider tgt_dsn=%s",
|
|
direct_sql->tgt_dsn));
|
|
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_dsn);
|
|
} else
|
|
tmp_name++;
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
direct_sql->conn_key_hash_value = my_calc_hash(&spider_open_connections,
|
|
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length);
|
|
#endif
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
static inline void spider_maybe_memcpy_string(
|
|
char **dest,
|
|
char *src,
|
|
char *tmp,
|
|
uint *dest_len,
|
|
uint src_len)
|
|
{
|
|
*dest_len= src_len;
|
|
if (src_len)
|
|
{
|
|
*dest= tmp;
|
|
memcpy(*dest, src, src_len);
|
|
} else
|
|
*dest= NULL;
|
|
}
|
|
|
|
|
|
SPIDER_CONN *spider_udf_direct_sql_create_conn(
|
|
const SPIDER_DIRECT_SQL *direct_sql,
|
|
int *error_num
|
|
) {
|
|
SPIDER_CONN *conn;
|
|
SPIDER_IP_PORT_CONN *ip_port_conn;
|
|
char *tmp_name, *tmp_host, *tmp_username, *tmp_password, *tmp_socket;
|
|
char *tmp_wrapper, *tmp_db, *tmp_ssl_ca, *tmp_ssl_capath, *tmp_ssl_cert;
|
|
char *tmp_ssl_cipher, *tmp_ssl_key, *tmp_default_file, *tmp_default_group;
|
|
char *tmp_dsn;
|
|
int *need_mon;
|
|
bool tables_on_different_db_are_joinable = TRUE;
|
|
DBUG_ENTER("spider_udf_direct_sql_create_conn");
|
|
|
|
if (unlikely(!UTC))
|
|
{
|
|
/* UTC time zone for timestamp columns */
|
|
String tz_00_name(STRING_WITH_LEN("+00:00"), &my_charset_bin);
|
|
UTC = my_tz_find(current_thd, &tz_00_name);
|
|
}
|
|
|
|
tables_on_different_db_are_joinable =
|
|
spider_dbton[direct_sql->dbton_id].db_util->
|
|
tables_on_different_db_are_joinable();
|
|
if (!(conn = (SPIDER_CONN *)
|
|
spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_1, MYF(MY_WME | MY_ZEROFILL),
|
|
&conn, (uint) (sizeof(*conn)),
|
|
&tmp_name, (uint) (direct_sql->conn_key_length + 1),
|
|
&tmp_host, (uint) (direct_sql->tgt_host_length + 1),
|
|
&tmp_username, (uint) (direct_sql->tgt_username_length + 1),
|
|
&tmp_password, (uint) (direct_sql->tgt_password_length + 1),
|
|
&tmp_socket, (uint) (direct_sql->tgt_socket_length + 1),
|
|
&tmp_wrapper, (uint) (direct_sql->tgt_wrapper_length + 1),
|
|
&tmp_db, (uint) (tables_on_different_db_are_joinable ?
|
|
0 : direct_sql->tgt_default_db_name_length + 1),
|
|
&tmp_ssl_ca, (uint) (direct_sql->tgt_ssl_ca_length + 1),
|
|
&tmp_ssl_capath, (uint) (direct_sql->tgt_ssl_capath_length + 1),
|
|
&tmp_ssl_cert, (uint) (direct_sql->tgt_ssl_cert_length + 1),
|
|
&tmp_ssl_cipher, (uint) (direct_sql->tgt_ssl_cipher_length + 1),
|
|
&tmp_ssl_key, (uint) (direct_sql->tgt_ssl_key_length + 1),
|
|
&tmp_default_file,
|
|
(uint) (direct_sql->tgt_default_file_length + 1),
|
|
&tmp_default_group,
|
|
(uint) (direct_sql->tgt_default_group_length + 1),
|
|
&tmp_dsn,
|
|
(uint) (direct_sql->tgt_dsn_length + 1),
|
|
&need_mon, (uint) (sizeof(int)),
|
|
NullS))
|
|
) {
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error_alloc_conn;
|
|
}
|
|
conn->default_database.init_calc_mem(SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_2);
|
|
|
|
conn->conn_key_length = direct_sql->conn_key_length;
|
|
conn->conn_key = tmp_name;
|
|
memcpy(conn->conn_key, direct_sql->conn_key, direct_sql->conn_key_length);
|
|
conn->tgt_wrapper_length = direct_sql->tgt_wrapper_length;
|
|
conn->tgt_wrapper = tmp_wrapper;
|
|
memcpy(conn->tgt_wrapper, direct_sql->tgt_wrapper,
|
|
direct_sql->tgt_wrapper_length);
|
|
conn->tgt_host_length = direct_sql->tgt_host_length;
|
|
conn->tgt_host = tmp_host;
|
|
memcpy(conn->tgt_host, direct_sql->tgt_host, direct_sql->tgt_host_length);
|
|
conn->tgt_port = direct_sql->tgt_port;
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_socket, direct_sql->tgt_socket, tmp_socket,
|
|
&conn->tgt_socket_length, direct_sql->tgt_socket_length);
|
|
if (!tables_on_different_db_are_joinable)
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_db, direct_sql->tgt_default_db_name, tmp_db,
|
|
&conn->tgt_db_length, direct_sql->tgt_default_db_name_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_username, direct_sql->tgt_username, tmp_username,
|
|
&conn->tgt_username_length, direct_sql->tgt_username_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_password, direct_sql->tgt_password, tmp_password,
|
|
&conn->tgt_password_length, direct_sql->tgt_password_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_ssl_ca, direct_sql->tgt_ssl_ca, tmp_ssl_ca,
|
|
&conn->tgt_ssl_ca_length, direct_sql->tgt_ssl_ca_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_ssl_capath, direct_sql->tgt_ssl_capath, tmp_ssl_capath,
|
|
&conn->tgt_ssl_capath_length, direct_sql->tgt_ssl_capath_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_ssl_cert, direct_sql->tgt_ssl_cert, tmp_ssl_cert,
|
|
&conn->tgt_ssl_cert_length, direct_sql->tgt_ssl_cert_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_ssl_cipher, direct_sql->tgt_ssl_cipher, tmp_ssl_cipher,
|
|
&conn->tgt_ssl_cipher_length, direct_sql->tgt_ssl_cipher_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_ssl_key, direct_sql->tgt_ssl_key, tmp_ssl_key,
|
|
&conn->tgt_ssl_key_length, direct_sql->tgt_ssl_key_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_default_file, direct_sql->tgt_default_file, tmp_default_file,
|
|
&conn->tgt_default_file_length, direct_sql->tgt_default_file_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_default_group, direct_sql->tgt_default_group, tmp_default_group,
|
|
&conn->tgt_default_group_length, direct_sql->tgt_default_group_length);
|
|
spider_maybe_memcpy_string(
|
|
&conn->tgt_dsn, direct_sql->tgt_dsn, tmp_dsn,
|
|
&conn->tgt_dsn_length, direct_sql->tgt_dsn_length);
|
|
conn->tgt_ssl_vsc = direct_sql->tgt_ssl_vsc;
|
|
conn->dbton_id = direct_sql->dbton_id;
|
|
conn->conn_need_mon = need_mon;
|
|
conn->need_mon = need_mon;
|
|
if (!(conn->db_conn = spider_dbton[conn->dbton_id].create_db_conn(conn)))
|
|
{
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error_db_conn_create;
|
|
}
|
|
if ((*error_num = conn->db_conn->init()))
|
|
{
|
|
goto error_db_conn_init;
|
|
}
|
|
conn->join_trx = 0;
|
|
conn->thd = NULL;
|
|
conn->table_lock = 0;
|
|
conn->semi_trx_isolation = -2;
|
|
conn->semi_trx_isolation_chk = FALSE;
|
|
conn->semi_trx_chk = FALSE;
|
|
conn->conn_kind = SPIDER_CONN_KIND_MYSQL;
|
|
|
|
if (mysql_mutex_init(spd_key_mutex_mta_conn, &conn->mta_conn_mutex,
|
|
MY_MUTEX_INIT_FAST))
|
|
{
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error_mta_conn_mutex_init;
|
|
}
|
|
|
|
if (unlikely((*error_num = spider_conn_init(conn))))
|
|
{
|
|
goto error_conn_init;
|
|
}
|
|
|
|
if ((*error_num = spider_db_udf_direct_sql_connect(direct_sql, conn)))
|
|
goto error;
|
|
conn->ping_time = (time_t) time((time_t*) 0);
|
|
conn->connect_error_time = conn->ping_time;
|
|
pthread_mutex_lock(&spider_conn_id_mutex);
|
|
conn->conn_id = spider_conn_id;
|
|
++spider_conn_id;
|
|
pthread_mutex_unlock(&spider_conn_id_mutex);
|
|
|
|
pthread_mutex_lock(&spider_ipport_conn_mutex);
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search_using_hash_value(
|
|
&spider_ipport_conns, conn->conn_key_hash_value,
|
|
(uchar*)conn->conn_key, conn->conn_key_length)))
|
|
#else
|
|
if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search(
|
|
&spider_ipport_conns, (uchar*)conn->conn_key, conn->conn_key_length)))
|
|
#endif
|
|
{ /* exists, +1 */
|
|
pthread_mutex_unlock(&spider_ipport_conn_mutex);
|
|
pthread_mutex_lock(&ip_port_conn->mutex);
|
|
if (spider_param_max_connections())
|
|
{ /* enable conncetion pool */
|
|
if (ip_port_conn->ip_port_count >= spider_param_max_connections())
|
|
{ /* bigger than the max num of connections, free conn and return NULL */
|
|
pthread_mutex_unlock(&ip_port_conn->mutex);
|
|
goto error_too_many_ipport_count;
|
|
}
|
|
}
|
|
ip_port_conn->ip_port_count++;
|
|
pthread_mutex_unlock(&ip_port_conn->mutex);
|
|
}
|
|
else
|
|
{// do not exist
|
|
ip_port_conn = spider_create_ipport_conn(conn);
|
|
if (!ip_port_conn) {
|
|
/* failed, always do not effect 'create conn' */
|
|
pthread_mutex_unlock(&spider_ipport_conn_mutex);
|
|
DBUG_RETURN(conn);
|
|
}
|
|
if (my_hash_insert(&spider_ipport_conns, (uchar *)ip_port_conn)) {
|
|
/* insert failed, always do not effect 'create conn' */
|
|
pthread_mutex_unlock(&spider_ipport_conn_mutex);
|
|
DBUG_RETURN(conn);
|
|
}
|
|
pthread_mutex_unlock(&spider_ipport_conn_mutex);
|
|
}
|
|
conn->ip_port_conn = ip_port_conn;
|
|
|
|
DBUG_RETURN(conn);
|
|
|
|
error:
|
|
DBUG_ASSERT(!conn->mta_conn_mutex_file_pos.file_name);
|
|
error_too_many_ipport_count:
|
|
spider_conn_done(conn);
|
|
error_conn_init:
|
|
pthread_mutex_destroy(&conn->mta_conn_mutex);
|
|
error_mta_conn_mutex_init:
|
|
error_db_conn_init:
|
|
delete conn->db_conn;
|
|
error_db_conn_create:
|
|
spider_free(spider_current_trx, conn, MYF(0));
|
|
error_alloc_conn:
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
|
|
SPIDER_CONN *spider_udf_direct_sql_get_conn(
|
|
const SPIDER_DIRECT_SQL *direct_sql,
|
|
SPIDER_TRX *trx,
|
|
int *error_num
|
|
) {
|
|
SPIDER_CONN *conn = NULL;
|
|
DBUG_ENTER("spider_udf_direct_sql_get_conn");
|
|
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
if (
|
|
!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
|
|
&trx->trx_conn_hash, direct_sql->conn_key_hash_value,
|
|
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
|
|
)
|
|
#else
|
|
if (
|
|
!(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_conn_hash,
|
|
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
|
|
)
|
|
#endif
|
|
{
|
|
if (
|
|
(
|
|
(spider_param_conn_recycle_mode(trx->thd) & 1) ||
|
|
spider_param_conn_recycle_strict(trx->thd)
|
|
)
|
|
) {
|
|
pthread_mutex_lock(&spider_conn_mutex);
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
if (!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
|
|
&spider_open_connections, direct_sql->conn_key_hash_value,
|
|
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length)))
|
|
#else
|
|
if (!(conn = (SPIDER_CONN*) my_hash_search(&spider_open_connections,
|
|
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length)))
|
|
#endif
|
|
{
|
|
pthread_mutex_unlock(&spider_conn_mutex);
|
|
DBUG_PRINT("info",("spider create new conn"));
|
|
if(!(conn = spider_udf_direct_sql_create_conn(direct_sql,
|
|
error_num)))
|
|
goto error;
|
|
} else {
|
|
#ifdef HASH_UPDATE_WITH_HASH_VALUE
|
|
my_hash_delete_with_hash_value(&spider_open_connections,
|
|
conn->conn_key_hash_value, (uchar*) conn);
|
|
#else
|
|
my_hash_delete(&spider_open_connections, (uchar*) conn);
|
|
#endif
|
|
pthread_mutex_unlock(&spider_conn_mutex);
|
|
DBUG_PRINT("info",("spider get global conn"));
|
|
}
|
|
} else {
|
|
DBUG_PRINT("info",("spider create new conn"));
|
|
/* conn_recycle_strict = 0 and conn_recycle_mode = 0 or 2 */
|
|
if(!(conn = spider_udf_direct_sql_create_conn(direct_sql, error_num)))
|
|
goto error;
|
|
}
|
|
conn->thd = trx->thd;
|
|
conn->priority = direct_sql->priority;
|
|
|
|
uint old_elements = trx->trx_conn_hash.array.max_element;
|
|
#ifdef HASH_UPDATE_WITH_HASH_VALUE
|
|
if (my_hash_insert_with_hash_value(&trx->trx_conn_hash,
|
|
direct_sql->conn_key_hash_value, (uchar*) conn))
|
|
#else
|
|
if (my_hash_insert(&trx->trx_conn_hash, (uchar*) conn))
|
|
#endif
|
|
{
|
|
spider_free_conn(conn);
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error;
|
|
}
|
|
if (trx->trx_conn_hash.array.max_element > old_elements)
|
|
{
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
trx->trx_conn_hash,
|
|
(trx->trx_conn_hash.array.max_element - old_elements) *
|
|
trx->trx_conn_hash.array.size_of_element);
|
|
}
|
|
}
|
|
|
|
if (conn->queued_connect)
|
|
{
|
|
if ((*error_num = spider_db_udf_direct_sql_connect(direct_sql, conn)))
|
|
goto error;
|
|
conn->queued_connect = FALSE;
|
|
}
|
|
|
|
if (conn->queued_ping)
|
|
conn->queued_ping = FALSE;
|
|
|
|
DBUG_PRINT("info",("spider conn=%p", conn));
|
|
DBUG_PRINT("info",("spider conn->conn_kind=%u", conn->conn_kind));
|
|
DBUG_RETURN(conn);
|
|
|
|
error:
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
|
|
int spider_udf_direct_sql_get_server(
|
|
SPIDER_DIRECT_SQL *direct_sql
|
|
) {
|
|
MEM_ROOT mem_root;
|
|
int error_num, length;
|
|
FOREIGN_SERVER *server, server_buf;
|
|
DBUG_ENTER("spider_udf_direct_sql_get_server");
|
|
SPD_INIT_ALLOC_ROOT(&mem_root, 65, 0, MYF(MY_WME));
|
|
|
|
if (!(server
|
|
= get_server_by_name(&mem_root, direct_sql->server_name, &server_buf)))
|
|
{
|
|
error_num = ER_FOREIGN_SERVER_DOESNT_EXIST;
|
|
goto error_get_server;
|
|
}
|
|
|
|
if (!direct_sql->tgt_wrapper && server->scheme)
|
|
{
|
|
direct_sql->tgt_wrapper_length = strlen(server->scheme);
|
|
if (!(direct_sql->tgt_wrapper =
|
|
spider_create_string(server->scheme, direct_sql->tgt_wrapper_length)))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
DBUG_PRINT("info",("spider tgt_wrapper=%s", direct_sql->tgt_wrapper));
|
|
}
|
|
|
|
if (!direct_sql->tgt_host && server->host)
|
|
{
|
|
direct_sql->tgt_host_length = strlen(server->host);
|
|
if (!(direct_sql->tgt_host =
|
|
spider_create_string(server->host, direct_sql->tgt_host_length)))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
DBUG_PRINT("info",("spider tgt_host=%s", direct_sql->tgt_host));
|
|
}
|
|
|
|
if (direct_sql->tgt_port == -1)
|
|
{
|
|
direct_sql->tgt_port = server->port;
|
|
DBUG_PRINT("info",("spider tgt_port=%ld", direct_sql->tgt_port));
|
|
}
|
|
|
|
if (!direct_sql->tgt_socket && server->socket)
|
|
{
|
|
direct_sql->tgt_socket_length = strlen(server->socket);
|
|
if (!(direct_sql->tgt_socket =
|
|
spider_create_string(server->socket, direct_sql->tgt_socket_length)))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
DBUG_PRINT("info",("spider tgt_socket=%s", direct_sql->tgt_socket));
|
|
}
|
|
|
|
if (!direct_sql->tgt_default_db_name && server->db &&
|
|
(length = strlen(server->db)))
|
|
{
|
|
direct_sql->tgt_default_db_name_length = length;
|
|
if (!(direct_sql->tgt_default_db_name =
|
|
spider_create_string(server->db, length)))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
DBUG_PRINT("info",("spider tgt_default_db_name=%s",
|
|
direct_sql->tgt_default_db_name));
|
|
}
|
|
|
|
if (!direct_sql->tgt_username && server->username)
|
|
{
|
|
direct_sql->tgt_username_length = strlen(server->username);
|
|
if (!(direct_sql->tgt_username =
|
|
spider_create_string(server->username, direct_sql->tgt_username_length)))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
DBUG_PRINT("info",("spider tgt_username=%s", direct_sql->tgt_username));
|
|
}
|
|
|
|
if (!direct_sql->tgt_password && server->password)
|
|
{
|
|
direct_sql->tgt_password_length = strlen(server->password);
|
|
if (!(direct_sql->tgt_password =
|
|
spider_create_string(server->password, direct_sql->tgt_password_length)))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
DBUG_PRINT("info",("spider tgt_password=%s", direct_sql->tgt_password));
|
|
}
|
|
|
|
free_root(&mem_root, MYF(0));
|
|
DBUG_RETURN(0);
|
|
|
|
error_get_server:
|
|
my_error(error_num, MYF(0), direct_sql->server_name);
|
|
error:
|
|
free_root(&mem_root, MYF(0));
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
#define SPIDER_PARAM_LEN(name) name ## _length
|
|
#define SPIDER_PARAM_STR(title_name, param_name) \
|
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
|
{ \
|
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
|
if (!direct_sql->param_name) \
|
|
{ \
|
|
if ((direct_sql->param_name = spider_create_string(parse.start_value, \
|
|
value_length))) \
|
|
direct_sql->SPIDER_PARAM_LEN(param_name) = strlen(direct_sql->param_name); \
|
|
else { \
|
|
error_num= parse.fail(true); \
|
|
goto error; \
|
|
} \
|
|
DBUG_PRINT("info",("spider " title_name "=%s", direct_sql->param_name)); \
|
|
} \
|
|
break; \
|
|
}
|
|
#define SPIDER_PARAM_HINT_WITH_MAX(title_name, param_name, check_length, max_size, min_val, max_val) \
|
|
if (!strncasecmp(parse.start_title, title_name, check_length)) \
|
|
{ \
|
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
|
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
|
|
int hint_num = atoi(parse.start_title + check_length) - 1; \
|
|
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
|
|
DBUG_PRINT("info",("spider direct_sql->param_name=%p", \
|
|
direct_sql->param_name)); \
|
|
if (direct_sql->param_name) \
|
|
{ \
|
|
if (hint_num < 0 || hint_num >= max_size) \
|
|
{ \
|
|
error_num= parse.fail(true); \
|
|
goto error; \
|
|
} else if (direct_sql->param_name[hint_num] != -1) \
|
|
break; \
|
|
direct_sql->param_name[hint_num] = atoi(parse.start_value); \
|
|
if (direct_sql->param_name[hint_num] < min_val) \
|
|
direct_sql->param_name[hint_num] = min_val; \
|
|
else if (direct_sql->param_name[hint_num] > max_val) \
|
|
direct_sql->param_name[hint_num] = max_val; \
|
|
DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
|
|
direct_sql->param_name[hint_num])); \
|
|
} else { \
|
|
error_num= parse.fail(true); \
|
|
goto error; \
|
|
} \
|
|
break; \
|
|
}
|
|
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
|
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
|
{ \
|
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
|
if (direct_sql->param_name == -1) \
|
|
{ \
|
|
direct_sql->param_name = atoi(parse.start_value); \
|
|
if (direct_sql->param_name < min_val) \
|
|
direct_sql->param_name = min_val; \
|
|
else if (direct_sql->param_name > max_val) \
|
|
direct_sql->param_name = max_val; \
|
|
DBUG_PRINT("info",("spider " title_name "=%d", \
|
|
(int) direct_sql->param_name)); \
|
|
} \
|
|
break; \
|
|
}
|
|
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
|
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
|
{ \
|
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
|
if (direct_sql->param_name == -1) \
|
|
{ \
|
|
direct_sql->param_name = atoi(parse.start_value); \
|
|
if (direct_sql->param_name < min_val) \
|
|
direct_sql->param_name = min_val; \
|
|
DBUG_PRINT("info",("spider " title_name "=%d", direct_sql->param_name)); \
|
|
} \
|
|
break; \
|
|
}
|
|
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
|
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
|
{ \
|
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
|
if (direct_sql->param_name == -1) \
|
|
{ \
|
|
direct_sql->param_name = my_strtoll10(parse.start_value, (char**) NULL, \
|
|
&error_num); \
|
|
if (direct_sql->param_name < min_val) \
|
|
direct_sql->param_name = min_val; \
|
|
DBUG_PRINT("info",("spider " title_name "=%lld", direct_sql->param_name)); \
|
|
} \
|
|
break; \
|
|
}
|
|
|
|
static void spider_minus_1(SPIDER_DIRECT_SQL *direct_sql)
|
|
{
|
|
direct_sql->tgt_port = -1;
|
|
direct_sql->tgt_ssl_vsc = -1;
|
|
direct_sql->table_loop_mode = -1;
|
|
direct_sql->priority = -1;
|
|
direct_sql->connect_timeout = -1;
|
|
direct_sql->net_read_timeout = -1;
|
|
direct_sql->net_write_timeout = -1;
|
|
direct_sql->bulk_insert_rows = -1;
|
|
direct_sql->connection_channel = -1;
|
|
direct_sql->use_real_table = -1;
|
|
direct_sql->error_rw_mode = -1;
|
|
for (int i = 0; i < direct_sql->table_count; i++)
|
|
direct_sql->iop[i] = -1;
|
|
}
|
|
|
|
int spider_udf_parse_direct_sql_param(
|
|
SPIDER_TRX *trx,
|
|
SPIDER_DIRECT_SQL *direct_sql,
|
|
const char *param,
|
|
int param_length
|
|
) {
|
|
int error_num = 0;
|
|
char *param_string = NULL;
|
|
char *start_param;
|
|
int title_length, value_length;
|
|
SPIDER_PARAM_STRING_PARSE parse;
|
|
DBUG_ENTER("spider_udf_parse_direct_sql_param");
|
|
|
|
spider_minus_1(direct_sql);
|
|
if (param_length == 0)
|
|
goto set_default;
|
|
DBUG_PRINT("info",("spider create param_string string"));
|
|
if (!(param_string = spider_create_string(param, param_length)))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error_alloc_param_string;
|
|
}
|
|
DBUG_PRINT("info",("spider param_string=%s", param_string));
|
|
|
|
start_param = param_string;
|
|
parse.error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
|
while (*start_param != '\0')
|
|
{
|
|
if (parse.locate_param_def(start_param))
|
|
{
|
|
error_num= parse.fail(false);
|
|
goto error;
|
|
}
|
|
/* Null the end of the parameter value. */
|
|
*parse.end_value= '\0';
|
|
value_length= (int) (parse.end_value - parse.start_value);
|
|
|
|
switch (title_length = (int) (parse.end_title - parse.start_title))
|
|
{
|
|
case 0:
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 3:
|
|
SPIDER_PARAM_LONGLONG("bir", bulk_insert_rows, 0);
|
|
SPIDER_PARAM_INT_WITH_MAX("cch", connection_channel, 0, 63);
|
|
SPIDER_PARAM_INT("cto", connect_timeout, 0);
|
|
SPIDER_PARAM_STR("dff", tgt_default_file);
|
|
SPIDER_PARAM_STR("dfg", tgt_default_group);
|
|
SPIDER_PARAM_STR("dsn", tgt_dsn);
|
|
SPIDER_PARAM_LONGLONG("prt", priority, 0);
|
|
SPIDER_PARAM_INT("rto", net_read_timeout, 0);
|
|
SPIDER_PARAM_STR("sca", tgt_ssl_ca);
|
|
SPIDER_PARAM_STR("sch", tgt_ssl_cipher);
|
|
SPIDER_PARAM_STR("scp", tgt_ssl_capath);
|
|
SPIDER_PARAM_STR("scr", tgt_ssl_cert);
|
|
SPIDER_PARAM_STR("sky", tgt_ssl_key);
|
|
SPIDER_PARAM_STR("srv", server_name);
|
|
SPIDER_PARAM_INT_WITH_MAX("svc", tgt_ssl_vsc, 0, 1);
|
|
SPIDER_PARAM_INT_WITH_MAX("tlm", table_loop_mode, 0, 2);
|
|
SPIDER_PARAM_INT_WITH_MAX("urt", use_real_table, 0, 1);
|
|
SPIDER_PARAM_INT("wto", net_write_timeout, 0);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 4:
|
|
SPIDER_PARAM_INT_WITH_MAX("erwm", error_rw_mode, 0, 1);
|
|
SPIDER_PARAM_STR("host", tgt_host);
|
|
SPIDER_PARAM_INT_WITH_MAX("port", tgt_port, 0, 65535);
|
|
SPIDER_PARAM_STR("user", tgt_username);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 6:
|
|
SPIDER_PARAM_STR("server", server_name);
|
|
SPIDER_PARAM_STR("socket", tgt_socket);
|
|
SPIDER_PARAM_HINT_WITH_MAX("iop", iop, 3, direct_sql->table_count, 0, 2);
|
|
SPIDER_PARAM_STR("ssl_ca", tgt_ssl_ca);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 7:
|
|
SPIDER_PARAM_STR("wrapper", tgt_wrapper);
|
|
SPIDER_PARAM_STR("ssl_key", tgt_ssl_key);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 8:
|
|
SPIDER_PARAM_STR("database", tgt_default_db_name);
|
|
SPIDER_PARAM_STR("password", tgt_password);
|
|
SPIDER_PARAM_LONGLONG("priority", priority, 0);
|
|
SPIDER_PARAM_STR("ssl_cert", tgt_ssl_cert);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 10:
|
|
SPIDER_PARAM_STR("ssl_cipher", tgt_ssl_cipher);
|
|
SPIDER_PARAM_STR("ssl_capath", tgt_ssl_capath);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 11:
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 12:
|
|
SPIDER_PARAM_STR("default_file", tgt_default_file);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 13:
|
|
SPIDER_PARAM_STR("default_group", tgt_default_group);
|
|
SPIDER_PARAM_INT_WITH_MAX("error_rw_mode", error_rw_mode, 0, 1);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 14:
|
|
SPIDER_PARAM_INT_WITH_MAX("use_real_table", use_real_table, 0, 1);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 15:
|
|
SPIDER_PARAM_INT_WITH_MAX("table_loop_mode", table_loop_mode, 0, 2);
|
|
SPIDER_PARAM_INT("connect_timeout", connect_timeout, 0);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 16:
|
|
SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1);
|
|
SPIDER_PARAM_INT("net_read_timeout", net_read_timeout, 0);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 17:
|
|
SPIDER_PARAM_INT("net_write_timeout", net_write_timeout, 0);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 18:
|
|
SPIDER_PARAM_INT_WITH_MAX(
|
|
"connection_channel", connection_channel, 0, 63);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
case 22:
|
|
SPIDER_PARAM_INT_WITH_MAX("ssl_verify_server_cert", tgt_ssl_vsc, 0, 1);
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
default:
|
|
error_num= parse.fail(true);
|
|
goto error;
|
|
}
|
|
/* Restore delim */
|
|
*parse.end_value= parse.delim_value;
|
|
}
|
|
|
|
set_default:
|
|
error_num = spider_udf_set_direct_sql_param_default(trx, direct_sql);
|
|
error:
|
|
if (param_string)
|
|
spider_free(spider_current_trx, param_string, MYF(0));
|
|
error_alloc_param_string:
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_udf_set_direct_sql_param_default(
|
|
SPIDER_TRX *trx,
|
|
SPIDER_DIRECT_SQL *direct_sql
|
|
) {
|
|
bool check_socket;
|
|
bool check_database;
|
|
bool socket_has_default_value;
|
|
bool database_has_default_value;
|
|
int error_num, roop_count;
|
|
DBUG_ENTER("spider_udf_set_direct_sql_param_default");
|
|
if (direct_sql->server_name)
|
|
{
|
|
if ((error_num = spider_udf_direct_sql_get_server(direct_sql)))
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
if (
|
|
!direct_sql->tgt_socket &&
|
|
(!direct_sql->tgt_host || !strcmp(direct_sql->tgt_host, my_localhost))
|
|
) {
|
|
check_socket = TRUE;
|
|
} else {
|
|
check_socket = FALSE;
|
|
}
|
|
if (!direct_sql->tgt_default_db_name)
|
|
{
|
|
check_database = TRUE;
|
|
} else {
|
|
check_database = FALSE;
|
|
}
|
|
if (check_socket || check_database)
|
|
{
|
|
socket_has_default_value = check_socket;
|
|
database_has_default_value = check_database;
|
|
if (direct_sql->tgt_wrapper)
|
|
{
|
|
for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; roop_count++)
|
|
{
|
|
DBUG_PRINT("info",("spider direct_sql->tgt_wrapper=%s",
|
|
direct_sql->tgt_wrapper));
|
|
DBUG_PRINT("info",("spider spider_dbton[%d].wrapper=%s", roop_count,
|
|
spider_dbton[roop_count].wrapper ?
|
|
spider_dbton[roop_count].wrapper : "NULL"));
|
|
if (
|
|
spider_dbton[roop_count].wrapper &&
|
|
!strcmp(direct_sql->tgt_wrapper,
|
|
spider_dbton[roop_count].wrapper)
|
|
) {
|
|
if (spider_dbton[roop_count].db_access_type ==
|
|
SPIDER_DB_ACCESS_TYPE_SQL)
|
|
{
|
|
if (check_socket)
|
|
{
|
|
socket_has_default_value = spider_dbton[roop_count].
|
|
db_util->socket_has_default_value();
|
|
}
|
|
if (check_database)
|
|
{
|
|
database_has_default_value = spider_dbton[roop_count].
|
|
db_util->database_has_default_value();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
socket_has_default_value = FALSE;
|
|
database_has_default_value = FALSE;
|
|
}
|
|
|
|
if (database_has_default_value)
|
|
{
|
|
DBUG_PRINT("info",("spider create default tgt_default_db_name"));
|
|
direct_sql->tgt_default_db_name_length = SPIDER_THD_db_length(trx->thd);
|
|
if (
|
|
!(direct_sql->tgt_default_db_name = spider_create_string(
|
|
SPIDER_THD_db_str(trx->thd),
|
|
direct_sql->tgt_default_db_name_length))
|
|
) {
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
}
|
|
|
|
if (!direct_sql->tgt_wrapper)
|
|
{
|
|
DBUG_PRINT("info",("spider create default tgt_wrapper"));
|
|
direct_sql->tgt_wrapper_length = SPIDER_DB_WRAPPER_LEN;
|
|
if (
|
|
!(direct_sql->tgt_wrapper = spider_create_string(
|
|
SPIDER_DB_WRAPPER_STR,
|
|
direct_sql->tgt_wrapper_length))
|
|
) {
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
}
|
|
|
|
if (!direct_sql->tgt_host)
|
|
{
|
|
DBUG_PRINT("info",("spider create default tgt_host"));
|
|
direct_sql->tgt_host_length = strlen(my_localhost);
|
|
if (
|
|
!(direct_sql->tgt_host = spider_create_string(
|
|
my_localhost,
|
|
direct_sql->tgt_host_length))
|
|
) {
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
}
|
|
|
|
if (
|
|
!direct_sql->tgt_default_file &&
|
|
direct_sql->tgt_default_group &&
|
|
(*spd_defaults_file || *spd_defaults_extra_file)
|
|
) {
|
|
DBUG_PRINT("info",("spider create default tgt_default_file"));
|
|
if (*spd_defaults_extra_file)
|
|
{
|
|
direct_sql->tgt_default_file_length = strlen(*spd_defaults_extra_file);
|
|
if (
|
|
!(direct_sql->tgt_default_file = spider_create_string(
|
|
*spd_defaults_extra_file,
|
|
direct_sql->tgt_default_file_length))
|
|
) {
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
} else {
|
|
direct_sql->tgt_default_file_length = strlen(*spd_defaults_file);
|
|
if (
|
|
!(direct_sql->tgt_default_file = spider_create_string(
|
|
*spd_defaults_file,
|
|
direct_sql->tgt_default_file_length))
|
|
) {
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (direct_sql->tgt_port == -1)
|
|
{
|
|
direct_sql->tgt_port = MYSQL_PORT;
|
|
}
|
|
else if (direct_sql->tgt_port < 0)
|
|
direct_sql->tgt_port = 0;
|
|
else if (direct_sql->tgt_port > 65535)
|
|
direct_sql->tgt_port = 65535;
|
|
|
|
if (direct_sql->tgt_ssl_vsc == -1)
|
|
direct_sql->tgt_ssl_vsc = 0;
|
|
|
|
if (socket_has_default_value)
|
|
{
|
|
DBUG_PRINT("info",("spider create default tgt_socket"));
|
|
direct_sql->tgt_socket_length = strlen((char *) MYSQL_UNIX_ADDR);
|
|
if (
|
|
!(direct_sql->tgt_socket = spider_create_string(
|
|
(char *) MYSQL_UNIX_ADDR,
|
|
direct_sql->tgt_socket_length))
|
|
) {
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
}
|
|
|
|
if (direct_sql->priority == -1)
|
|
direct_sql->priority = 1000000;
|
|
if (direct_sql->connection_channel == -1)
|
|
direct_sql->connection_channel = 0;
|
|
if (direct_sql->error_rw_mode == -1)
|
|
direct_sql->error_rw_mode = 0;
|
|
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
|
{
|
|
if (direct_sql->iop[roop_count] == -1)
|
|
direct_sql->iop[roop_count] = 0;
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_udf_free_direct_sql_alloc(
|
|
SPIDER_DIRECT_SQL *direct_sql,
|
|
my_bool bg
|
|
) {
|
|
SPIDER_BG_DIRECT_SQL *bg_direct_sql;
|
|
DBUG_ENTER("spider_udf_free_direct_sql_alloc");
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
if (bg)
|
|
{
|
|
pthread_mutex_lock(direct_sql->bg_mutex);
|
|
bg_direct_sql = (SPIDER_BG_DIRECT_SQL *) direct_sql->parent;
|
|
if (bg_direct_sql->direct_sql == direct_sql)
|
|
bg_direct_sql->direct_sql = direct_sql->next;
|
|
if (direct_sql->next)
|
|
direct_sql->next->prev = direct_sql->prev;
|
|
if (direct_sql->prev)
|
|
direct_sql->prev->next = direct_sql->next;
|
|
pthread_cond_signal(direct_sql->bg_cond);
|
|
pthread_mutex_unlock(direct_sql->bg_mutex);
|
|
}
|
|
#endif
|
|
if (direct_sql->real_table_used && direct_sql->open_tables_thd)
|
|
{
|
|
spider_sys_close_table(direct_sql->open_tables_thd,
|
|
&direct_sql->open_tables_backup);
|
|
}
|
|
if (direct_sql->server_name)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->server_name, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_default_db_name)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_default_db_name, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_host)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_host, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_username)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_username, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_password)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_password, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_socket)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_socket, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_wrapper)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_wrapper, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_ssl_ca)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_ssl_ca, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_ssl_capath)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_ssl_capath, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_ssl_cert)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_ssl_cert, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_ssl_cipher)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_ssl_cipher, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_ssl_key)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_ssl_key, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_default_file)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_default_file, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_default_group)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_default_group, MYF(0));
|
|
}
|
|
if (direct_sql->tgt_dsn)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->tgt_dsn, MYF(0));
|
|
}
|
|
if (direct_sql->conn_key)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->conn_key, MYF(0));
|
|
}
|
|
if (direct_sql->db_names)
|
|
{
|
|
spider_free(spider_current_trx, direct_sql->db_names, MYF(0));
|
|
}
|
|
spider_free(spider_current_trx, direct_sql, MYF(0));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
long long spider_direct_sql_body(
|
|
UDF_INIT *initid,
|
|
UDF_ARGS *args,
|
|
char *is_null,
|
|
char *error,
|
|
my_bool bg
|
|
) {
|
|
int error_num, roop_count;
|
|
SPIDER_DIRECT_SQL *direct_sql = NULL, *tmp_direct_sql;
|
|
THD *thd = current_thd;
|
|
SPIDER_TRX *trx;
|
|
SPIDER_CONN *conn;
|
|
char *sql;
|
|
TABLE_LIST table_list;
|
|
SPIDER_BG_DIRECT_SQL *bg_direct_sql;
|
|
TABLE_LIST *real_table_list_last = NULL;
|
|
uint use_real_table = 0;
|
|
DBUG_ENTER("spider_direct_sql_body");
|
|
SPIDER_BACKUP_DASTATUS;
|
|
if (!(direct_sql = (SPIDER_DIRECT_SQL *)
|
|
spider_bulk_malloc(spider_current_trx, SPD_MID_DIRECT_SQL_BODY_1, MYF(MY_WME | MY_ZEROFILL),
|
|
&direct_sql, (uint) (sizeof(SPIDER_DIRECT_SQL)),
|
|
&sql, (uint) (sizeof(char) * args->lengths[0]),
|
|
NullS))
|
|
) {
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
if (bg)
|
|
{
|
|
bg_direct_sql = (SPIDER_BG_DIRECT_SQL *) initid->ptr;
|
|
pthread_mutex_lock(&bg_direct_sql->bg_mutex);
|
|
tmp_direct_sql = (SPIDER_DIRECT_SQL *) bg_direct_sql->direct_sql;
|
|
bg_direct_sql->direct_sql = direct_sql;
|
|
if (tmp_direct_sql)
|
|
{
|
|
tmp_direct_sql->prev = direct_sql;
|
|
direct_sql->next = tmp_direct_sql;
|
|
}
|
|
pthread_mutex_unlock(&bg_direct_sql->bg_mutex);
|
|
direct_sql->bg_mutex = &bg_direct_sql->bg_mutex;
|
|
direct_sql->bg_cond = &bg_direct_sql->bg_cond;
|
|
direct_sql->parent = bg_direct_sql;
|
|
bg_direct_sql->called_cnt++;
|
|
}
|
|
#endif
|
|
if (!(trx = spider_get_trx(thd, TRUE, &error_num)))
|
|
{
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
direct_sql->trx = trx;
|
|
|
|
if (args->args[1])
|
|
{
|
|
if ((error_num = spider_udf_direct_sql_create_table_list(
|
|
direct_sql,
|
|
args->args[1],
|
|
args->lengths[1]
|
|
))) {
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
} else {
|
|
if ((error_num = spider_udf_direct_sql_create_table_list(
|
|
direct_sql,
|
|
(char *) "",
|
|
0
|
|
))) {
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
}
|
|
if (args->args[2])
|
|
{
|
|
if ((error_num = spider_udf_parse_direct_sql_param(
|
|
trx,
|
|
direct_sql,
|
|
args->args[2],
|
|
args->lengths[2]
|
|
))) {
|
|
goto error;
|
|
}
|
|
} else {
|
|
if ((error_num = spider_udf_parse_direct_sql_param(
|
|
trx,
|
|
direct_sql,
|
|
"",
|
|
0
|
|
))) {
|
|
goto error;
|
|
}
|
|
}
|
|
trx->updated_in_this_trx = TRUE;
|
|
DBUG_PRINT("info",("spider trx->updated_in_this_trx=TRUE"));
|
|
use_real_table = spider_param_udf_ds_use_real_table(thd,
|
|
direct_sql->use_real_table);
|
|
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
|
{
|
|
#ifdef SPIDER_NEED_INIT_ONE_TABLE_FOR_FIND_TEMPORARY_TABLE
|
|
#ifdef SPIDER_use_LEX_CSTRING_for_database_tablename_alias
|
|
LEX_CSTRING db_name =
|
|
{
|
|
direct_sql->db_names[roop_count],
|
|
strlen(direct_sql->db_names[roop_count])
|
|
};
|
|
LEX_CSTRING tbl_name =
|
|
{
|
|
direct_sql->table_names[roop_count],
|
|
strlen(direct_sql->table_names[roop_count])
|
|
};
|
|
table_list.init_one_table(&db_name, &tbl_name, 0, TL_WRITE);
|
|
#else
|
|
table_list.init_one_table(direct_sql->db_names[roop_count],
|
|
strlen(direct_sql->db_names[roop_count]),
|
|
direct_sql->table_names[roop_count],
|
|
strlen(direct_sql->table_names[roop_count]),
|
|
direct_sql->table_names[roop_count], TL_WRITE);
|
|
#endif
|
|
#else
|
|
SPIDER_TABLE_LIST_db_str(&table_list) = direct_sql->db_names[roop_count];
|
|
SPIDER_TABLE_LIST_table_name_str(&table_list) =
|
|
direct_sql->table_names[roop_count];
|
|
#endif
|
|
if (!(direct_sql->tables[roop_count] =
|
|
spider_find_temporary_table(thd, &table_list)))
|
|
{
|
|
if (!use_real_table)
|
|
{
|
|
error_num = ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_NUM;
|
|
my_printf_error(ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_NUM,
|
|
ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_STR,
|
|
MYF(0), SPIDER_TABLE_LIST_db_str(&table_list),
|
|
SPIDER_TABLE_LIST_table_name_str(&table_list));
|
|
goto error;
|
|
}
|
|
TABLE_LIST *tables = &direct_sql->table_list[roop_count];
|
|
MDL_REQUEST_INIT(&tables->mdl_request, MDL_key::TABLE,
|
|
SPIDER_TABLE_LIST_db_str(&table_list),
|
|
SPIDER_TABLE_LIST_table_name_str(&table_list),
|
|
MDL_SHARED_WRITE, MDL_TRANSACTION);
|
|
if (!direct_sql->table_list_first)
|
|
{
|
|
direct_sql->table_list_first = tables;
|
|
} else {
|
|
real_table_list_last->next_global = tables;
|
|
}
|
|
real_table_list_last = tables;
|
|
spider_set_bit(direct_sql->real_table_bitmap, roop_count);
|
|
direct_sql->real_table_used = TRUE;
|
|
}
|
|
}
|
|
if ((error_num = spider_udf_direct_sql_create_conn_key(direct_sql)))
|
|
{
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
if (!(conn = spider_udf_direct_sql_get_conn(direct_sql, trx, &error_num)))
|
|
{
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
conn->error_mode = 0;
|
|
direct_sql->conn = conn;
|
|
if ((error_num = spider_db_udf_check_and_set_set_names(trx)))
|
|
{
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
if (args->args[0])
|
|
{
|
|
direct_sql->sql_length = args->lengths[0];
|
|
memcpy(sql, args->args[0], direct_sql->sql_length);
|
|
} else
|
|
direct_sql->sql_length = 0;
|
|
direct_sql->sql = sql;
|
|
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
if (bg)
|
|
{
|
|
if ((error_num = spider_udf_bg_direct_sql(direct_sql)))
|
|
{
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
} else {
|
|
#endif
|
|
if (conn->bg_init)
|
|
pthread_mutex_lock(&conn->bg_conn_mutex);
|
|
if ((error_num = spider_db_udf_direct_sql(direct_sql)))
|
|
{
|
|
if (conn->bg_init)
|
|
pthread_mutex_unlock(&conn->bg_conn_mutex);
|
|
if (direct_sql->modified_non_trans_table)
|
|
thd->transaction->stmt.modified_non_trans_table = TRUE;
|
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
|
goto error;
|
|
}
|
|
if (conn->bg_init)
|
|
pthread_mutex_unlock(&conn->bg_conn_mutex);
|
|
if (direct_sql->modified_non_trans_table)
|
|
thd->transaction->stmt.modified_non_trans_table = TRUE;
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
}
|
|
if (!bg)
|
|
{
|
|
#endif
|
|
spider_udf_free_direct_sql_alloc(direct_sql, FALSE);
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
}
|
|
#endif
|
|
DBUG_RETURN(1);
|
|
|
|
error:
|
|
if (direct_sql)
|
|
{
|
|
if (
|
|
direct_sql->error_rw_mode &&
|
|
spider_db_conn_is_network_error(error_num)
|
|
) {
|
|
SPIDER_RESTORE_DASTATUS;
|
|
spider_udf_free_direct_sql_alloc(direct_sql, bg);
|
|
DBUG_RETURN(1);
|
|
}
|
|
spider_udf_free_direct_sql_alloc(direct_sql, bg);
|
|
}
|
|
*error = 1;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
my_bool spider_direct_sql_init_body(
|
|
UDF_INIT *initid,
|
|
UDF_ARGS *args,
|
|
char *message,
|
|
my_bool bg
|
|
) {
|
|
SPIDER_BG_DIRECT_SQL *bg_direct_sql;
|
|
DBUG_ENTER("spider_direct_sql_init_body");
|
|
if (!spider_hton_ptr)
|
|
{
|
|
strcpy(message, "Plugin 'SPIDER' is not loaded");
|
|
goto error;
|
|
}
|
|
if (args->arg_count != 3)
|
|
{
|
|
strcpy(message, "spider_(bg)_direct_sql() requires 3 arguments");
|
|
goto error;
|
|
}
|
|
if (
|
|
args->arg_type[0] != STRING_RESULT ||
|
|
args->arg_type[1] != STRING_RESULT ||
|
|
args->arg_type[2] != STRING_RESULT
|
|
) {
|
|
strcpy(message, "spider_(bg)_direct_sql() requires string arguments");
|
|
goto error;
|
|
}
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
if (bg)
|
|
{
|
|
if (!(bg_direct_sql = (SPIDER_BG_DIRECT_SQL *)
|
|
spider_malloc(spider_current_trx, SPD_MID_DIRECT_SQL_INIT_BODY_1, sizeof(SPIDER_BG_DIRECT_SQL),
|
|
MYF(MY_WME | MY_ZEROFILL)))
|
|
) {
|
|
strcpy(message, "spider_bg_direct_sql() out of memory");
|
|
goto error;
|
|
}
|
|
if (mysql_mutex_init(spd_key_mutex_bg_direct_sql,
|
|
&bg_direct_sql->bg_mutex, MY_MUTEX_INIT_FAST))
|
|
{
|
|
strcpy(message, "spider_bg_direct_sql() out of memory");
|
|
goto error_mutex_init;
|
|
}
|
|
if (mysql_cond_init(spd_key_cond_bg_direct_sql,
|
|
&bg_direct_sql->bg_cond, NULL))
|
|
{
|
|
strcpy(message, "spider_bg_direct_sql() out of memory");
|
|
goto error_cond_init;
|
|
}
|
|
initid->ptr = (char *) bg_direct_sql;
|
|
}
|
|
#endif
|
|
DBUG_RETURN(FALSE);
|
|
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
error_cond_init:
|
|
pthread_mutex_destroy(&bg_direct_sql->bg_mutex);
|
|
error_mutex_init:
|
|
spider_free(spider_current_trx, bg_direct_sql, MYF(0));
|
|
#endif
|
|
error:
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
|
|
void spider_direct_sql_deinit_body(
|
|
UDF_INIT *initid
|
|
) {
|
|
SPIDER_BG_DIRECT_SQL *bg_direct_sql = (SPIDER_BG_DIRECT_SQL *) initid->ptr;
|
|
DBUG_ENTER("spider_direct_sql_deinit_body");
|
|
if (bg_direct_sql)
|
|
{
|
|
pthread_mutex_lock(&bg_direct_sql->bg_mutex);
|
|
while (bg_direct_sql->direct_sql)
|
|
pthread_cond_wait(&bg_direct_sql->bg_cond, &bg_direct_sql->bg_mutex);
|
|
pthread_mutex_unlock(&bg_direct_sql->bg_mutex);
|
|
if (bg_direct_sql->modified_non_trans_table)
|
|
{
|
|
THD *thd = current_thd;
|
|
thd->transaction->stmt.modified_non_trans_table = TRUE;
|
|
}
|
|
pthread_cond_destroy(&bg_direct_sql->bg_cond);
|
|
pthread_mutex_destroy(&bg_direct_sql->bg_mutex);
|
|
spider_free(spider_current_trx, bg_direct_sql, MYF(0));
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
void spider_direct_sql_bg_start(
|
|
UDF_INIT *initid
|
|
) {
|
|
SPIDER_BG_DIRECT_SQL *bg_direct_sql = (SPIDER_BG_DIRECT_SQL *) initid->ptr;
|
|
DBUG_ENTER("spider_direct_sql_bg_start");
|
|
bg_direct_sql->called_cnt = 0;
|
|
bg_direct_sql->bg_error = 0;
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
long long spider_direct_sql_bg_end(
|
|
UDF_INIT *initid
|
|
) {
|
|
THD *thd = current_thd;
|
|
SPIDER_BG_DIRECT_SQL *bg_direct_sql = (SPIDER_BG_DIRECT_SQL *) initid->ptr;
|
|
DBUG_ENTER("spider_direct_sql_bg_end");
|
|
pthread_mutex_lock(&bg_direct_sql->bg_mutex);
|
|
while (bg_direct_sql->direct_sql)
|
|
pthread_cond_wait(&bg_direct_sql->bg_cond, &bg_direct_sql->bg_mutex);
|
|
pthread_mutex_unlock(&bg_direct_sql->bg_mutex);
|
|
if (bg_direct_sql->modified_non_trans_table)
|
|
thd->transaction->stmt.modified_non_trans_table = TRUE;
|
|
if (bg_direct_sql->bg_error)
|
|
{
|
|
my_message(bg_direct_sql->bg_error, bg_direct_sql->bg_error_msg, MYF(0));
|
|
DBUG_RETURN(0);
|
|
}
|
|
DBUG_RETURN(bg_direct_sql->called_cnt);
|
|
}
|
|
|
|
int spider_udf_bg_direct_sql(
|
|
SPIDER_DIRECT_SQL *direct_sql
|
|
) {
|
|
int error_num;
|
|
SPIDER_CONN *conn = direct_sql->conn;
|
|
DBUG_ENTER("spider_udf_bg_direct_sql");
|
|
if ((error_num = spider_create_conn_thread(conn)))
|
|
DBUG_RETURN(error_num);
|
|
if (!pthread_mutex_trylock(&conn->bg_conn_mutex))
|
|
{
|
|
DBUG_PRINT("info",("spider get bg_conn_mutex"));
|
|
conn->bg_target = direct_sql;
|
|
conn->bg_direct_sql = TRUE;
|
|
conn->bg_caller_sync_wait = TRUE;
|
|
pthread_mutex_lock(&conn->bg_conn_sync_mutex);
|
|
pthread_cond_signal(&conn->bg_conn_cond);
|
|
pthread_mutex_unlock(&conn->bg_conn_mutex);
|
|
pthread_cond_wait(&conn->bg_conn_sync_cond, &conn->bg_conn_sync_mutex);
|
|
pthread_mutex_unlock(&conn->bg_conn_sync_mutex);
|
|
conn->bg_caller_sync_wait = FALSE;
|
|
} else {
|
|
DBUG_PRINT("info",("spider get put job stack"));
|
|
bool bg_get_job_stack = FALSE;
|
|
pthread_mutex_lock(&conn->bg_job_stack_mutex);
|
|
uint old_elements = conn->bg_job_stack.max_element;
|
|
if (insert_dynamic(&conn->bg_job_stack, (uchar *) &direct_sql))
|
|
{
|
|
pthread_mutex_unlock(&conn->bg_job_stack_mutex);
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
if (conn->bg_job_stack.max_element > old_elements)
|
|
{
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
conn->bg_job_stack,
|
|
(conn->bg_job_stack.max_element - old_elements) *
|
|
conn->bg_job_stack.size_of_element);
|
|
}
|
|
if (!conn->bg_get_job_stack_off)
|
|
bg_get_job_stack = TRUE;
|
|
pthread_mutex_unlock(&conn->bg_job_stack_mutex);
|
|
if (bg_get_job_stack)
|
|
{
|
|
DBUG_PRINT("info",("spider get bg_conn_mutex"));
|
|
pthread_mutex_lock(&conn->bg_conn_mutex);
|
|
conn->bg_target = NULL;
|
|
conn->bg_get_job_stack = TRUE;
|
|
conn->bg_direct_sql = TRUE;
|
|
conn->bg_caller_sync_wait = TRUE;
|
|
pthread_mutex_lock(&conn->bg_conn_sync_mutex);
|
|
pthread_cond_signal(&conn->bg_conn_cond);
|
|
pthread_mutex_unlock(&conn->bg_conn_mutex);
|
|
pthread_cond_wait(&conn->bg_conn_sync_cond, &conn->bg_conn_sync_mutex);
|
|
pthread_mutex_unlock(&conn->bg_conn_sync_mutex);
|
|
conn->bg_caller_sync_wait = FALSE;
|
|
}
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|