summaryrefslogtreecommitdiffstats
path: root/storage/spider/spd_db_handlersocket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/spider/spd_db_handlersocket.cc')
-rw-r--r--storage/spider/spd_db_handlersocket.cc6336
1 files changed, 6336 insertions, 0 deletions
diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc
new file mode 100644
index 00000000..b3e73b85
--- /dev/null
+++ b/storage/spider/spd_db_handlersocket.cc
@@ -0,0 +1,6336 @@
+/* Copyright (C) 2012-2018 Kentoku Shiba
+
+ 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"
+#if MYSQL_VERSION_ID < 50500
+#include "mysql_priv.h"
+#include <mysql/plugin.h>
+#else
+#include "sql_priv.h"
+#include "probes_mysql.h"
+#include "sql_analyse.h"
+#endif
+
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+#include "spd_err.h"
+#include "spd_param.h"
+#include "spd_db_include.h"
+#include "spd_include.h"
+#include "spd_db_handlersocket.h"
+#include "ha_spider.h"
+#include "spd_db_conn.h"
+#include "spd_trx.h"
+#include "spd_conn.h"
+#include "spd_malloc.h"
+
+extern handlerton *spider_hton_ptr;
+extern HASH spider_open_connections;
+extern HASH spider_ipport_conns;
+extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
+extern const char spider_dig_upper[];
+
+#define SPIDER_SQL_INTERVAL_STR " + interval "
+#define SPIDER_SQL_INTERVAL_LEN (sizeof(SPIDER_SQL_INTERVAL_STR) - 1)
+#define SPIDER_SQL_NEGINTERVAL_STR " - interval "
+#define SPIDER_SQL_NEGINTERVAL_LEN (sizeof(SPIDER_SQL_NEGINTERVAL_STR) - 1)
+
+#define SPIDER_SQL_NAME_QUOTE_STR ""
+#define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1)
+static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
+
+#define SPIDER_SQL_TYPE_FULL_HS (SPIDER_SQL_TYPE_SELECT_HS | \
+ SPIDER_SQL_TYPE_INSERT_HS | SPIDER_SQL_TYPE_UPDATE_HS | \
+ SPIDER_SQL_TYPE_DELETE_HS | SPIDER_SQL_TYPE_OTHER_HS)
+
+static uchar SPIDER_SQL_LINESTRING_HEAD_STR[] =
+ {0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00};
+#define SPIDER_SQL_LINESTRING_HEAD_LEN sizeof(SPIDER_SQL_LINESTRING_HEAD_STR)
+
+static const char *spider_db_timefunc_interval_str[] =
+{
+ " year", " quarter", " month", " week", " day",
+ " hour", " minute", " second", " microsecond",
+ " year_month", " day_hour", " day_minute",
+ " day_second", " hour_minute", " hour_second",
+ " minute_second", " day_microsecond", " hour_microsecond",
+ " minute_microsecond", " second_microsecond"
+};
+
+static SPIDER_HS_STRING_REF spider_null_string_ref = SPIDER_HS_STRING_REF();
+
+int spider_handlersocket_init()
+{
+ DBUG_ENTER("spider_handlersocket_init");
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_deinit()
+{
+ DBUG_ENTER("spider_handlersocket_deinit");
+ DBUG_RETURN(0);
+}
+
+spider_db_share *spider_handlersocket_create_share(
+ SPIDER_SHARE *share
+) {
+ DBUG_ENTER("spider_handlersocket_create_share");
+ DBUG_RETURN(new spider_handlersocket_share(share));
+}
+
+spider_db_handler *spider_handlersocket_create_handler(
+ ha_spider *spider,
+ spider_db_share *db_share
+) {
+ DBUG_ENTER("spider_handlersocket_create_handler");
+ DBUG_RETURN(new spider_handlersocket_handler(spider,
+ (spider_handlersocket_share *) db_share));
+}
+
+SPIDER_DB_CONN *spider_handlersocket_create_conn(
+ SPIDER_CONN *conn
+) {
+ DBUG_ENTER("spider_handlersocket_create_conn");
+ DBUG_RETURN(new spider_db_handlersocket(conn));
+}
+
+bool spider_handlersocket_support_direct_join(
+) {
+ DBUG_ENTER("spider_handlersocket_support_direct_join");
+ DBUG_RETURN(FALSE);
+}
+
+spider_db_handlersocket_util spider_db_handlersocket_utility;
+
+SPIDER_DBTON spider_dbton_handlersocket = {
+ 0,
+ SPIDER_DB_WRAPPER_MYSQL,
+ SPIDER_DB_ACCESS_TYPE_NOSQL,
+ spider_handlersocket_init,
+ spider_handlersocket_deinit,
+ spider_handlersocket_create_share,
+ spider_handlersocket_create_handler,
+ NULL,
+ spider_handlersocket_create_conn,
+ spider_handlersocket_support_direct_join,
+ &spider_db_handlersocket_utility,
+ "For communicating using the handlersocket protocol",
+ "0.1.0",
+ SPIDER_MATURITY_BETA
+};
+
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_hs_string_ref_buffer::init()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+void spider_db_hs_string_ref_buffer::clear()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::clear");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_conds.clear();
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_hs_string_ref_buffer::push_back(
+ SPIDER_HS_STRING_REF &cond
+) {
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::push_back");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_conds.push_back(cond);
+ DBUG_RETURN(0);
+}
+
+SPIDER_HS_STRING_REF *spider_db_hs_string_ref_buffer::ptr()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::ptr");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(&hs_conds[0]);
+}
+
+uint spider_db_hs_string_ref_buffer::size()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::size");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((uint) hs_conds.size());
+}
+#else
+spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer() : hs_da_init(FALSE)
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (hs_da_init)
+ {
+ spider_free_mem_calc(spider_current_trx,
+ hs_conds_id, hs_conds.max_element * hs_conds.size_of_element);
+ delete_dynamic(&hs_conds);
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_hs_string_ref_buffer::init()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!hs_da_init)
+ {
+ SPD_INIT_DYNAMIC_ARRAY2(&hs_conds, sizeof(SPIDER_HS_STRING_REF),
+ NULL, 16, 16, MYF(MY_WME));
+ spider_alloc_calc_mem_init(hs_conds, 159);
+ spider_alloc_calc_mem(spider_current_trx,
+ hs_conds, hs_conds.max_element * hs_conds.size_of_element);
+ hs_da_init = TRUE;
+ }
+ DBUG_RETURN(0);
+}
+
+void spider_db_hs_string_ref_buffer::clear()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::clear");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_conds.elements = 0;
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_hs_string_ref_buffer::push_back(
+ SPIDER_HS_STRING_REF &cond
+) {
+ uint old_elements = hs_conds.max_element;
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::push_back");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (insert_dynamic(&hs_conds, (uchar *) &cond))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (hs_conds.max_element > old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ hs_conds,
+ (hs_conds.max_element - old_elements) * hs_conds.size_of_element);
+ }
+ DBUG_RETURN(0);
+}
+
+SPIDER_HS_STRING_REF *spider_db_hs_string_ref_buffer::ptr()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::ptr");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_HS_STRING_REF *) hs_conds.buffer);
+}
+
+uint spider_db_hs_string_ref_buffer::size()
+{
+ DBUG_ENTER("spider_db_hs_string_ref_buffer::size");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(hs_conds.elements);
+}
+#endif
+
+spider_db_hs_str_buffer::spider_db_hs_str_buffer() : hs_da_init(FALSE)
+{
+ DBUG_ENTER("spider_db_hs_str_buffer::spider_db_hs_str_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_hs_str_buffer::~spider_db_hs_str_buffer()
+{
+ DBUG_ENTER("spider_db_hs_str_buffer::~spider_db_hs_str_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (hs_da_init)
+ {
+ spider_free_mem_calc(spider_current_trx,
+ hs_conds_id, hs_conds.max_element * hs_conds.size_of_element);
+ delete_dynamic(&hs_conds);
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_hs_str_buffer::init()
+{
+ DBUG_ENTER("spider_db_hs_str_buffer::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!hs_da_init)
+ {
+ SPD_INIT_DYNAMIC_ARRAY2(&hs_conds, sizeof(spider_string *),
+ NULL, 16, 16, MYF(MY_WME));
+ spider_alloc_calc_mem_init(hs_conds, 160);
+ spider_alloc_calc_mem(spider_current_trx,
+ hs_conds, hs_conds.max_element * hs_conds.size_of_element);
+ hs_da_init = TRUE;
+ }
+ DBUG_RETURN(0);
+}
+
+void spider_db_hs_str_buffer::clear()
+{
+ uint i;
+ spider_string *element;
+ DBUG_ENTER("spider_db_hs_str_buffer::clear");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (i = 0; i < hs_conds.elements; i++)
+ {
+ get_dynamic(&hs_conds, (uchar *) &element, i);
+ element->free();
+ spider_free(spider_current_trx, element, MYF(0));
+ }
+ hs_conds.elements = 0;
+ DBUG_VOID_RETURN;
+}
+
+spider_string *spider_db_hs_str_buffer::add(
+ uint *strs_pos,
+ const char *str,
+ uint str_len
+) {
+ spider_string *element;
+ DBUG_ENTER("spider_db_hs_str_buffer::add");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (hs_conds.elements <= *strs_pos + 1)
+ {
+ if (!(element = (spider_string *) spider_malloc(spider_current_trx, 8,
+ sizeof(spider_string), MYF(MY_WME | MY_ZEROFILL))))
+ DBUG_RETURN(NULL);
+ element->init_calc_mem(98);
+ element->set_charset(&my_charset_bin);
+ if ((element->reserve(str_len + 1)))
+ {
+ spider_free(spider_current_trx, element, MYF(0));
+ DBUG_RETURN(NULL);
+ }
+ element->q_append(str, str_len);
+ uint old_elements = hs_conds.max_element;
+ if (insert_dynamic(&hs_conds, (uchar *) &element))
+ {
+ element->free();
+ spider_free(spider_current_trx, element, MYF(0));
+ DBUG_RETURN(NULL);
+ }
+ if (hs_conds.max_element > old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ hs_conds,
+ (hs_conds.max_element - old_elements) *
+ hs_conds.size_of_element);
+ }
+ } else {
+ element = ((spider_string **) hs_conds.buffer)[*strs_pos];
+ element->length(0);
+ if ((element->reserve(str_len + 1)))
+ DBUG_RETURN(NULL);
+ element->q_append(str, str_len);
+ }
+ (*strs_pos)++;
+ DBUG_RETURN(element);
+}
+
+spider_db_handlersocket_row::spider_db_handlersocket_row() :
+ spider_db_row(spider_dbton_handlersocket.dbton_id),
+ hs_row(NULL), field_count(0), row_size(0), cloned(FALSE)
+{
+ DBUG_ENTER("spider_db_handlersocket_row::spider_db_handlersocket_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_handlersocket_row::~spider_db_handlersocket_row()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::~spider_db_handlersocket_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (cloned)
+ {
+ spider_free(spider_current_trx, hs_row_first, MYF(0));
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket_row::store_to_field(
+ Field *field,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_handlersocket_row::store_to_field");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!hs_row->begin())
+ {
+ DBUG_PRINT("info", ("spider field is null"));
+ field->set_null();
+ field->reset();
+ } else {
+#ifndef DBUG_OFF
+ char buf[MAX_FIELD_WIDTH];
+ spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
+ tmp_str.init_calc_mem(119);
+ tmp_str.length(0);
+ tmp_str.append(hs_row->begin(), hs_row->size(), &my_charset_bin);
+ DBUG_PRINT("info", ("spider val=%s", tmp_str.c_ptr_safe()));
+#endif
+ field->set_notnull();
+ if (field->flags & BLOB_FLAG)
+ {
+ DBUG_PRINT("info", ("spider blob field"));
+ ((Field_blob *)field)->set_ptr(
+ hs_row->size(), (uchar *) hs_row->begin());
+ } else
+ field->store(hs_row->begin(), hs_row->size(), &my_charset_bin);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_row::append_to_str(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_row::append_to_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(hs_row->size()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(hs_row->begin(), hs_row->size());
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_row::append_escaped_to_str(
+ spider_string *str,
+ uint dbton_id
+) {
+ DBUG_ENTER("spider_db_handlersocket_row::append_escaped_to_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_string tmp_str(hs_row->begin(), hs_row->size() + 1, &my_charset_bin);
+ tmp_str.init_calc_mem(172);
+ tmp_str.length(hs_row->size());
+ if (str->reserve(hs_row->size() * 2 + 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
+ str->mem_calc();
+ DBUG_RETURN(0);
+}
+
+void spider_db_handlersocket_row::first()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::first");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_row = hs_row_first;
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_handlersocket_row::next()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::next");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_row++;
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_handlersocket_row::is_null()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::is_null");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(!hs_row->begin());
+}
+
+int spider_db_handlersocket_row::val_int()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::val_int");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(atoi(hs_row->begin()));
+}
+
+double spider_db_handlersocket_row::val_real()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::val_real");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(hs_row->begin() ? my_atof(hs_row->begin()) : 0.0);
+}
+
+my_decimal *spider_db_handlersocket_row::val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_handlersocket_row::val_decimal");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!hs_row->begin())
+ DBUG_RETURN(NULL);
+
+#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
+ decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
+ access_charset, decimal_value), "", "");
+#else
+ decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
+ access_charset, decimal_value));
+#endif
+
+ DBUG_RETURN(decimal_value);
+}
+
+SPIDER_DB_ROW *spider_db_handlersocket_row::clone()
+{
+ spider_db_handlersocket_row *clone_row;
+ char *tmp_char;
+ uint i;
+ DBUG_ENTER("spider_db_handlersocket_row::clone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(clone_row = new spider_db_handlersocket_row(dbton_id)))
+ {
+ DBUG_RETURN(NULL);
+ }
+ if (!spider_bulk_malloc(spider_current_trx, 169, MYF(MY_WME),
+ &clone_row->hs_row, (uint) (sizeof(SPIDER_HS_STRING_REF) * field_count),
+ &tmp_char, (uint) (row_size),
+ NullS)
+ ) {
+ delete clone_row;
+ DBUG_RETURN(NULL);
+ }
+ for (i = 0; i < field_count; i++)
+ {
+ memcpy(tmp_char, hs_row_first[i].begin(), hs_row_first[i].size());
+ clone_row->hs_row[i].set(tmp_char, hs_row_first[i].size());
+ tmp_char += hs_row_first[i].size();
+ }
+ clone_row->hs_row_first = clone_row->hs_row;
+ clone_row->cloned = TRUE;;
+ clone_row->row_size = row_size;;
+ DBUG_RETURN(NULL);
+}
+
+int spider_db_handlersocket_row::store_to_tmp_table(
+ TABLE *tmp_table,
+ spider_string *str
+) {
+ uint i;
+ SPIDER_HS_STRING_REF *tmp_hs_row = hs_row;
+ DBUG_ENTER("spider_db_handlersocket_row::store_to_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ for (i = 0; i < field_count; i++)
+ {
+ if (tmp_hs_row->begin())
+ {
+ if (str->reserve(tmp_hs_row->size()))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(tmp_hs_row->begin(), tmp_hs_row->size());
+ }
+ tmp_hs_row++;
+ }
+ tmp_table->field[0]->set_notnull();
+ tmp_table->field[0]->store(
+ (const char *) hs_row,
+ sizeof(SPIDER_HS_STRING_REF) * field_count, &my_charset_bin);
+ tmp_table->field[1]->set_notnull();
+ tmp_table->field[1]->store(
+ str->ptr(), str->length(), &my_charset_bin);
+ tmp_table->field[2]->set_null();
+ DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
+}
+
+uint spider_db_handlersocket_row::get_byte_size()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::get_byte_size");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(row_size);
+}
+
+
+spider_db_handlersocket_result_buffer::spider_db_handlersocket_result_buffer(
+) : spider_db_result_buffer()
+{
+ DBUG_ENTER("spider_db_handlersocket_result_buffer::spider_db_handlersocket_result_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_handlersocket_result_buffer::~spider_db_handlersocket_result_buffer()
+{
+ DBUG_ENTER(
+ "spider_db_handlersocket_result_buffer::~spider_db_handlersocket_result_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_handlersocket_result_buffer::clear()
+{
+ DBUG_ENTER("spider_db_handlersocket_result_buffer::clear");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_result.readbuf.clear();
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_handlersocket_result_buffer::check_size(
+ longlong size
+) {
+ DBUG_ENTER("spider_db_handlersocket_result_buffer::check_size");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((uint) hs_result.readbuf.real_size() > size)
+ {
+ hs_result.readbuf.real_free();
+ DBUG_RETURN(TRUE);
+ }
+ DBUG_RETURN(FALSE);
+}
+
+spider_db_handlersocket_result::spider_db_handlersocket_result(
+ SPIDER_DB_CONN *in_db_conn
+) : spider_db_result(in_db_conn), row(in_db_conn->dbton_id)
+{
+ DBUG_ENTER("spider_db_handlersocket_result::spider_db_handlersocket_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_handlersocket_result::~spider_db_handlersocket_result()
+{
+ DBUG_ENTER(
+ "spider_db_handlersocket_result::~spider_db_handlersocket_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_handlersocket_result::has_result()
+{
+ DBUG_ENTER("spider_db_handlersocket_result::has_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(((*hs_conn_p)->get_response_end_offset() > 0));
+}
+
+void spider_db_handlersocket_result::free_result()
+{
+ DBUG_ENTER("spider_db_handlersocket_result::free_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if ((*hs_conn_p)->get_response_end_offset() > 0)
+ {
+ (*hs_conn_p)->response_buf_remove();
+ if ((*hs_conn_p)->get_error_code())
+ {
+ DBUG_PRINT("info",("spider hs %d %s",
+ (*hs_conn_p)->get_error_code(),
+ (*hs_conn_p)->get_error().ptr()));
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ }
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_DB_ROW *spider_db_handlersocket_result::current_row()
+{
+ DBUG_ENTER("spider_db_handlersocket_result::current_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
+}
+
+SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row()
+{
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(row.hs_row = (SPIDER_HS_STRING_REF *)
+ (*hs_conn_p)->get_next_row()))
+ {
+ store_error_num = HA_ERR_END_OF_FILE;
+ DBUG_RETURN(NULL);
+ }
+ row.field_count = field_count;
+ row.hs_row_first = row.hs_row;
+ row.row_size = (*hs_conn_p)->get_row_size();
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_result_buffer(
+ spider_db_result_buffer *spider_res_buf
+) {
+ spider_db_handlersocket_result_buffer *hs_res_buf;
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_row_from_result_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_res_buf = (spider_db_handlersocket_result_buffer *) spider_res_buf;
+ if (!(row.hs_row = (SPIDER_HS_STRING_REF *)
+ (*hs_conn_p)->get_next_row_from_result(hs_res_buf->hs_result)))
+ {
+ store_error_num = HA_ERR_END_OF_FILE;
+ DBUG_RETURN(NULL);
+ }
+ row.field_count = field_count;
+ row.hs_row_first = row.hs_row;
+ row.row_size = (*hs_conn_p)->get_row_size_from_result(hs_res_buf->hs_result);
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_tmp_table(
+ TABLE *tmp_table
+) {
+ uint i;
+ spider_string tmp_str1, tmp_str2;
+ const char *row_ptr;
+ SPIDER_HS_STRING_REF *tmp_hs_row;
+ uint field_count;
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_row_from_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_str1.init_calc_mem(171);
+ tmp_str2.init_calc_mem(173);
+ tmp_table->field[0]->val_str(tmp_str1.get_str());
+ tmp_table->field[1]->val_str(tmp_str2.get_str());
+ tmp_str1.mem_calc();
+ tmp_str2.mem_calc();
+ row_ptr = tmp_str2.ptr();
+ tmp_hs_row = (SPIDER_HS_STRING_REF *) tmp_str1.ptr();
+ field_count = tmp_str1.length() / sizeof(SPIDER_HS_STRING_REF);
+ row.hs_row = tmp_hs_row;
+ row.field_count = field_count;
+ row.hs_row_first = row.hs_row;
+ for (i = 0; i < field_count; i++)
+ {
+ if (tmp_hs_row->begin())
+ {
+ uint length = tmp_hs_row->size();
+ tmp_hs_row->set(row_ptr, length);
+ row_ptr += length;
+ }
+ tmp_hs_row++;
+ }
+ row.row_size = row_ptr - tmp_str2.ptr();
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+int spider_db_handlersocket_result::fetch_table_status(
+ int mode,
+ ha_statistics &stat
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_table_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_result::fetch_table_records(
+ int mode,
+ ha_rows &records
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_table_records");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_result::fetch_table_cardinality(
+ int mode,
+ TABLE *table,
+ longlong *cardinality,
+ uchar *cardinality_upd,
+ int bitmap_size
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_table_cardinality");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_result::fetch_table_mon_status(
+ int &status
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_table_mon_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+longlong spider_db_handlersocket_result::num_rows()
+{
+ DBUG_ENTER("spider_db_handlersocket_result::num_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((longlong) 0);
+}
+
+uint spider_db_handlersocket_result::num_fields()
+{
+ DBUG_ENTER("spider_db_handlersocket_result::num_fields");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(field_count);
+}
+
+void spider_db_handlersocket_result::move_to_pos(
+ longlong pos
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::move_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket_result::get_errno()
+{
+ DBUG_ENTER("spider_db_handlersocket_result::get_errno");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider store_error_num=%d", store_error_num));
+ DBUG_RETURN(store_error_num);
+}
+
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+int spider_db_handlersocket_result::fetch_columns_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_columns_for_discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+
+int spider_db_handlersocket_result::fetch_index_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_index_for_discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+
+int spider_db_handlersocket_result::fetch_table_for_discover_table_structure(
+ spider_string *str,
+ SPIDER_SHARE *spider_share,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_handlersocket_result::fetch_table_for_discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+#endif
+
+spider_db_handlersocket::spider_db_handlersocket(
+ SPIDER_CONN *conn
+) : spider_db_conn(conn),
+ handler_open_array_inited(FALSE),
+ request_key_req_first(NULL),
+ request_key_req_last(NULL),
+ request_key_snd_first(NULL),
+ request_key_snd_last(NULL),
+ request_key_reuse_first(NULL),
+ request_key_reuse_last(NULL)
+{
+ DBUG_ENTER("spider_db_handlersocket::spider_db_handlersocket");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+#else
+ hs_conn = NULL;
+#endif
+ DBUG_VOID_RETURN;
+}
+
+spider_db_handlersocket::~spider_db_handlersocket()
+{
+ st_spider_db_request_key *tmp_request_key;
+ DBUG_ENTER("spider_db_handlersocket::~spider_db_handlersocket");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (handler_open_array_inited)
+ {
+ reset_opened_handler();
+ spider_free_mem_calc(spider_current_trx,
+ handler_open_array_id,
+ handler_open_array.max_element *
+ handler_open_array.size_of_element);
+ delete_dynamic(&handler_open_array);
+ }
+ while (request_key_req_first)
+ {
+ tmp_request_key = request_key_req_first->next;
+ spider_free(spider_current_trx, request_key_req_first, MYF(0));
+ request_key_req_first = tmp_request_key;
+ }
+ while (request_key_snd_first)
+ {
+ tmp_request_key = request_key_snd_first->next;
+ spider_free(spider_current_trx, request_key_snd_first, MYF(0));
+ request_key_snd_first = tmp_request_key;
+ }
+ while (request_key_reuse_first)
+ {
+ tmp_request_key = request_key_reuse_first->next;
+ spider_free(spider_current_trx, request_key_reuse_first, MYF(0));
+ request_key_reuse_first = tmp_request_key;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket::init()
+{
+ DBUG_ENTER("spider_db_handlersocket::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ SPD_INIT_DYNAMIC_ARRAY2(&handler_open_array,
+ sizeof(SPIDER_LINK_FOR_HASH *), NULL, 16, 16, MYF(MY_WME))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ spider_alloc_calc_mem_init(handler_open_array, 79);
+ spider_alloc_calc_mem(spider_current_trx,
+ handler_open_array,
+ handler_open_array.max_element *
+ handler_open_array.size_of_element);
+ handler_open_array_inited = TRUE;
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::is_connected()
+{
+ DBUG_ENTER("spider_db_handlersocket::is_connected");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ DBUG_RETURN(hs_conn.operator->());
+#else
+ DBUG_RETURN(hs_conn);
+#endif
+}
+
+void spider_db_handlersocket::bg_connect()
+{
+ DBUG_ENTER("spider_db_handlersocket::bg_connect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket::connect(
+ char *tgt_host,
+ char *tgt_username,
+ char *tgt_password,
+ long tgt_port,
+ char *tgt_socket,
+ char *server_name,
+ int connect_retry_count,
+ longlong connect_retry_interval
+) {
+ DBUG_ENTER("spider_db_handlersocket::connect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ SPIDER_HS_SOCKARGS sockargs;
+ sockargs.timeout = conn->connect_timeout;
+ sockargs.recv_timeout = conn->net_read_timeout;
+ sockargs.send_timeout = conn->net_write_timeout;
+ if (conn->hs_sock)
+ {
+ sockargs.family = AF_UNIX;
+ sockargs.set_unix_domain(conn->hs_sock);
+ } else {
+ char port_str[6];
+ my_sprintf(port_str, (port_str, "%05ld", conn->hs_port));
+ if (sockargs.resolve(conn->tgt_host, port_str) != 0)
+ {
+ my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
+ conn->tgt_host);
+ DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
+ }
+ }
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ if (!(hs_conn.operator->()))
+#else
+ if (!(hs_conn))
+#endif
+ {
+ hs_conn = SPIDER_HS_CONN_CREATE(sockargs);
+ } else {
+ hs_conn->reconnect();
+ spider_db_hs_request_buf_reset(conn);
+ }
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ if (!(hs_conn.operator->()))
+#else
+ if (!(hs_conn))
+#endif
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ while (hs_conn->get_error_code())
+ {
+ THD *thd = current_thd;
+ if (
+ !connect_retry_count ||
+ (thd && thd->killed)
+ ) {
+ my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
+ conn->tgt_host);
+ DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
+ }
+ connect_retry_count--;
+ my_sleep((ulong) connect_retry_interval);
+ hs_conn->reconnect();
+ }
+ reset_request_key_req();
+ reset_request_key_snd();
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::ping()
+{
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::ping");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if ((*hs_conn_p)->reconnect())
+ {
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ DBUG_RETURN(ER_SPIDER_HS_NUM);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+
+ reset_request_key_req();
+ reset_request_key_snd();
+ conn->opened_handlers = 0;
+ conn->db_conn->reset_opened_handler();
+ ++conn->connection_id;
+ DBUG_RETURN(0);
+}
+
+void spider_db_handlersocket::bg_disconnect()
+{
+ DBUG_ENTER("spider_db_handlersocket::bg_disconnect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_handlersocket::disconnect()
+{
+ DBUG_ENTER("spider_db_handlersocket::disconnect");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ if (hs_conn.operator->())
+#else
+ DBUG_PRINT("info",("spider hs_conn=%p", hs_conn));
+ if (hs_conn)
+#endif
+ {
+ hs_conn->close();
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ SPIDER_HS_CONN tmp_hs_conn;
+ tmp_hs_conn = hs_conn;
+#else
+ delete hs_conn;
+ hs_conn = NULL;
+#endif
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket::set_net_timeout()
+{
+ DBUG_ENTER("spider_db_handlersocket::set_net_timeout");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(hs_conn->set_timeout(
+ conn->net_write_timeout,
+ conn->net_read_timeout
+ ));
+}
+
+int spider_db_handlersocket::exec_query(
+ const char *query,
+ uint length,
+ int quick_mode
+) {
+ DBUG_ENTER("spider_db_handlersocket::query");
+ DBUG_PRINT("info",("spider this=%p", this));
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ DBUG_PRINT("info", ("spider hs_conn %p", hs_conn.operator->()));
+#else
+ DBUG_PRINT("info", ("spider hs_conn %p", hs_conn));
+#endif
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (spider_param_general_log())
+ {
+ const char *tgt_str = conn->hs_sock ? conn->hs_sock : conn->tgt_host;
+ uint32 tgt_len = strlen(tgt_str);
+ spider_string tmp_query_str((*hs_conn_p)->get_writebuf_size() +
+ conn->tgt_wrapper_length +
+ tgt_len + (SPIDER_SQL_SPACE_LEN * 2));
+ tmp_query_str.init_calc_mem(231);
+ tmp_query_str.length(0);
+ tmp_query_str.q_append(conn->tgt_wrapper, conn->tgt_wrapper_length);
+ tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ tmp_query_str.q_append(tgt_str, tgt_len);
+ tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ tmp_query_str.q_append((*hs_conn_p)->get_writebuf_begin(),
+ (*hs_conn_p)->get_writebuf_size());
+ general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
+ tmp_query_str.length());
+ }
+ if ((*hs_conn_p)->request_send() < 0)
+ {
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ DBUG_RETURN(ER_SPIDER_HS_NUM);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ move_request_key_to_snd();
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::get_errno()
+{
+ DBUG_ENTER("spider_db_handlersocket::get_errno");
+ DBUG_PRINT("info",("spider this=%p", this));
+ stored_error = hs_conn->get_error_code();
+ DBUG_PRINT("info",("spider stored_error=%d", stored_error));
+ DBUG_RETURN(stored_error);
+}
+
+const char *spider_db_handlersocket::get_error()
+{
+ const char *error_ptr;
+ DBUG_ENTER("spider_db_handlersocket::get_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ error_ptr = hs_conn->get_error().c_str();
+#else
+ error_ptr = hs_conn->get_error().c_ptr();
+#endif
+ DBUG_PRINT("info",("spider error=%s", error_ptr));
+ DBUG_RETURN(error_ptr);
+}
+
+bool spider_db_handlersocket::is_server_gone_error(
+ int error_num
+) {
+ bool server_gone;
+ DBUG_ENTER("spider_db_handlersocket::is_server_gone_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ server_gone = (hs_conn->get_error_code() < 0);
+ DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
+ DBUG_RETURN(server_gone);
+}
+
+bool spider_db_handlersocket::is_dup_entry_error(
+ int error_num
+) {
+ bool dup_entry;
+ DBUG_ENTER("spider_db_handlersocket::is_dup_entry_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifndef HANDLERSOCKET_MYSQL_UTIL
+ const char *c_str = hs_conn->get_error().c_str();
+#else
+ const char *c_str = hs_conn->get_error().c_ptr_safe();
+#endif
+ dup_entry =
+ (
+ c_str[0] == '1' &&
+ c_str[1] == '2' &&
+ c_str[2] == '1' &&
+ c_str[3] == '\0'
+ );
+ DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
+ DBUG_RETURN(dup_entry);
+}
+
+bool spider_db_handlersocket::is_xa_nota_error(
+ int error_num
+) {
+ bool xa_nota;
+ DBUG_ENTER("spider_db_handlersocket::is_xa_nota_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ xa_nota = (stored_error == ER_XAER_NOTA);
+ DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
+ DBUG_RETURN(xa_nota);
+}
+
+spider_db_result *spider_db_handlersocket::store_result(
+ spider_db_result_buffer **spider_res_buf,
+ st_spider_db_request_key *request_key,
+ int *error_num
+) {
+ int internal_error;
+ spider_db_handlersocket_result *result;
+ spider_db_handlersocket_result_buffer *hs_res_buf;
+ DBUG_ENTER("spider_db_handlersocket::store_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (*spider_res_buf)
+ {
+ hs_res_buf = (spider_db_handlersocket_result_buffer *) *spider_res_buf;
+ } else {
+ if (!(hs_res_buf = new spider_db_handlersocket_result_buffer()))
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ DBUG_RETURN(NULL);
+ }
+ *spider_res_buf = (spider_db_result_buffer *) hs_res_buf;
+ }
+ hs_res_buf->clear();
+ if (!(result = new spider_db_handlersocket_result(this)))
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ DBUG_RETURN(NULL);
+ }
+ *error_num = 0;
+ result->hs_conn_p = &hs_conn;
+ size_t num_fields;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ if (request_key)
+ {
+ int tmp_res, tmp_err = (*hs_conn_p)->get_error_code();
+ while ((tmp_res = check_request_key(request_key)) == 1)
+ {
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if ((internal_error = (*hs_conn_p)->response_recv(num_fields)))
+ {
+ if (!tmp_err && internal_error > 0)
+ {
+ (*hs_conn_p)->clear_error();
+ } else {
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+#ifndef DBUG_OFF
+ if ((*hs_conn_p)->get_response_end_offset() > 0 &&
+ (*hs_conn_p)->get_readbuf_begin())
+ {
+ char tmp_buf[MAX_FIELD_WIDTH];
+ String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
+ tmp_str.length(0);
+ tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
+ (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
+ DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
+ (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
+ }
+#endif
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (internal_error > 0)
+ {
+ (*hs_conn_p)->response_buf_remove();
+ if ((*hs_conn_p)->get_error_code())
+ {
+ DBUG_PRINT("info",("spider hs %d %s",
+ (*hs_conn_p)->get_error_code(),
+ (*hs_conn_p)->get_error().ptr()));
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->clear_error();
+ }
+ delete result;
+ DBUG_RETURN(NULL);
+ }
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->response_buf_remove();
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ }
+ if (tmp_res == -1)
+ {
+ DBUG_PRINT("info",("spider ER_SPIDER_REQUEST_KEY_NUM"));
+ *error_num = ER_SPIDER_REQUEST_KEY_NUM;
+ DBUG_RETURN(NULL);
+ }
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (
+ (internal_error = (*hs_conn_p)->response_recv(num_fields)) ||
+ (*error_num = (*hs_conn_p)->get_result(hs_res_buf->hs_result))
+ ) {
+ if (*error_num)
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ }
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+#ifndef DBUG_OFF
+ if ((*hs_conn_p)->get_response_end_offset() > 0 &&
+ (*hs_conn_p)->get_readbuf_begin())
+ {
+ char tmp_buf[MAX_FIELD_WIDTH];
+ String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
+ tmp_str.length(0);
+ tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
+ (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
+ DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
+ (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
+ }
+#endif
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (internal_error > 0)
+ {
+ (*hs_conn_p)->response_buf_remove();
+ if ((*hs_conn_p)->get_error_code())
+ {
+ DBUG_PRINT("info",("spider hs %d %s",
+ (*hs_conn_p)->get_error_code(),
+ (*hs_conn_p)->get_error().ptr()));
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ }
+ delete result;
+ DBUG_RETURN(NULL);
+ }
+#ifndef DBUG_OFF
+ if ((*hs_conn_p)->get_response_end_offset() > 0 &&
+ (*hs_conn_p)->get_readbuf_begin())
+ {
+ char tmp_buf[MAX_FIELD_WIDTH];
+ String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
+ tmp_str.length(0);
+ tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
+ (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
+ DBUG_PRINT("info",("spider hs readbuf02 size=%zu str=%s",
+ (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
+ }
+#endif
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->response_buf_remove();
+ if ((*hs_conn_p)->get_error_code())
+ {
+ DBUG_PRINT("info",("spider hs %d %s",
+ (*hs_conn_p)->get_error_code(),
+ (*hs_conn_p)->get_error().ptr()));
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ field_count = (uint) num_fields;
+ result->field_count = field_count;
+ DBUG_RETURN(result);
+}
+
+spider_db_result *spider_db_handlersocket::use_result(
+ ha_spider *spider,
+ st_spider_db_request_key *request_key,
+ int *error_num
+) {
+ int internal_error;
+ spider_db_handlersocket_result *result;
+ DBUG_ENTER("spider_db_handlersocket::use_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(result = new spider_db_handlersocket_result(this)))
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ DBUG_RETURN(NULL);
+ }
+ *error_num = 0;
+ result->hs_conn_p = &hs_conn;
+ size_t num_fields;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ if (request_key)
+ {
+ int tmp_res, tmp_err = (*hs_conn_p)->get_error_code();
+ while ((tmp_res = check_request_key(request_key)) == 1)
+ {
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if ((internal_error = (*hs_conn_p)->response_recv(num_fields)))
+ {
+ if (!tmp_err && internal_error > 0)
+ {
+ (*hs_conn_p)->clear_error();
+ } else {
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+#ifndef DBUG_OFF
+ if ((*hs_conn_p)->get_response_end_offset() > 0 &&
+ (*hs_conn_p)->get_readbuf_begin())
+ {
+ char tmp_buf[MAX_FIELD_WIDTH];
+ String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
+ tmp_str.length(0);
+ tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
+ (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
+ DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
+ (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
+ }
+#endif
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (internal_error > 0)
+ {
+ (*hs_conn_p)->response_buf_remove();
+ if ((*hs_conn_p)->get_error_code())
+ {
+ DBUG_PRINT("info",("spider hs %d %s",
+ (*hs_conn_p)->get_error_code(),
+ (*hs_conn_p)->get_error().ptr()));
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->clear_error();
+ }
+ delete result;
+ DBUG_RETURN(NULL);
+ }
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->response_buf_remove();
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ }
+ if (tmp_res == -1)
+ {
+ DBUG_PRINT("info",("spider ER_SPIDER_REQUEST_KEY_NUM"));
+ *error_num = ER_SPIDER_REQUEST_KEY_NUM;
+ DBUG_RETURN(NULL);
+ }
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (
+ (internal_error = (*hs_conn_p)->response_recv(num_fields))
+ ) {
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+#ifndef DBUG_OFF
+ if ((*hs_conn_p)->get_response_end_offset() > 0 &&
+ (*hs_conn_p)->get_readbuf_begin())
+ {
+ char tmp_buf[MAX_FIELD_WIDTH];
+ String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
+ tmp_str.length(0);
+ tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
+ (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
+ DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
+ (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
+ }
+#endif
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (internal_error > 0)
+ {
+ (*hs_conn_p)->response_buf_remove();
+ if ((*hs_conn_p)->get_error_code())
+ {
+ DBUG_PRINT("info",("spider hs %d %s",
+ (*hs_conn_p)->get_error_code(),
+ (*hs_conn_p)->get_error().ptr()));
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ }
+ delete result;
+ DBUG_RETURN(NULL);
+ }
+#ifndef DBUG_OFF
+ if ((*hs_conn_p)->get_response_end_offset() > 0 &&
+ (*hs_conn_p)->get_readbuf_begin())
+ {
+ char tmp_buf[MAX_FIELD_WIDTH];
+ String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
+ tmp_str.length(0);
+ tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
+ (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
+ DBUG_PRINT("info",("spider hs readbuf02 size=%zu str=%s",
+ (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
+ }
+#endif
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ field_count = (uint) num_fields;
+ result->field_count = field_count;
+ DBUG_RETURN(result);
+}
+
+int spider_db_handlersocket::next_result()
+{
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::next_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ if ((*hs_conn_p)->stable_point())
+ DBUG_RETURN(-1);
+ DBUG_RETURN(0);
+}
+
+uint spider_db_handlersocket::affected_rows()
+{
+ int error_num;
+ const SPIDER_HS_STRING_REF *hs_row;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::affected_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ if (
+ field_count != 1 ||
+ !(hs_row = (*hs_conn_p)->get_next_row()) ||
+ !hs_row->begin()
+ ) {
+ DBUG_RETURN(0);
+ }
+ DBUG_RETURN((uint) my_strtoll10(hs_row->begin(), (char**) NULL, &error_num));
+}
+
+uint spider_db_handlersocket::matched_rows()
+{
+ DBUG_ENTER("spider_db_handlersocket::matched_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::inserted_info(
+ spider_db_handler *handler,
+ ha_copy_info *copy_info
+) {
+ DBUG_ENTER("spider_db_handlersocket::inserted_info");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+ulonglong spider_db_handlersocket::last_insert_id()
+{
+ DBUG_ENTER("spider_db_handlersocket::last_insert_id");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::set_character_set(
+ const char *csname
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_character_set");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::select_db(
+ const char *dbname
+) {
+ DBUG_ENTER("spider_db_handlersocket::select_db");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::consistent_snapshot(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::consistent_snapshot");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::trx_start_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::trx_start_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::start_transaction(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::start_transaction");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::commit(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::commit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::rollback(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::rollback");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::xa_start_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::xa_start_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::xa_start(
+ XID *xid,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::xa_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::xa_end(
+ XID *xid,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::xa_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::xa_prepare(
+ XID *xid,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::xa_prepare");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::xa_commit(
+ XID *xid,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::xa_commit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::xa_rollback(
+ XID *xid,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::xa_rollback");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::set_trx_isolation_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::set_trx_isolation_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::set_trx_isolation(
+ int trx_isolation,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_trx_isolation");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::set_autocommit_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::set_autocommit_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::set_autocommit(
+ bool autocommit,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_autocommit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::set_sql_log_off_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::set_sql_log_off_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::set_sql_log_off(
+ bool sql_log_off,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_sql_log_off");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::set_wait_timeout_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::set_wait_timeout_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::set_wait_timeout(
+ int wait_timeout,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_wait_timeout");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::set_sql_mode_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::set_sql_mode_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::set_sql_mode(
+ sql_mode_t sql_mode,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_sql_mode");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::set_time_zone_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_handlersocket::set_time_zone_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::set_time_zone(
+ Time_zone *time_zone,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_time_zone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+) {
+ DBUG_ENTER("spider_db_handlersocket::show_master_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::append_sql(
+ char *sql,
+ ulong sql_length,
+ st_spider_db_request_key *request_key
+) {
+ int error_num;
+ size_t req_num;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::append_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = append_request_key(request_key)))
+ DBUG_RETURN(error_num);
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ if (!(req_num = (*hs_conn_p)->request_buf_append(sql, sql + sql_length)))
+ {
+ DBUG_PRINT("info",("spider hs %d %s",
+ (*hs_conn_p)->get_error_code(),
+ (*hs_conn_p)->get_error().ptr()));
+ (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
+ DBUG_RETURN((*hs_conn_p)->get_error_code());
+ }
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ while (req_num > 1)
+ {
+ if ((error_num = append_request_key(request_key)))
+ DBUG_RETURN(error_num);
+ --req_num;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::append_open_handler(
+ uint handler_id,
+ const char *db_name,
+ const char *table_name,
+ const char *index_name,
+ const char *sql,
+ st_spider_db_request_key *request_key
+) {
+ int error_num;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::append_open_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = append_request_key(request_key)))
+ DBUG_RETURN(error_num);
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->request_buf_open_index(
+ handler_id,
+ db_name,
+ table_name,
+ index_name,
+ sql
+ );
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::append_select(
+ uint handler_id,
+ spider_string *sql,
+ SPIDER_DB_HS_STRING_REF_BUFFER *keys,
+ int limit,
+ int skip,
+ st_spider_db_request_key *request_key
+) {
+ int error_num;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::append_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = append_request_key(request_key)))
+ DBUG_RETURN(error_num);
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->request_buf_exec_generic(
+ handler_id,
+ SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
+ keys->ptr(), (size_t) keys->size(),
+ limit, skip,
+ SPIDER_HS_STRING_REF(),
+ NULL, 0);
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::append_insert(
+ uint handler_id,
+ SPIDER_DB_HS_STRING_REF_BUFFER *upds,
+ st_spider_db_request_key *request_key
+) {
+ int error_num;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::append_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = append_request_key(request_key)))
+ DBUG_RETURN(error_num);
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->request_buf_exec_generic(
+ handler_id,
+ SPIDER_HS_STRING_REF(SPIDER_SQL_HS_INSERT_STR, SPIDER_SQL_HS_INSERT_LEN),
+ upds->ptr(), (size_t) upds->size(),
+ 0, 0,
+ SPIDER_HS_STRING_REF(), NULL, 0);
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::append_update(
+ uint handler_id,
+ spider_string *sql,
+ SPIDER_DB_HS_STRING_REF_BUFFER *keys,
+ SPIDER_DB_HS_STRING_REF_BUFFER *upds,
+ int limit,
+ int skip,
+ bool increment,
+ bool decrement,
+ st_spider_db_request_key *request_key
+) {
+ int error_num;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = append_request_key(request_key)))
+ DBUG_RETURN(error_num);
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->request_buf_exec_generic(
+ handler_id,
+ SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
+ keys->ptr(), (size_t) keys->size(),
+ limit, skip,
+ increment ?
+ SPIDER_HS_STRING_REF(SPIDER_SQL_HS_INCREMENT_STR,
+ SPIDER_SQL_HS_INCREMENT_LEN) :
+ decrement ?
+ SPIDER_HS_STRING_REF(SPIDER_SQL_HS_DECREMENT_STR,
+ SPIDER_SQL_HS_DECREMENT_LEN) :
+ SPIDER_HS_STRING_REF(SPIDER_SQL_HS_UPDATE_STR,
+ SPIDER_SQL_HS_UPDATE_LEN),
+ upds->ptr(), (size_t) upds->size()
+ );
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::append_delete(
+ uint handler_id,
+ spider_string *sql,
+ SPIDER_DB_HS_STRING_REF_BUFFER *keys,
+ int limit,
+ int skip,
+ st_spider_db_request_key *request_key
+) {
+ int error_num;
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = append_request_key(request_key)))
+ DBUG_RETURN(error_num);
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->request_buf_exec_generic(
+ handler_id,
+ SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
+ keys->ptr(), (size_t) keys->size(),
+ limit, skip,
+ SPIDER_HS_STRING_REF(SPIDER_SQL_HS_DELETE_STR, SPIDER_SQL_HS_DELETE_LEN),
+ NULL, 0);
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ DBUG_RETURN(0);
+}
+
+void spider_db_handlersocket::reset_request_queue()
+{
+ SPIDER_HS_CONN *hs_conn_p = &hs_conn;
+ DBUG_ENTER("spider_db_handlersocket::reset_request_queue");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ (*hs_conn_p)->request_reset();
+ DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
+ (*hs_conn_p)->get_num_req_bufd()));
+ DBUG_PRINT("info",("spider hs num_req_sent=%zu",
+ (*hs_conn_p)->get_num_req_sent()));
+ DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
+ (*hs_conn_p)->get_num_req_rcvd()));
+ DBUG_PRINT("info",("spider hs response_end_offset=%zu",
+ (*hs_conn_p)->get_response_end_offset()));
+ reset_request_key_req();
+ DBUG_VOID_RETURN;
+}
+
+size_t spider_db_handlersocket::escape_string(
+ char *to,
+ const char *from,
+ size_t from_length
+) {
+ DBUG_ENTER("spider_db_handlersocket::escape_string");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ memcpy(to, from, from_length);
+ DBUG_RETURN(from_length);
+}
+
+bool spider_db_handlersocket::have_lock_table_list()
+{
+ DBUG_ENTER("spider_db_handlersocket::have_lock_table_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_handlersocket::append_lock_tables(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket::lock_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket::append_unlock_tables(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket::append_unlock_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+uint spider_db_handlersocket::get_lock_table_hash_count()
+{
+ DBUG_ENTER("spider_db_handlersocket::get_lock_table_hash_count");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+void spider_db_handlersocket::reset_lock_table_hash()
+{
+ DBUG_ENTER("spider_db_handlersocket::reset_lock_table_hash");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+uint spider_db_handlersocket::get_opened_handler_count()
+{
+ DBUG_ENTER("spider_db_handlersocket::get_opened_handler_count");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(handler_open_array.elements);
+}
+
+void spider_db_handlersocket::reset_opened_handler()
+{
+ ha_spider *tmp_spider;
+ int tmp_link_idx;
+ SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
+ DBUG_ENTER("spider_db_handlersocket::reset_opened_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ while ((tmp_link_for_hash =
+ (SPIDER_LINK_FOR_HASH **) pop_dynamic(&handler_open_array)))
+ {
+ tmp_spider = (*tmp_link_for_hash)->spider;
+ tmp_link_idx = (*tmp_link_for_hash)->link_idx;
+ tmp_spider->clear_handler_opened(tmp_link_idx, conn->conn_kind);
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_handlersocket::set_dup_key_idx(
+ ha_spider *spider,
+ int link_idx
+) {
+ DBUG_ENTER("spider_db_handlersocket::set_dup_key_idx");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket::append_request_key(
+ st_spider_db_request_key *request_key
+) {
+ st_spider_db_request_key *tmp_request_key;
+ DBUG_ENTER("spider_db_handlersocket::append_request_key");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider request_key=%p", request_key));
+ if (request_key)
+ {
+ DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
+ request_key->spider_thread_id));
+ DBUG_PRINT("info",("spider request_key->query_id=%llu",
+ request_key->query_id));
+ DBUG_PRINT("info",("spider request_key->handler=%p",
+ request_key->handler));
+ DBUG_PRINT("info",("spider request_key->request_id=%llu",
+ request_key->request_id));
+ if (request_key_reuse_first)
+ {
+ tmp_request_key = request_key_reuse_first;
+ request_key_reuse_first = request_key_reuse_first->next;
+ if (!request_key_reuse_first)
+ request_key_reuse_last = NULL;
+ } else {
+ if (!(tmp_request_key = (st_spider_db_request_key *)
+ spider_malloc(spider_current_trx, 1, sizeof(st_spider_db_request_key),
+ MYF(MY_WME)))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ *tmp_request_key = *request_key;
+ tmp_request_key->next = NULL;
+ if (request_key_req_last)
+ request_key_req_last->next = tmp_request_key;
+ else
+ request_key_req_first = tmp_request_key;
+ request_key_req_last = tmp_request_key;
+ }
+ DBUG_RETURN(0);
+}
+
+void spider_db_handlersocket::reset_request_key_req()
+{
+ DBUG_ENTER("spider_db_handlersocket::reset_request_key_req");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (request_key_req_first)
+ {
+ if (request_key_reuse_last)
+ request_key_reuse_last->next = request_key_req_first;
+ else
+ request_key_reuse_first = request_key_req_first;
+ request_key_reuse_last = request_key_req_last;
+ request_key_req_first = NULL;
+ request_key_req_last = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_handlersocket::reset_request_key_snd()
+{
+ DBUG_ENTER("spider_db_handlersocket::reset_request_key_snd");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (request_key_snd_first)
+ {
+ if (request_key_reuse_last)
+ request_key_reuse_last->next = request_key_snd_first;
+ else
+ request_key_reuse_first = request_key_snd_first;
+ request_key_reuse_last = request_key_snd_last;
+ request_key_snd_first = NULL;
+ request_key_snd_last = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_handlersocket::move_request_key_to_snd()
+{
+ DBUG_ENTER("spider_db_handlersocket::move_request_key_to_snd");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (request_key_req_first)
+ {
+ if (request_key_snd_last)
+ request_key_snd_last->next = request_key_req_first;
+ else
+ request_key_snd_first = request_key_req_first;
+ request_key_snd_last = request_key_req_last;
+ request_key_req_first = NULL;
+ request_key_req_last = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket::check_request_key(
+ st_spider_db_request_key *request_key
+) {
+ st_spider_db_request_key *tmp_request_key;
+ DBUG_ENTER("spider_db_handlersocket::check_request_key");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider request_key=%p", request_key));
+ DBUG_PRINT("info",("spider request_key_snd_first=%p",
+ request_key_snd_first));
+ if (!request_key_snd_first)
+ {
+ DBUG_PRINT("info",("spider -1"));
+ DBUG_RETURN(-1);
+ }
+ tmp_request_key = request_key_snd_first;
+ request_key_snd_first = request_key_snd_first->next;
+ if (!request_key_snd_first)
+ request_key_snd_last = NULL;
+ tmp_request_key->next = NULL;
+ if (request_key_reuse_last)
+ request_key_reuse_last->next = tmp_request_key;
+ else
+ request_key_reuse_first = tmp_request_key;
+ request_key_reuse_last = tmp_request_key;
+
+ DBUG_PRINT("info",("spider tmp_request_key->spider_thread_id=%llu",
+ tmp_request_key->spider_thread_id));
+ DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
+ request_key->spider_thread_id));
+ DBUG_PRINT("info",("spider tmp_request_key->query_id=%llu",
+ tmp_request_key->query_id));
+ DBUG_PRINT("info",("spider request_key->query_id=%llu",
+ request_key->query_id));
+ DBUG_PRINT("info",("spider tmp_request_key->handler=%p",
+ tmp_request_key->handler));
+ DBUG_PRINT("info",("spider request_key->handler=%p",
+ request_key->handler));
+ DBUG_PRINT("info",("spider tmp_request_key->request_id=%llu",
+ tmp_request_key->request_id));
+ DBUG_PRINT("info",("spider request_key->request_id=%llu",
+ request_key->request_id));
+ if (
+ tmp_request_key->spider_thread_id != request_key->spider_thread_id ||
+ tmp_request_key->query_id != request_key->query_id ||
+ tmp_request_key->handler != request_key->handler ||
+ tmp_request_key->request_id != request_key->request_id
+ ) {
+ DBUG_PRINT("info",("spider 1"));
+ DBUG_RETURN(1);
+ }
+ DBUG_PRINT("info",("spider 0"));
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket::cmp_request_key_to_snd(
+ st_spider_db_request_key *request_key
+) {
+ DBUG_ENTER("spider_db_handlersocket::cmp_request_key_to_snd");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider request_key=%p", request_key));
+ if (
+ !request_key
+ ) {
+ DBUG_PRINT("info",("spider TRUE"));
+ DBUG_RETURN(TRUE);
+ }
+ DBUG_PRINT("info",("spider request_key_snd_first=%p",
+ request_key_snd_first));
+ if (
+ !request_key_snd_first
+ ) {
+ DBUG_PRINT("info",("spider FALSE"));
+ DBUG_RETURN(FALSE);
+ }
+ DBUG_PRINT("info",("spider request_key_snd_first->spider_thread_id=%llu",
+ request_key_snd_first->spider_thread_id));
+ DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
+ request_key->spider_thread_id));
+ DBUG_PRINT("info",("spider request_key_snd_first->query_id=%llu",
+ request_key_snd_first->query_id));
+ DBUG_PRINT("info",("spider request_key->query_id=%llu",
+ request_key->query_id));
+ DBUG_PRINT("info",("spider request_key_snd_first->handler=%p",
+ request_key_snd_first->handler));
+ DBUG_PRINT("info",("spider request_key->handler=%p",
+ request_key->handler));
+ DBUG_PRINT("info",("spider request_key_snd_first->request_id=%llu",
+ request_key_snd_first->request_id));
+ DBUG_PRINT("info",("spider request_key->request_id=%llu",
+ request_key->request_id));
+ if (
+ request_key_snd_first->spider_thread_id != request_key->spider_thread_id ||
+ request_key_snd_first->query_id != request_key->query_id ||
+ request_key_snd_first->handler != request_key->handler ||
+ request_key_snd_first->request_id != request_key->request_id
+ ) {
+ DBUG_PRINT("info",("spider FALSE"));
+ DBUG_RETURN(FALSE);
+ }
+ DBUG_PRINT("info",("spider TRUE"));
+ DBUG_RETURN(TRUE);
+}
+
+spider_db_handlersocket_util::spider_db_handlersocket_util() : spider_db_util()
+{
+ DBUG_ENTER("spider_db_handlersocket_util::spider_db_handlersocket_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_handlersocket_util::~spider_db_handlersocket_util()
+{
+ DBUG_ENTER("spider_db_handlersocket_util::~spider_db_handlersocket_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_handlersocket_util::append_name(
+ spider_string *str,
+ const char *name,
+ uint name_length
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_name");
+ str->q_append(name, name_length);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_name_with_charset(
+ spider_string *str,
+ const char *name,
+ uint name_length,
+ CHARSET_INFO *name_charset
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_name_with_charset");
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->append(name, name_length, name_charset);
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_escaped_name(
+ spider_string *str,
+ const char *name,
+ uint name_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_db_handlersocket_util::append_name");
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str_internal(
+ str, name, name_length, dbton_id)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_escaped_name_with_charset(
+ spider_string *str,
+ const char *name,
+ uint name_length,
+ CHARSET_INFO *name_charset
+) {
+ int error_num;
+ DBUG_ENTER("spider_db_handlersocket_util::append_name_with_charset");
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str_internal(
+ str, name, name_length, name_charset, dbton_id)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ DBUG_RETURN(0);
+}
+
+bool spider_db_handlersocket_util::is_name_quote(
+ const char head_code
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::is_name_quote");
+ DBUG_RETURN(head_code == *name_quote_str);
+}
+
+int spider_db_handlersocket_util::append_escaped_name_quote(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_escaped_name_quote");
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_column_value(
+ ha_spider *spider,
+ spider_string *str,
+ Field *field,
+ const uchar *new_ptr,
+ CHARSET_INFO *access_charset
+) {
+ char buf[MAX_FIELD_WIDTH];
+ spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
+ String *ptr;
+ uint length;
+ DBUG_ENTER("spider_db_handlersocket_util::append_column_value");
+ tmp_str.init_calc_mem(180);
+
+ if (new_ptr)
+ {
+ if (
+ field->type() == MYSQL_TYPE_BLOB ||
+ field->real_type() == MYSQL_TYPE_VARCHAR
+ ) {
+ length = uint2korr(new_ptr);
+ tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
+ &my_charset_bin);
+ ptr = tmp_str.get_str();
+ } else if (field->type() == MYSQL_TYPE_GEOMETRY)
+ {
+/*
+ uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
+ uchar *dest = (uchar *) buf;
+ const uchar *source;
+ for (lcnt = 0; lcnt < 4; lcnt++)
+ {
+ mlength = SIZEOF_STORED_DOUBLE;
+ source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
+ while (mlength--)
+ *dest++ = *--source;
+ }
+ tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
+*/
+ double xmin, xmax, ymin, ymax;
+/*
+ float8store(buf,xmin);
+ float8store(buf+8,xmax);
+ float8store(buf+16,ymin);
+ float8store(buf+24,ymax);
+ memcpy(&xmin,new_ptr,sizeof(xmin));
+ memcpy(&xmax,new_ptr + 8,sizeof(xmax));
+ memcpy(&ymin,new_ptr + 16,sizeof(ymin));
+ memcpy(&ymax,new_ptr + 24,sizeof(ymax));
+ float8get(xmin, buf);
+ float8get(xmax, buf + 8);
+ float8get(ymin, buf + 16);
+ float8get(ymax, buf + 24);
+ DBUG_PRINT("info", ("spider geo is %f %f %f %f",
+ xmin, xmax, ymin, ymax));
+ DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
+ xmin, xmax, ymin, ymax));
+*/
+ float8get(xmin, new_ptr);
+ float8get(xmax, new_ptr + 8);
+ float8get(ymin, new_ptr + 16);
+ float8get(ymax, new_ptr + 24);
+ DBUG_PRINT("info", ("spider geo is %f %f %f %f",
+ xmin, xmax, ymin, ymax));
+/*
+ float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
+ float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
+ float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
+ float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
+ DBUG_PRINT("info", ("spider geo is %f %f %f %f",
+ xmin, xmax, ymin, ymax));
+ float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
+ float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
+ float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
+ float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
+ DBUG_PRINT("info", ("spider geo is %f %f %f %f",
+ xmin, xmax, ymin, ymax));
+ float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
+ float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
+ float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
+ float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
+ DBUG_PRINT("info", ("spider geo is %f %f %f %f",
+ xmin, xmax, ymin, ymax));
+*/
+/*
+ tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
+ &my_charset_bin);
+*/
+ tmp_str.length(0);
+ tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
+ SPIDER_SQL_LINESTRING_HEAD_LEN);
+ tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
+ tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
+ SIZEOF_STORED_DOUBLE);
+ tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
+ SIZEOF_STORED_DOUBLE);
+ tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
+ SIZEOF_STORED_DOUBLE);
+ ptr = tmp_str.get_str();
+ } else {
+ ptr = field->val_str(tmp_str.get_str(), new_ptr);
+ tmp_str.mem_calc();
+ }
+ } else {
+ ptr = field->val_str(tmp_str.get_str());
+ tmp_str.mem_calc();
+ }
+ DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
+ DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
+/*
+ if (
+ field->type() == MYSQL_TYPE_BIT ||
+ (field->type() >= MYSQL_TYPE_TINY_BLOB &&
+ field->type() <= MYSQL_TYPE_BLOB)
+ ) {
+ uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
+ char *str_ptr;
+ DBUG_PRINT("info", ("spider HEX"));
+ if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
+ str_ptr = (char *) str->ptr() + str->length();
+ for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
+ {
+ *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
+ *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
+ }
+ str->length(str->length() + ptr->length() * 2);
+ } else
+*/
+ spider_handlersocket_handler *hs_handler = (spider_handlersocket_handler *)
+ spider->dbton_handler[spider_dbton_handlersocket.dbton_id];
+ spider_string *hs_str;
+ if (!(hs_str = hs_handler->hs_strs.add(
+ &hs_handler->hs_strs_pos, ptr->ptr(), ptr->length())))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ SPIDER_HS_STRING_REF ref =
+ SPIDER_HS_STRING_REF(hs_str->ptr(), hs_str->length());
+ if (hs_handler->hs_adding_keys)
+ {
+ DBUG_PRINT("info", ("spider add to key:%s", hs_str->c_ptr_safe()));
+ hs_handler->hs_keys.push_back(ref);
+ } else {
+ DBUG_PRINT("info", ("spider add to upd:%s", hs_str->c_ptr_safe()));
+ hs_handler->hs_upds.push_back(ref);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_trx_isolation(
+ spider_string *str,
+ int trx_isolation
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_trx_isolation");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_autocommit(
+ spider_string *str,
+ bool autocommit
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_autocommit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_sql_log_off(
+ spider_string *str,
+ bool sql_log_off
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_sql_log_off");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_wait_timeout(
+ spider_string *str,
+ int wait_timeout
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_wait_timeout");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_sql_mode(
+ spider_string *str,
+ sql_mode_t sql_mode
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_sql_mode");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_time_zone(
+ spider_string *str,
+ Time_zone *time_zone
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_time_zone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_start_transaction(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_start_transaction");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_xa_start(
+ spider_string *str,
+ XID *xid
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_xa_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_lock_table_head(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_head");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_lock_table_body(
+ spider_string *str,
+ const char *db_name,
+ uint db_name_length,
+ CHARSET_INFO *db_name_charset,
+ const char *table_name,
+ uint table_name_length,
+ CHARSET_INFO *table_name_charset,
+ int lock_type
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_body");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_lock_table_tail(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_tail");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_unlock_table(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_unlock_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::open_item_func(
+ Item_func *item_func,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ uint dbton_id = spider_dbton_handlersocket.dbton_id;
+ int error_num;
+ Item *item, **item_list = item_func->arguments();
+ uint roop_count, item_count = item_func->argument_count(), start_item = 0;
+ const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
+ *separator_str = SPIDER_SQL_NULL_CHAR_STR,
+ *last_str = SPIDER_SQL_NULL_CHAR_STR;
+ int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
+ separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
+ last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
+ int use_pushdown_udf;
+ bool merge_func = FALSE;
+ DBUG_ENTER("spider_db_handlersocket_util::open_item_func");
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ DBUG_PRINT("info",("spider functype = %d", item_func->functype()));
+ switch (item_func->functype())
+ {
+ case Item_func::ISNULL_FUNC:
+ last_str = SPIDER_SQL_IS_NULL_STR;
+ last_str_length = SPIDER_SQL_IS_NULL_LEN;
+ break;
+ case Item_func::ISNOTNULL_FUNC:
+ last_str = SPIDER_SQL_IS_NOT_NULL_STR;
+ last_str_length = SPIDER_SQL_IS_NOT_NULL_LEN;
+ break;
+ case Item_func::UNKNOWN_FUNC:
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ DBUG_PRINT("info",("spider func_name = %s", func_name));
+ DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
+ if (func_name_length == 1 &&
+ (
+ !strncasecmp("+", func_name, func_name_length) ||
+ !strncasecmp("-", func_name, func_name_length) ||
+ !strncasecmp("*", func_name, func_name_length) ||
+ !strncasecmp("/", func_name, func_name_length) ||
+ !strncasecmp("%", func_name, func_name_length) ||
+ !strncasecmp("&", func_name, func_name_length) ||
+ !strncasecmp("|", func_name, func_name_length) ||
+ !strncasecmp("^", func_name, func_name_length)
+ )
+ ) {
+ /* no action */
+ break;
+ } else if (func_name_length == 2 &&
+ (
+ !strncasecmp("<<", func_name, func_name_length) ||
+ !strncasecmp(">>", func_name, func_name_length)
+ )
+ ) {
+ /* no action */
+ break;
+ } else if (func_name_length == 3 &&
+ !strncasecmp("div", func_name, func_name_length)
+ ) {
+ /* no action */
+ break;
+ } else if (func_name_length == 4)
+ {
+ if (
+ !strncasecmp("rand", func_name, func_name_length) &&
+#ifdef SPIDER_Item_args_arg_count_IS_PROTECTED
+ !item_func->argument_count()
+#else
+ !item_func->arg_count
+#endif
+ ) {
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ } else if (
+ !strncasecmp("case", func_name, func_name_length)
+ ) {
+#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC
+ Item_func_case *item_func_case = (Item_func_case *) item_func;
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_CASE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN);
+ }
+ if (item_func_case->first_expr_num != -1)
+ {
+ if ((error_num = spider_db_print_item_type(
+ item_list[item_func_case->first_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ }
+ for (roop_count = 0; roop_count < item_func_case->ncases;
+ roop_count += 2)
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_WHEN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(
+ item_list[roop_count], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_THEN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(
+ item_list[roop_count + 1], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ }
+ if (item_func_case->else_expr_num != -1)
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_ELSE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(
+ item_list[item_func_case->else_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ }
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ DBUG_RETURN(0);
+#else
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+#endif
+ }
+ } else if (func_name_length == 6 &&
+ !strncasecmp("istrue", func_name, func_name_length)
+ ) {
+ last_str = SPIDER_SQL_IS_TRUE_STR;
+ last_str_length = SPIDER_SQL_IS_TRUE_LEN;
+ break;
+ } else if (func_name_length == 7)
+ {
+ if (!strncasecmp("isfalse", func_name, func_name_length))
+ {
+ last_str = SPIDER_SQL_IS_FALSE_STR;
+ last_str_length = SPIDER_SQL_IS_FALSE_LEN;
+ break;
+ } else if (
+ !strncasecmp("sysdate", func_name, func_name_length) ||
+ !strncasecmp("curdate", func_name, func_name_length) ||
+ !strncasecmp("curtime", func_name, func_name_length)
+ ) {
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ } else if (
+ !strncasecmp("convert", func_name, func_name_length)
+ ) {
+ if (str)
+ {
+ if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
+ SPIDER_SQL_OPEN_PAREN_LEN);
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ }
+ break;
+ }
+ } else if (func_name_length == 8 &&
+ (
+ !strncasecmp("utc_date", func_name, func_name_length) ||
+ !strncasecmp("utc_time", func_name, func_name_length)
+ )
+ ) {
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ } else if (func_name_length == 9 &&
+ !strncasecmp("isnottrue", func_name, func_name_length)
+ ) {
+ last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
+ last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
+ break;
+ } else if (func_name_length == 10)
+ {
+ if (!strncasecmp("isnotfalse", func_name, func_name_length))
+ {
+ last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
+ last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
+ break;
+ } else if (!strncasecmp("column_get", func_name, func_name_length))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ break;
+ }
+ } else if (func_name_length == 12)
+ {
+ if (!strncasecmp("cast_as_date", func_name, func_name_length))
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+ }
+ last_str = SPIDER_SQL_AS_DATE_STR;
+ last_str_length = SPIDER_SQL_AS_DATE_LEN;
+ break;
+ } else if (!strncasecmp("cast_as_time", func_name, func_name_length))
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+ }
+ last_str = SPIDER_SQL_AS_TIME_STR;
+ last_str_length = SPIDER_SQL_AS_TIME_LEN;
+ break;
+ }
+ } else if (func_name_length == 13)
+ {
+ if (!strncasecmp("utc_timestamp", func_name, func_name_length))
+ {
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ } else if (!strncasecmp("timestampdiff", func_name, func_name_length))
+ {
+#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
+ Item_func_timestamp_diff *item_func_timestamp_diff =
+ (Item_func_timestamp_diff *) item_func;
+ if (str)
+ {
+ const char *interval_str;
+ uint interval_len;
+ switch (item_func_timestamp_diff->int_type)
+ {
+ case INTERVAL_YEAR:
+ interval_str = SPIDER_SQL_YEAR_STR;
+ interval_len = SPIDER_SQL_YEAR_LEN;
+ break;
+ case INTERVAL_QUARTER:
+ interval_str = SPIDER_SQL_QUARTER_STR;
+ interval_len = SPIDER_SQL_QUARTER_LEN;
+ break;
+ case INTERVAL_MONTH:
+ interval_str = SPIDER_SQL_MONTH_STR;
+ interval_len = SPIDER_SQL_MONTH_LEN;
+ break;
+ case INTERVAL_WEEK:
+ interval_str = SPIDER_SQL_WEEK_STR;
+ interval_len = SPIDER_SQL_WEEK_LEN;
+ break;
+ case INTERVAL_DAY:
+ interval_str = SPIDER_SQL_DAY_STR;
+ interval_len = SPIDER_SQL_DAY_LEN;
+ break;
+ case INTERVAL_HOUR:
+ interval_str = SPIDER_SQL_HOUR_STR;
+ interval_len = SPIDER_SQL_HOUR_LEN;
+ break;
+ case INTERVAL_MINUTE:
+ interval_str = SPIDER_SQL_MINUTE_STR;
+ interval_len = SPIDER_SQL_MINUTE_LEN;
+ break;
+ case INTERVAL_SECOND:
+ interval_str = SPIDER_SQL_SECOND_STR;
+ interval_len = SPIDER_SQL_SECOND_LEN;
+ break;
+ case INTERVAL_MICROSECOND:
+ interval_str = SPIDER_SQL_MICROSECOND_STR;
+ interval_len = SPIDER_SQL_MICROSECOND_LEN;
+ break;
+ default:
+ interval_str = "";
+ interval_len = 0;
+ break;
+ }
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN +
+ interval_len + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(interval_str, interval_len);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ DBUG_RETURN(0);
+#else
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+#endif
+ }
+ } else if (func_name_length == 14)
+ {
+ if (!strncasecmp("cast_as_binary", func_name, func_name_length))
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
+ spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
+ tmp_str.init_calc_mem(123);
+ tmp_str.length(0);
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+#if MYSQL_VERSION_ID < 50500
+ item_func->print(tmp_str.get_str(), QT_IS);
+#else
+ item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
+#endif
+ tmp_str.mem_calc();
+ if (tmp_str.reserve(1))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ tmp_ptr = tmp_str.c_ptr_quick();
+ DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
+ while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR)))
+ tmp_ptr = tmp_ptr2 + 1;
+ last_str = tmp_ptr - 1;
+ last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
+ }
+ break;
+ } else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+ }
+ last_str = SPIDER_SQL_AS_SIGNED_STR;
+ last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
+ break;
+ }
+ } else if (func_name_length == 16)
+ {
+ if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+ }
+ last_str = SPIDER_SQL_AS_UNSIGNED_STR;
+ last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
+ break;
+ } else if (!strncasecmp("decimal_typecast", func_name,
+ func_name_length))
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
+ spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
+ tmp_str.init_calc_mem(124);
+ tmp_str.length(0);
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+#if MYSQL_VERSION_ID < 50500
+ item_func->print(tmp_str.get_str(), QT_IS);
+#else
+ item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
+#endif
+ tmp_str.mem_calc();
+ if (tmp_str.reserve(1))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ tmp_ptr = tmp_str.c_ptr_quick();
+ DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
+ while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR)))
+ tmp_ptr = tmp_ptr2 + 1;
+ last_str = tmp_ptr - 1;
+ last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
+ }
+ break;
+ } else if (!strncasecmp("cast_as_datetime", func_name,
+ func_name_length))
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+ }
+ last_str = SPIDER_SQL_AS_DATETIME_STR;
+ last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
+ break;
+ }
+ } else if (func_name_length == 17)
+ {
+ if (!strncasecmp("date_add_interval", func_name, func_name_length))
+ {
+ Item_date_add_interval *item_date_add_interval =
+ (Item_date_add_interval *) item_func;
+ func_name = spider_db_timefunc_interval_str[
+ item_date_add_interval->int_type];
+ func_name_length = strlen(func_name);
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (item_date_add_interval->date_sub_interval)
+ {
+ if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_NEGINTERVAL_STR,
+ SPIDER_SQL_NEGINTERVAL_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_INTERVAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
+ }
+ }
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ DBUG_RETURN(0);
+ }
+ }
+ if (str)
+ {
+ if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ break;
+ case Item_func::NOW_FUNC:
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ case Item_func::CHAR_TYPECAST_FUNC:
+ DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
+ {
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
+ if (str)
+ {
+ char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
+ spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
+ tmp_str.init_calc_mem(125);
+ tmp_str.length(0);
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
+#if MYSQL_VERSION_ID < 50500
+ item_func->print(tmp_str.get_str(), QT_IS);
+#else
+ item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
+#endif
+ tmp_str.mem_calc();
+ if (tmp_str.reserve(1))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ tmp_ptr = tmp_str.c_ptr_quick();
+ DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
+ while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR)))
+ tmp_ptr = tmp_ptr2 + 1;
+ last_str = tmp_ptr - 1;
+ last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
+ }
+ }
+ break;
+ case Item_func::NOT_FUNC:
+ DBUG_PRINT("info",("spider NOT_FUNC"));
+ if (item_list[0]->type() == Item::COND_ITEM)
+ {
+ DBUG_PRINT("info",("spider item_list[0] is COND_ITEM"));
+ Item_cond *item_cond = (Item_cond *) item_list[0];
+ if (item_cond->functype() == Item_func::COND_AND_FUNC)
+ {
+ DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC"));
+ List_iterator_fast<Item> lif(*(item_cond->argument_list()));
+ bool has_expr_cache_item = FALSE;
+ bool has_isnotnull_func = FALSE;
+ bool has_other_item = FALSE;
+ while((item = lif++))
+ {
+#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
+ if (
+ item->type() == Item::EXPR_CACHE_ITEM
+ ) {
+ DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
+ has_expr_cache_item = TRUE;
+ } else
+#endif
+ if (
+ item->type() == Item::FUNC_ITEM &&
+ ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
+ ) {
+ DBUG_PRINT("info",("spider ISNOTNULL_FUNC"));
+ has_isnotnull_func = TRUE;
+ } else {
+ DBUG_PRINT("info",("spider has other item"));
+ DBUG_PRINT("info",("spider COND type=%d", item->type()));
+ has_other_item = TRUE;
+ }
+ }
+ if (has_expr_cache_item && has_isnotnull_func && !has_other_item)
+ {
+ DBUG_PRINT("info",("spider NOT EXISTS skip"));
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ }
+ }
+ }
+ if (str)
+ {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ }
+ break;
+ case Item_func::NEG_FUNC:
+ if (str)
+ {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ }
+ break;
+ case Item_func::IN_FUNC:
+ if (((Item_func_opt_neg *) item_func)->negated)
+ {
+ func_name = SPIDER_SQL_NOT_IN_STR;
+ func_name_length = SPIDER_SQL_NOT_IN_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ } else {
+ func_name = SPIDER_SQL_IN_STR;
+ func_name_length = SPIDER_SQL_IN_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ }
+ break;
+ case Item_func::BETWEEN:
+ if (((Item_func_opt_neg *) item_func)->negated)
+ {
+ func_name = SPIDER_SQL_NOT_BETWEEN_STR;
+ func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
+ } else {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
+ }
+ break;
+ case Item_func::UDF_FUNC:
+ use_pushdown_udf = spider_param_use_pushdown_udf(spider->trx->thd,
+ spider->share->use_pushdown_udf);
+ if (!use_pushdown_udf)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ if (str)
+ {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ DBUG_PRINT("info",("spider func_name = %s", func_name));
+ DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
+ if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ break;
+#ifdef MARIADB_BASE_VERSION
+ case Item_func::XOR_FUNC:
+#else
+ case Item_func::COND_XOR_FUNC:
+#endif
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(
+ spider_db_open_item_cond((Item_cond *) item_func, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ case Item_func::TRIG_COND_FUNC:
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ case Item_func::GUSERVAR_FUNC:
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (item_func->result_type() == STRING_RESULT)
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ else
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ case Item_func::FT_FUNC:
+ if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ start_item = 1;
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_MATCH_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
+ }
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ break;
+ case Item_func::SP_EQUALS_FUNC:
+ if (str)
+ {
+ func_name = SPIDER_SQL_MBR_EQUAL_STR;
+ func_name_length = SPIDER_SQL_MBR_EQUAL_LEN;
+ DBUG_PRINT("info",("spider func_name = %s", func_name));
+ DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
+ if (str->reserve(func_name_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ break;
+ case Item_func::SP_DISJOINT_FUNC:
+ case Item_func::SP_INTERSECTS_FUNC:
+ case Item_func::SP_TOUCHES_FUNC:
+ case Item_func::SP_CROSSES_FUNC:
+ case Item_func::SP_WITHIN_FUNC:
+ case Item_func::SP_CONTAINS_FUNC:
+ case Item_func::SP_OVERLAPS_FUNC:
+ if (str)
+ {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ DBUG_PRINT("info",("spider func_name = %s", func_name));
+ DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
+ if (str->reserve(
+#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
+ SPIDER_SQL_MBR_LEN +
+#endif
+ func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
+ str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
+#endif
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ last_str = SPIDER_SQL_CLOSE_PAREN_STR;
+ last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
+ break;
+ case Item_func::EQ_FUNC:
+ case Item_func::EQUAL_FUNC:
+ case Item_func::NE_FUNC:
+ case Item_func::LT_FUNC:
+ case Item_func::LE_FUNC:
+ case Item_func::GE_FUNC:
+ case Item_func::GT_FUNC:
+ case Item_func::LIKE_FUNC:
+ if (str)
+ {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ }
+ break;
+ default:
+ THD *thd = spider->trx->thd;
+ SPIDER_SHARE *share = spider->share;
+ if (spider_param_skip_default_condition(thd,
+ share->skip_default_condition))
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ if (str)
+ {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ }
+ break;
+ }
+ DBUG_PRINT("info",("spider func_name = %s", func_name));
+ DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
+ DBUG_PRINT("info",("spider separator_str = %s", separator_str));
+ DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
+ DBUG_PRINT("info",("spider last_str = %s", last_str));
+ DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
+ if (item_count)
+ {
+ item_count--;
+ for (roop_count = start_item; roop_count < item_count; roop_count++)
+ {
+ item = item_list[roop_count];
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (roop_count == 1)
+ {
+ func_name = separator_str;
+ func_name_length = separator_str_length;
+ }
+ if (str)
+ {
+ if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ }
+ }
+ item = item_list[roop_count];
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ }
+ if (item_func->functype() == Item_func::FT_FUNC)
+ {
+ Item_func_match *item_func_match = (Item_func_match *)item_func;
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_AGAINST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
+ }
+ item = item_list[0];
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(
+ ((item_func_match->flags & FT_BOOL) ?
+ SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
+ ((item_func_match->flags & FT_EXPAND) ?
+ SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
+ ))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (item_func_match->flags & FT_BOOL)
+ str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
+ SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
+ if (item_func_match->flags & FT_EXPAND)
+ str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
+ SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
+ }
+ } else if (item_func->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ if (
+ func_name_length == 7 &&
+ !strncasecmp("convert", func_name, func_name_length)
+ ) {
+ if (str)
+ {
+ Item_func_conv_charset *item_func_conv_charset =
+ (Item_func_conv_charset *)item_func;
+ CHARSET_INFO *conv_charset =
+ item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
+ uint cset_length = strlen(conv_charset->csname);
+ if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
+ str->q_append(conv_charset->csname, cset_length);
+ }
+ }
+ }
+ if (str)
+ {
+ if (merge_func)
+ str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
+ if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(last_str, last_str_length);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_db_handlersocket_util::open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ uint dbton_id = spider_dbton_handlersocket.dbton_id;
+ uint roop_count, item_count = item_sum->get_arg_count();
+ int error_num;
+ DBUG_ENTER("spider_db_handlersocket_util::open_item_sum_func");
+ DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
+ switch (item_sum->sum_func())
+ {
+ case Item_sum::COUNT_FUNC:
+ case Item_sum::SUM_FUNC:
+ case Item_sum::MIN_FUNC:
+ case Item_sum::MAX_FUNC:
+ {
+ const char *func_name = item_sum->func_name();
+ uint func_name_length = strlen(func_name);
+ Item *item, **args = item_sum->get_args();
+ if (str)
+ {
+ if (str->reserve(func_name_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ }
+ if (item_count)
+ {
+ item_count--;
+ for (roop_count = 0; roop_count < item_count; roop_count++)
+ {
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ }
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ }
+ break;
+ case Item_sum::COUNT_DISTINCT_FUNC:
+ case Item_sum::SUM_DISTINCT_FUNC:
+ case Item_sum::AVG_FUNC:
+ case Item_sum::AVG_DISTINCT_FUNC:
+ case Item_sum::STD_FUNC:
+ case Item_sum::VARIANCE_FUNC:
+ case Item_sum::SUM_BIT_FUNC:
+ case Item_sum::UDF_SUM_FUNC:
+ case Item_sum::GROUP_CONCAT_FUNC:
+ default:
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_db_handlersocket_util::append_escaped_util(
+ spider_string *to,
+ String *from
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_escaped_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ to->append_escape_string(from->ptr(), from->length());
+ DBUG_RETURN(0);
+}
+
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_db_handlersocket_util::append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_from_and_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::reappend_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_where(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_where");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_having(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_having");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
+spider_handlersocket_share::spider_handlersocket_share(
+ st_spider_share *share
+) : spider_db_share(
+ share,
+ spider_dbton_handlersocket.dbton_id
+),
+ table_names_str(NULL),
+ db_names_str(NULL),
+ db_table_str(NULL),
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ db_table_str_hash_value(NULL),
+#endif
+ table_nm_max_length(0),
+ db_nm_max_length(0),
+ column_name_str(NULL),
+ same_db_table_name(TRUE),
+ first_all_link_idx(-1)
+{
+ DBUG_ENTER("spider_handlersocket_share::spider_handlersocket_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_alloc_calc_mem_init(mem_calc, 186);
+ spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+spider_handlersocket_share::~spider_handlersocket_share()
+{
+ DBUG_ENTER("spider_handlersocket_share::~spider_handlersocket_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ free_column_name_str();
+ free_table_names_str();
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if (db_table_str_hash_value)
+ {
+ spider_free(spider_current_trx, db_table_str_hash_value, MYF(0));
+ }
+#endif
+ spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_handlersocket_share::init()
+{
+ int error_num;
+ DBUG_ENTER("spider_handlersocket_share::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if (!(db_table_str_hash_value = (my_hash_value_type *)
+ spider_bulk_alloc_mem(spider_current_trx, 203,
+ __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
+ &db_table_str_hash_value,
+ sizeof(my_hash_value_type) * spider_share->all_link_count,
+ NullS))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+#endif
+
+ if (
+ (error_num = create_table_names_str()) ||
+ (
+ spider_share->table_share &&
+ (error_num = create_column_name_str())
+ )
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_share::append_table_name(
+ spider_string *str,
+ int all_link_idx
+) {
+ const char *db_nm = db_names_str[all_link_idx].ptr();
+ uint db_nm_len = db_names_str[all_link_idx].length();
+ const char *table_nm = table_names_str[all_link_idx].ptr();
+ uint table_nm_len = table_names_str[all_link_idx].length();
+ DBUG_ENTER("spider_handlersocket_share::append_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(db_nm_len + SPIDER_SQL_DOT_LEN + table_nm_len +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ spider_db_handlersocket_utility.append_name(str, db_nm, db_nm_len);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+ spider_db_handlersocket_utility.append_name(str, table_nm, table_nm_len);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_share::create_table_names_str()
+{
+ int error_num, roop_count;
+ uint table_nm_len, db_nm_len;
+ spider_string *str, *first_tbl_nm_str, *first_db_nm_str, *first_db_tbl_str;
+ char *first_tbl_nm, *first_db_nm;
+ uint dbton_id = spider_dbton_handlersocket.dbton_id;
+ DBUG_ENTER("spider_handlersocket_share::create_table_names_str");
+ table_names_str = NULL;
+ db_names_str = NULL;
+ db_table_str = NULL;
+ if (
+ !(table_names_str = new spider_string[spider_share->all_link_count]) ||
+ !(db_names_str = new spider_string[spider_share->all_link_count]) ||
+ !(db_table_str = new spider_string[spider_share->all_link_count])
+ ) {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error;
+ }
+
+ same_db_table_name = TRUE;
+ first_tbl_nm = spider_share->tgt_table_names[0];
+ first_db_nm = spider_share->tgt_dbs[0];
+ table_nm_len = spider_share->tgt_table_names_lengths[0];
+ db_nm_len = spider_share->tgt_dbs_lengths[0];
+ first_tbl_nm_str = &table_names_str[0];
+ first_db_nm_str = &db_names_str[0];
+ first_db_tbl_str = &db_table_str[0];
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ table_names_str[roop_count].init_calc_mem(86);
+ db_names_str[roop_count].init_calc_mem(87);
+ db_table_str[roop_count].init_calc_mem(88);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+ if (first_all_link_idx == -1)
+ first_all_link_idx = roop_count;
+
+ str = &table_names_str[roop_count];
+ if (
+ roop_count != 0 &&
+ same_db_table_name &&
+ spider_share->tgt_table_names_lengths[roop_count] == table_nm_len &&
+ !memcmp(first_tbl_nm, spider_share->tgt_table_names[roop_count],
+ table_nm_len)
+ ) {
+ if (str->copy(*first_tbl_nm_str))
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error;
+ }
+ } else {
+ str->set_charset(spider_share->access_charset);
+ if ((error_num = spider_db_append_name_with_quote_str(str,
+ spider_share->tgt_table_names[roop_count], dbton_id)))
+ goto error;
+ if (roop_count)
+ {
+ same_db_table_name = FALSE;
+ DBUG_PRINT("info", ("spider found different table name %s",
+ spider_share->tgt_table_names[roop_count]));
+ if (str->length() > table_nm_max_length)
+ table_nm_max_length = str->length();
+ } else
+ table_nm_max_length = str->length();
+ }
+
+ str = &db_names_str[roop_count];
+ if (
+ roop_count != 0 &&
+ same_db_table_name &&
+ spider_share->tgt_dbs_lengths[roop_count] == db_nm_len &&
+ !memcmp(first_db_nm, spider_share->tgt_dbs[roop_count],
+ db_nm_len)
+ ) {
+ if (str->copy(*first_db_nm_str))
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error;
+ }
+ } else {
+ str->set_charset(spider_share->access_charset);
+ if ((error_num = spider_db_append_name_with_quote_str(str,
+ spider_share->tgt_dbs[roop_count], dbton_id)))
+ goto error;
+ if (roop_count)
+ {
+ same_db_table_name = FALSE;
+ DBUG_PRINT("info", ("spider found different db name %s",
+ spider_share->tgt_dbs[roop_count]));
+ if (str->length() > db_nm_max_length)
+ db_nm_max_length = str->length();
+ } else
+ db_nm_max_length = str->length();
+ }
+
+ str = &db_table_str[roop_count];
+ if (
+ roop_count != 0 &&
+ same_db_table_name
+ ) {
+ if (str->copy(*first_db_tbl_str))
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error;
+ }
+ } else {
+ str->set_charset(spider_share->access_charset);
+ if ((error_num = append_table_name(str, roop_count)))
+ goto error;
+ }
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ db_table_str_hash_value[roop_count] = my_calc_hash(
+ &spider_open_connections, (uchar*) str->ptr(), str->length());
+#endif
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (db_table_str)
+ {
+ delete [] db_table_str;
+ db_table_str = NULL;
+ }
+ if (db_names_str)
+ {
+ delete [] db_names_str;
+ db_names_str = NULL;
+ }
+ if (table_names_str)
+ {
+ delete [] table_names_str;
+ table_names_str = NULL;
+ }
+ DBUG_RETURN(error_num);
+}
+
+void spider_handlersocket_share::free_table_names_str()
+{
+ DBUG_ENTER("spider_handlersocket_share::free_table_names_str");
+ if (db_table_str)
+ {
+ delete [] db_table_str;
+ db_table_str = NULL;
+ }
+ if (db_names_str)
+ {
+ delete [] db_names_str;
+ db_names_str = NULL;
+ }
+ if (table_names_str)
+ {
+ delete [] table_names_str;
+ table_names_str = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_handlersocket_share::create_column_name_str()
+{
+ spider_string *str;
+ int error_num;
+ Field **field;
+ TABLE_SHARE *table_share = spider_share->table_share;
+ uint dbton_id = spider_dbton_handlersocket.dbton_id;
+ DBUG_ENTER("spider_handlersocket_share::create_column_name_str");
+ if (
+ table_share->fields &&
+ !(column_name_str = new spider_string[table_share->fields])
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ for (field = table_share->field, str = column_name_str;
+ *field; field++, str++)
+ {
+ str->init_calc_mem(202);
+ str->set_charset(spider_share->access_charset);
+ if ((error_num = spider_db_append_name_with_quote_str(str,
+ (*field)->field_name, dbton_id)))
+ goto error;
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (column_name_str)
+ {
+ delete [] column_name_str;
+ column_name_str = NULL;
+ }
+ DBUG_RETURN(error_num);
+}
+
+void spider_handlersocket_share::free_column_name_str()
+{
+ DBUG_ENTER("spider_handlersocket_share::free_column_name_str");
+ if (column_name_str)
+ {
+ delete [] column_name_str;
+ column_name_str = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+uint spider_handlersocket_share::get_column_name_length(
+ uint field_index
+) {
+ DBUG_ENTER("spider_handlersocket_share::get_column_name_length");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(column_name_str[field_index].length());
+}
+
+int spider_handlersocket_share::append_column_name(
+ spider_string *str,
+ uint field_index
+) {
+ int error_num;
+ DBUG_ENTER("spider_handlersocket_share::append_column_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = spider_db_handlersocket_utility.append_name(str,
+ column_name_str[field_index].ptr(), column_name_str[field_index].length());
+ DBUG_RETURN(error_num);
+}
+
+int spider_handlersocket_share::append_column_name_with_alias(
+ spider_string *str,
+ uint field_index,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_handlersocket_share::append_column_name_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(
+ alias_length +
+ column_name_str[field_index].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ append_column_name(str, field_index);
+ DBUG_RETURN(0);
+}
+
+bool spider_handlersocket_share::need_change_db_table_name()
+{
+ DBUG_ENTER("spider_handlersocket_share::need_change_db_table_name");
+ DBUG_RETURN(!same_db_table_name);
+}
+
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+int spider_handlersocket_share::discover_table_structure(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *spider_share,
+ spider_string *str
+) {
+ DBUG_ENTER("spider_handlersocket_share::discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+#endif
+
+spider_handlersocket_handler::spider_handlersocket_handler(
+ ha_spider *spider,
+ spider_handlersocket_share *db_share
+) : spider_db_handler(
+ spider,
+ db_share
+),
+ handlersocket_share(db_share),
+ link_for_hash(NULL)
+{
+ DBUG_ENTER("spider_handlersocket_handler::spider_handlersocket_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_alloc_calc_mem_init(mem_calc, 187);
+ spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+spider_handlersocket_handler::~spider_handlersocket_handler()
+{
+ DBUG_ENTER("spider_handlersocket_handler::~spider_handlersocket_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (link_for_hash)
+ {
+ spider_free(spider_current_trx, link_for_hash, MYF(0));
+ }
+ spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_handlersocket_handler::init()
+{
+ st_spider_share *share = spider->share;
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_handlersocket_handler::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
+ spider_bulk_alloc_mem(spider_current_trx, 204,
+ __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
+ &link_for_hash,
+ sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
+ &minimum_select_bitmap,
+ table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0,
+ NullS))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ uint roop_count;
+ for (roop_count = 0; roop_count < share->link_count; roop_count++)
+ {
+ link_for_hash[roop_count].spider = spider;
+ link_for_hash[roop_count].link_idx = roop_count;
+ link_for_hash[roop_count].db_table_str =
+ &handlersocket_share->db_table_str[roop_count];
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ link_for_hash[roop_count].db_table_str_hash_value =
+ handlersocket_share->db_table_str_hash_value[roop_count];
+#endif
+ }
+ hs_sql.init_calc_mem(63);
+ hs_sql.set_charset(share->access_charset);
+ hs_keys.init();
+ hs_upds.init();
+ hs_strs.init();
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ )
+{
+ DBUG_ENTER("spider_handlersocket_handler::append_index_hint");
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_table_name_with_adjusting(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_table_name_with_adjusting");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_tmp_table_and_sql_for_bka(
+ const key_range *start_key
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_tmp_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reuse_tmp_table_and_sql_for_bka()
+{
+ DBUG_ENTER("spider_handlersocket_handler::reuse_tmp_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_union_table_and_sql_for_bka(
+ const key_range *start_key
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_union_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reuse_union_table_and_sql_for_bka()
+{
+ DBUG_ENTER("spider_handlersocket_handler::reuse_union_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_insert_for_recovery(
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_insert_for_recovery");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_insert_part()
+{
+ DBUG_ENTER("spider_handlersocket_handler::append_insert_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_update_part()
+{
+ DBUG_ENTER("spider_handlersocket_handler::append_update_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_delete_part()
+{
+ DBUG_ENTER("spider_handlersocket_handler::append_delete_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+int spider_handlersocket_handler::append_increment_update_set_part()
+{
+ DBUG_ENTER("spider_handlersocket_handler::append_increment_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_handlersocket_handler::append_update_set_part()
+{
+ DBUG_ENTER("spider_handlersocket_handler::append_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+int spider_handlersocket_handler::append_direct_update_set_part()
+{
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_handlersocket_handler::append_direct_update_set_part");
+ if (
+ spider->do_direct_update &&
+ (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
+ ) {
+ DBUG_PRINT("info",("spider add set for DU SPIDER_SQL_KIND_HS"));
+ size_t roop_count;
+ Field *field;
+ hs_adding_keys = FALSE;
+ for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
+ roop_count++)
+ {
+ Field *top_table_field =
+ spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
+ if (!(field = spider->field_exchange(top_table_field)))
+ continue;
+ if (top_table_field->is_null())
+ {
+ hs_upds.push_back(spider_null_string_ref);
+ } else {
+ if (spider_db_handlersocket_utility.
+ append_column_value(spider, NULL, top_table_field, NULL,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ }
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_handlersocket_handler::append_minimum_select_without_quote(
+ spider_string *str
+) {
+ TABLE *table = spider->get_table();
+ Field **field;
+ int field_length;
+ bool appended = FALSE;
+ DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_without_quote");
+ minimum_select_bitmap_create();
+ for (field = table->field; *field; field++)
+ {
+ if (minimum_select_bit_is_set((*field)->field_index))
+ {
+/*
+ spider_set_bit(minimum_select_bitmap, (*field)->field_index);
+*/
+ field_length =
+ handlersocket_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(field_length + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(
+ handlersocket_share->column_name_str[(*field)->field_index].ptr(),
+ handlersocket_share->column_name_str[(*field)->field_index].length());
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ appended = TRUE;
+ }
+ }
+ if (appended)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+int spider_handlersocket_handler::append_minimum_select_by_field_idx_list(
+ spider_string *str,
+ uint32 *field_idxs,
+ size_t field_idxs_num
+) {
+ Field *field;
+ int roop_count, field_length;
+ bool appended = FALSE;
+ DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_by_field_idx_list");
+ for (roop_count = 0; roop_count < (int) field_idxs_num; roop_count++)
+ {
+ field = spider->get_top_table_field(field_idxs[roop_count]);
+ if ((field = spider->field_exchange(field)))
+ {
+ field_length =
+ handlersocket_share->column_name_str[field->field_index].length();
+ if (str->reserve(field_length + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(
+ handlersocket_share->column_name_str[field->field_index].ptr(),
+ handlersocket_share->column_name_str[field->field_index].length());
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ appended = TRUE;
+ }
+ }
+ if (appended)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_dup_update_pushdown_part(
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_dup_update_pushdown_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_update_columns_part(
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_update_columns_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::check_update_columns_part()
+{
+ DBUG_ENTER("spider_handlersocket_handler::check_update_columns_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_handlersocket_handler::append_select_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_table_select_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_table_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_key_select_part(
+ ulong sql_type,
+ uint idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_key_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_minimum_select_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_hint_after_table_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_hint_after_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+void spider_handlersocket_handler::set_where_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_where_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+void spider_handlersocket_handler::set_where_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_where_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+int spider_handlersocket_handler::check_item_type(
+ Item *item
+) {
+ DBUG_ENTER("spider_handlersocket_handler::check_item_type");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_values_connector_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_values_connector_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_values_terminator_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_values_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_union_table_connector_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_union_table_connector_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_union_table_terminator_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_union_table_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_key_column_values_part(
+ const key_range *start_key,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_key_column_values_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_key_column_values_with_name_part(
+ const key_range *start_key,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_key_column_values_with_name_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_key_where_part(
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ bool set_order;
+ DBUG_ENTER("spider_handlersocket_handler::append_key_where_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_HS:
+ case SPIDER_SQL_TYPE_INSERT_HS:
+ case SPIDER_SQL_TYPE_UPDATE_HS:
+ case SPIDER_SQL_TYPE_DELETE_HS:
+ str = &hs_sql;
+ str->length(0);
+ hs_adding_keys = TRUE;
+ set_order = FALSE;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_where(str, NULL, NULL, start_key, end_key,
+ sql_type, set_order);
+ DBUG_RETURN(error_num);
+}
+
+int spider_handlersocket_handler::append_key_where(
+ spider_string *str,
+ spider_string *str_part,
+ spider_string *str_part2,
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type,
+ bool set_order
+) {
+ int error_num;
+ DBUG_ENTER("spider_handlersocket_handler::append_key_where");
+ error_num = spider_db_append_key_where_internal(str, str_part, str_part2,
+ start_key, end_key, spider, set_order, sql_type,
+ spider_dbton_handlersocket.dbton_id);
+ DBUG_RETURN(error_num);
+}
+
+int spider_handlersocket_handler::append_is_null_part(
+ ulong sql_type,
+ KEY_PART_INFO *key_part,
+ const key_range *key,
+ const uchar **ptr,
+ bool key_eq,
+ bool tgt_final
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_handlersocket_handler::append_is_null_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_HS:
+ case SPIDER_SQL_TYPE_INSERT_HS:
+ case SPIDER_SQL_TYPE_UPDATE_HS:
+ case SPIDER_SQL_TYPE_DELETE_HS:
+ str = &hs_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_is_null(sql_type, str, NULL, NULL, key_part, key, ptr,
+ key_eq, tgt_final);
+ DBUG_RETURN(error_num);
+}
+
+int spider_handlersocket_handler::append_is_null(
+ ulong sql_type,
+ spider_string *str,
+ spider_string *str_part,
+ spider_string *str_part2,
+ KEY_PART_INFO *key_part,
+ const key_range *key,
+ const uchar **ptr,
+ bool key_eq,
+ bool tgt_final
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_is_null");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (key_part->null_bit)
+ {
+ if (*(*ptr)++)
+ {
+ hs_keys.push_back(spider_null_string_ref);
+ DBUG_RETURN(-1);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_where_terminator_part(
+ ulong sql_type,
+ bool set_order,
+ int key_count
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_where_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_match_where_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_match_where_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_condition_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type,
+ bool test_flg
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_condition_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_match_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_match_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_handlersocket_handler::append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_sum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
+void spider_handlersocket_handler::set_order_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_order_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+void spider_handlersocket_handler::set_order_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_order_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_handlersocket_handler::append_group_by_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_group_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_handlersocket_handler::append_key_order_for_merge_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_key_order_for_merge_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_key_order_for_direct_order_limit_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_key_order_for_direct_order_limit_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_key_order_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_key_order_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_limit_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info", ("spider offset=%lld", offset));
+ DBUG_PRINT("info", ("spider limit=%lld", limit));
+ hs_skip = (int) offset;
+ hs_limit = (int) limit;
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reappend_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reappend_limit_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_select_lock_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_select_lock_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_union_all_start_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_union_all_start_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_union_all_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_union_all_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_union_all_end_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_union_all_end_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_multi_range_cnt_part(
+ ulong sql_type,
+ uint multi_range_cnt,
+ bool with_comma
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_multi_range_cnt_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_multi_range_cnt_with_name_part(
+ ulong sql_type,
+ uint multi_range_cnt
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_multi_range_cnt_with_name_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_open_handler_part(
+ ulong sql_type,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_handlersocket_handler::append_open_handler_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_HS:
+ str = &hs_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_open_handler(str, handler_id, conn, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_handlersocket_handler::append_open_handler(
+ spider_string *str,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_handlersocket_handler::append_open_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ str->length() == 0 &&
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ (
+ (
+ (
+ spider->sql_command == SQLCOM_HS_INSERT ||
+ spider->hs_pushed_ret_fields_num == MAX_FIELDS
+ ) &&
+#endif
+ (error_num = append_minimum_select_without_quote(str))
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ ) ||
+ (
+ (
+ spider->sql_command != SQLCOM_HS_INSERT &&
+ spider->hs_pushed_ret_fields_num < MAX_FIELDS
+ ) &&
+ (error_num = append_minimum_select_by_field_idx_list(str,
+ spider->hs_pushed_ret_fields, spider->hs_pushed_ret_fields_num))
+ )
+ )
+#endif
+ ) {
+ DBUG_RETURN(error_num);
+ }
+
+ TABLE *table = spider->get_table();
+ SPIDER_SHARE *share = spider->share;
+ DBUG_PRINT("info",("spider field list=%s", str->c_ptr_safe()));
+ if (!spider_bit_is_set(spider->db_request_phase, link_idx))
+ {
+ spider_set_bit(spider->db_request_phase, link_idx);
+ ++spider->db_request_id[link_idx];
+ }
+ st_spider_db_request_key request_key;
+ request_key.spider_thread_id = spider->trx->spider_thread_id;
+ request_key.query_id = spider->trx->thd->query_id;
+ request_key.handler = spider;
+ request_key.request_id = spider->db_request_id[link_idx];
+ request_key.next = NULL;
+ conn->db_conn->append_open_handler(
+ handler_id,
+ share->tgt_dbs[spider->conn_link_idx[link_idx]],
+ share->tgt_table_names[spider->conn_link_idx[link_idx]],
+ spider->active_index < MAX_KEY ?
+ table->key_info[spider->active_index].name :
+ "0",
+ str->c_ptr_safe(),
+ &request_key
+ );
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_close_handler_part(
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_close_handler_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_insert_terminator_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_insert_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_insert_values_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_insert_values_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_HS:
+ str = &hs_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_insert_values(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_handlersocket_handler::append_insert_values(
+ spider_string *str
+) {
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ Field **field;
+ DBUG_ENTER("spider_mysql_handler::append_insert_values");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_adding_keys = FALSE;
+ for (field = table->field; *field; field++)
+ {
+ DBUG_PRINT("info",("spider field_index=%u", (*field)->field_index));
+ if (
+ bitmap_is_set(table->write_set, (*field)->field_index) ||
+ bitmap_is_set(table->read_set, (*field)->field_index)
+ ) {
+#ifndef DBUG_OFF
+ my_bitmap_map *tmp_map =
+ dbug_tmp_use_all_columns(table, table->read_set);
+#endif
+ DBUG_PRINT("info",("spider is_null()=%s",
+ (*field)->is_null() ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider table->next_number_field=%p",
+ table->next_number_field));
+ DBUG_PRINT("info",("spider *field=%p", *field));
+ DBUG_PRINT("info",("spider force_auto_increment=%s",
+ (table->next_number_field && spider->force_auto_increment) ?
+ "TRUE" : "FALSE"));
+ if (
+ (*field)->is_null() ||
+ (
+ table->next_number_field == *field &&
+ !table->auto_increment_field_not_null &&
+ !spider->force_auto_increment
+ )
+ ) {
+ hs_upds.push_back(spider_null_string_ref);
+ } else {
+ spider_db_handlersocket_utility.
+ append_column_value(spider, NULL, *field, NULL,
+ share->access_charset);
+ }
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ }
+ }
+ int error_num;
+ int roop_count2;
+ for (
+ roop_count2 = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY);
+ roop_count2 < (int) share->link_count;
+ roop_count2 = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count2, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY)
+ ) {
+ if (spider->sql_kind[roop_count2] == SPIDER_SQL_KIND_HS)
+ {
+ SPIDER_CONN *conn = spider->hs_w_conns[roop_count2];
+ if (conn->dbton_id == spider_dbton_handlersocket.dbton_id)
+ {
+ if ((error_num = request_buf_insert(roop_count2)))
+ DBUG_RETURN(error_num);
+#ifdef HA_CAN_BULK_ACCESS
+ if (spider->is_bulk_access_clone)
+ {
+ spider->connection_ids[roop_count2] = conn->connection_id;
+ spider_trx_add_bulk_access_conn(spider->trx, conn);
+ }
+#endif
+ }
+ }
+ }
+ hs_upds.clear();
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_into_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_into_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+void spider_handlersocket_handler::set_insert_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_insert_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+int spider_handlersocket_handler::append_from_part(
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_from_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_delete_all_rows_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_delete_all_rows_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_explain_select_part(
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_explain_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::is_sole_projection_field(
+ uint16 field_index
+) {
+ DBUG_ENTER("spider_handlersocket_handler::is_sole_projection_field");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+bool spider_handlersocket_handler::is_bulk_insert_exec_period(
+ bool bulk_end
+) {
+ DBUG_ENTER("spider_handlersocket_handler::is_bulk_insert_exec_period");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!spider->bulk_insert || bulk_end)
+ DBUG_RETURN(TRUE);
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_handlersocket_handler::sql_is_filled_up(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::sql_is_filled_up");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_handlersocket_handler::sql_is_empty(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::sql_is_empty");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_handlersocket_handler::support_multi_split_read()
+{
+ DBUG_ENTER("spider_handlersocket_handler::support_multi_split_read");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_handlersocket_handler::support_bulk_update()
+{
+ DBUG_ENTER("spider_handlersocket_handler::support_bulk_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(FALSE);
+}
+
+int spider_handlersocket_handler::bulk_tmp_table_insert()
+{
+ DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::bulk_tmp_table_insert(
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::bulk_tmp_table_end_bulk_insert()
+{
+ DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_end_bulk_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::bulk_tmp_table_rnd_init()
+{
+ DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::bulk_tmp_table_rnd_next()
+{
+ DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_next");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::bulk_tmp_table_rnd_end()
+{
+ DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+bool spider_handlersocket_handler::need_copy_for_update(
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::need_copy_for_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(TRUE);
+}
+
+bool spider_handlersocket_handler::bulk_tmp_table_created()
+{
+ DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_created");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(FALSE);
+}
+
+int spider_handlersocket_handler::mk_bulk_tmp_table_and_bulk_start()
+{
+ DBUG_ENTER("spider_handlersocket_handler::mk_bulk_tmp_table_and_bulk_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+void spider_handlersocket_handler::rm_bulk_tmp_table()
+{
+ DBUG_ENTER("spider_handlersocket_handler::rm_bulk_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+
+int spider_handlersocket_handler::insert_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::insert_lock_tables_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx,
+ int *appended
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_lock_tables_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::realloc_sql(
+ ulong *realloced
+) {
+ THD *thd = spider->trx->thd;
+ st_spider_share *share = spider->share;
+ int init_sql_alloc_size =
+ spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
+ DBUG_ENTER("spider_handlersocket_handler::realloc_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((int) hs_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ hs_sql.free();
+ if (hs_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_FULL_HS;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reset_sql(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reset_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
+ {
+ hs_sql.length(0);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reset_keys(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reset_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
+ {
+ hs_keys.clear();
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reset_upds(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reset_upds");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
+ {
+ hs_upds.clear();
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reset_strs(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reset_strs");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
+ {
+ hs_strs.clear();
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reset_strs_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reset_strs_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
+ {
+ hs_strs_pos = 0;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::push_back_upds(
+ SPIDER_HS_STRING_REF &info
+) {
+ int error_num;
+ DBUG_ENTER("spider_handlersocket_handler::push_back_upds");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = hs_upds.push_back(info);
+ DBUG_RETURN(error_num);
+}
+
+int spider_handlersocket_handler::request_buf_find(
+ int link_idx
+) {
+ int error_num;
+ spider_string *hs_str;
+ SPIDER_CONN *conn;
+ uint handler_id;
+ DBUG_ENTER("spider_handlersocket_handler::request_buf_find");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
+ {
+ conn = spider->hs_r_conns[link_idx];
+ handler_id = spider->r_handler_id[link_idx];
+ } else {
+ conn = spider->hs_w_conns[link_idx];
+ handler_id = spider->w_handler_id[link_idx];
+ }
+ if ((error_num = spider_db_conn_queue_action(conn)))
+ DBUG_RETURN(error_num);
+ if (!spider_bit_is_set(spider->db_request_phase, link_idx))
+ {
+ spider_set_bit(spider->db_request_phase, link_idx);
+ ++spider->db_request_id[link_idx];
+ }
+ st_spider_db_request_key request_key;
+ request_key.spider_thread_id = spider->trx->spider_thread_id;
+ request_key.query_id = spider->trx->thd->query_id;
+ request_key.handler = spider;
+ request_key.request_id = spider->db_request_id[link_idx];
+ request_key.next = NULL;
+ conn->db_conn->append_select(
+ handler_id, hs_str, &hs_keys,
+ hs_limit, hs_skip, &request_key);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::request_buf_insert(
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_handlersocket_handler::request_buf_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
+ DBUG_RETURN(error_num);
+ if (!spider_bit_is_set(spider->db_request_phase, link_idx))
+ {
+ spider_set_bit(spider->db_request_phase, link_idx);
+ ++spider->db_request_id[link_idx];
+ }
+ st_spider_db_request_key request_key;
+ request_key.spider_thread_id = spider->trx->spider_thread_id;
+ request_key.query_id = spider->trx->thd->query_id;
+ request_key.handler = spider;
+ request_key.request_id = spider->db_request_id[link_idx];
+ request_key.next = NULL;
+ spider->hs_w_conns[link_idx]->db_conn->append_insert(
+ spider->w_handler_id[link_idx], &hs_upds, &request_key);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::request_buf_update(
+ int link_idx
+) {
+ int error_num;
+ spider_string *hs_str;
+ DBUG_ENTER("spider_handlersocket_handler::request_buf_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
+ DBUG_RETURN(error_num);
+ if (!spider_bit_is_set(spider->db_request_phase, link_idx))
+ {
+ spider_set_bit(spider->db_request_phase, link_idx);
+ ++spider->db_request_id[link_idx];
+ }
+ st_spider_db_request_key request_key;
+ request_key.spider_thread_id = spider->trx->spider_thread_id;
+ request_key.query_id = spider->trx->thd->query_id;
+ request_key.handler = spider;
+ request_key.request_id = spider->db_request_id[link_idx];
+ request_key.next = NULL;
+ spider->hs_w_conns[link_idx]->db_conn->append_update(
+ spider->w_handler_id[link_idx], hs_str, &hs_keys, &hs_upds,
+ hs_limit, hs_skip,
+ spider->hs_increment, spider->hs_decrement, &request_key
+ );
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::request_buf_delete(
+ int link_idx
+) {
+ int error_num;
+ spider_string *hs_str;
+ DBUG_ENTER("spider_handlersocket_handler::request_buf_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
+ DBUG_RETURN(error_num);
+ if (!spider_bit_is_set(spider->db_request_phase, link_idx))
+ {
+ spider_set_bit(spider->db_request_phase, link_idx);
+ ++spider->db_request_id[link_idx];
+ }
+ st_spider_db_request_key request_key;
+ request_key.spider_thread_id = spider->trx->spider_thread_id;
+ request_key.query_id = spider->trx->thd->query_id;
+ request_key.handler = spider;
+ request_key.request_id = spider->db_request_id[link_idx];
+ request_key.next = NULL;
+ spider->hs_w_conns[link_idx]->db_conn->append_delete(
+ spider->w_handler_id[link_idx], hs_str, &hs_keys,
+ hs_limit, hs_skip, &request_key);
+ DBUG_RETURN(0);
+}
+
+bool spider_handlersocket_handler::need_lock_before_set_sql_for_exec(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::need_lock_before_set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_handlersocket_handler::set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_handlersocket_handler::set_sql_for_exec(
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_HS)
+ {
+ DBUG_RETURN(request_buf_find(link_idx));
+ }
+ if (sql_type & SPIDER_SQL_TYPE_INSERT_HS)
+ {
+ DBUG_RETURN(request_buf_insert(link_idx));
+ }
+ if (sql_type & SPIDER_SQL_TYPE_UPDATE_HS)
+ {
+ DBUG_RETURN(request_buf_update(link_idx));
+ }
+ if (sql_type & SPIDER_SQL_TYPE_DELETE_HS)
+ {
+ DBUG_RETURN(request_buf_delete(link_idx));
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::set_sql_for_exec(
+ spider_db_copy_table *tgt_ct,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::execute_sql(
+ ulong sql_type,
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_handlersocket_handler::execute_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(sql_type & SPIDER_SQL_TYPE_FULL_HS))
+ {
+ /* nothing to do */
+ DBUG_RETURN(0);
+ }
+ DBUG_RETURN(spider_db_query(
+ conn,
+ NULL,
+ 0,
+ quick_mode,
+ need_mon
+ ));
+}
+
+int spider_handlersocket_handler::reset()
+{
+ DBUG_ENTER("spider_handlersocket_handler::reset");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::sts_mode_exchange(
+ int sts_mode
+) {
+ DBUG_ENTER("spider_handlersocket_handler::sts_mode_exchange");
+ DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
+ DBUG_RETURN(sts_mode);
+}
+
+int spider_handlersocket_handler::show_table_status(
+ int link_idx,
+ int sts_mode,
+ uint flag
+) {
+ spider_db_handlersocket_result res(NULL);
+ SPIDER_SHARE *share = spider->share;
+ ulonglong auto_increment_value = 0;
+ DBUG_ENTER("spider_handlersocket_show_table_status");
+ res.fetch_table_status(
+ sts_mode,
+ share->stat
+ );
+ if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
+ {
+ share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
+ DBUG_PRINT("info",("spider auto_increment_value=%llu",
+ share->lgtm_tblhnd_share->auto_increment_value));
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::crd_mode_exchange(
+ int crd_mode
+) {
+ DBUG_ENTER("spider_handlersocket_handler::crd_mode_exchange");
+ DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
+ DBUG_RETURN(crd_mode);
+}
+
+int spider_handlersocket_handler::show_index(
+ int link_idx,
+ int crd_mode
+) {
+ DBUG_ENTER("spider_handlersocket_handler::show_index");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::show_records(
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::show_records");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::show_last_insert_id(
+ int link_idx,
+ ulonglong &last_insert_id
+) {
+ DBUG_ENTER("spider_handlersocket_handler::show_last_insert_id");
+ last_insert_id = 0;
+ DBUG_RETURN(0);
+}
+
+ha_rows spider_handlersocket_handler::explain_select(
+ key_range *start_key,
+ key_range *end_key,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::explain_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::lock_tables(
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::lock_tables");
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::unlock_tables(
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::unlock_tables");
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::disable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::disable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::enable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::enable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::check_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ DBUG_ENTER("spider_handlersocket_handler::check_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::repair_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ DBUG_ENTER("spider_handlersocket_handler::repair_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::analyze_table(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::analyze_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::optimize_table(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::optimize_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::flush_tables(
+ SPIDER_CONN *conn,
+ int link_idx,
+ bool lock
+) {
+ DBUG_ENTER("spider_handlersocket_handler::flush_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::flush_logs(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ DBUG_ENTER("spider_handlersocket_handler::flush_logs");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::insert_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_handlersocket *db_conn = (spider_db_handlersocket *) conn->db_conn;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash = &link_for_hash[link_idx];
+ DBUG_ASSERT(tmp_link_for_hash->spider == spider);
+ DBUG_ASSERT(tmp_link_for_hash->link_idx == link_idx);
+ uint old_elements = db_conn->handler_open_array.max_element;
+ DBUG_ENTER("spider_handlersocket_handler::insert_opened_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (insert_dynamic(&db_conn->handler_open_array,
+ (uchar*) &tmp_link_for_hash))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (db_conn->handler_open_array.max_element > old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ db_conn->handler_open_array,
+ (db_conn->handler_open_array.max_element - old_elements) *
+ db_conn->handler_open_array.size_of_element);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::delete_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_handlersocket *db_conn = (spider_db_handlersocket *) conn->db_conn;
+ uint roop_count, elements = db_conn->handler_open_array.elements;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
+ DBUG_ENTER("spider_handlersocket_handler::delete_opened_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (roop_count = 0; roop_count < elements; roop_count++)
+ {
+ get_dynamic(&db_conn->handler_open_array, (uchar *) &tmp_link_for_hash,
+ roop_count);
+ if (tmp_link_for_hash == &link_for_hash[link_idx])
+ {
+ delete_dynamic_element(&db_conn->handler_open_array, roop_count);
+ break;
+ }
+ }
+ DBUG_ASSERT(roop_count < elements);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::sync_from_clone_source(
+ spider_db_handler *dbton_hdl
+) {
+ spider_handlersocket_handler *hs_hdl =
+ (spider_handlersocket_handler *) dbton_hdl;
+ DBUG_ENTER("spider_handlersocket_handler::sync_from_clone_source");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_strs_pos = hs_hdl->hs_strs_pos;
+ DBUG_RETURN(0);
+}
+
+bool spider_handlersocket_handler::support_use_handler(
+ int use_handler
+) {
+ DBUG_ENTER("spider_handlersocket_handler::support_use_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+void spider_handlersocket_handler::minimum_select_bitmap_create()
+{
+ TABLE *table = spider->get_table();
+ Field **field_p;
+ DBUG_ENTER("spider_handlersocket_handler::minimum_select_bitmap_create");
+ memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
+ if (
+ spider->use_index_merge ||
+#ifdef HA_CAN_BULK_ACCESS
+ (spider->is_clone && !spider->is_bulk_access_clone)
+#else
+ spider->is_clone
+#endif
+ ) {
+ /* need preparing for cmp_ref */
+ TABLE_SHARE *table_share = table->s;
+ if (
+ table_share->primary_key == MAX_KEY
+ ) {
+ /* need all columns */
+ memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set));
+ DBUG_VOID_RETURN;
+ } else {
+ /* need primary key columns */
+ uint roop_count;
+ KEY *key_info;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ key_info = &table_share->key_info[table_share->primary_key];
+ key_part = key_info->key_part;
+ for (roop_count = 0;
+ roop_count < spider_user_defined_key_parts(key_info);
+ roop_count++)
+ {
+ field = key_part[roop_count].field;
+ spider_set_bit(minimum_select_bitmap, field->field_index);
+ }
+ }
+ }
+ for (field_p = table->field; *field_p; field_p++)
+ {
+ uint field_index = (*field_p)->field_index;
+ if (
+ spider_bit_is_set(spider->searched_bitmap, field_index) ||
+ bitmap_is_set(table->read_set, field_index) ||
+ bitmap_is_set(table->write_set, field_index)
+ ) {
+ spider_set_bit(minimum_select_bitmap, field_index);
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
+bool spider_handlersocket_handler::minimum_select_bit_is_set(
+ uint field_index
+) {
+ DBUG_ENTER("spider_handlersocket_handler::minimum_select_bit_is_set");
+ DBUG_PRINT("info",("spider field_index=%u", field_index));
+ DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
+ spider_bit_is_set(minimum_select_bitmap, field_index) ?
+ "TRUE" : "FALSE"));
+ DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
+}
+
+void spider_handlersocket_handler::copy_minimum_select_bitmap(
+ uchar *bitmap
+) {
+ int roop_count;
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_handlersocket_handler::copy_minimum_select_bitmap");
+ for (roop_count = 0;
+ roop_count < (int) ((table->s->fields + 7) / 8);
+ roop_count++)
+ {
+ bitmap[roop_count] =
+ minimum_select_bitmap[roop_count];
+ DBUG_PRINT("info",("spider roop_count=%d", roop_count));
+ DBUG_PRINT("info",("spider bitmap=%d",
+ bitmap[roop_count]));
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_handlersocket_handler::init_union_table_name_pos()
+{
+ DBUG_ENTER("spider_handlersocket_handler::init_union_table_name_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::set_union_table_name_pos()
+{
+ DBUG_ENTER("spider_handlersocket_handler::set_union_table_name_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reset_union_table_name(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reset_union_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_handlersocket_handler::append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_list_item_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_from_and_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reappend_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_where_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_where_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_having_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_having_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_item_type_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_group_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_order_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+#endif