mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1843 lines
		
	
	
	
		
			47 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1843 lines
		
	
	
	
		
			47 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2008-2020 Kentoku Shiba
 | |
|    Copyright (C) 2019, 2022, MariaDB Corporation.
 | |
| 
 | |
|   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 SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
 | |
|   my_init_dynamic_array2(PSI_INSTRUMENT_ME, A, B, C, D, E, F)
 | |
| #define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
 | |
|   init_alloc_root(PSI_INSTRUMENT_ME, A, B, C, D)
 | |
| 
 | |
| #define SPIDER_DBTON_SIZE 15
 | |
| 
 | |
| #ifndef SIZEOF_STORED_DOUBLE
 | |
| #define SIZEOF_STORED_DOUBLE 8
 | |
| #endif
 | |
| 
 | |
| #define SPIDER_DB_WRAPPER_MYSQL "mysql"
 | |
| #define SPIDER_DB_WRAPPER_MARIADB "mariadb"
 | |
| 
 | |
| #define PLUGIN_VAR_CAN_MEMALLOC
 | |
| 
 | |
| #define SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
 | |
| #define SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
 | |
| #define SPIDER_HAS_SHOW_SIMPLE_FUNC
 | |
| #define SPIDER_HAS_JT_HASH_INDEX_MERGE
 | |
| #define SPIDER_HAS_EXPR_CACHE_ITEM
 | |
| 
 | |
| #define SPIDER_ITEM_HAS_CMP_TYPE
 | |
| 
 | |
| #define SPIDER_HAS_TIME_STATUS
 | |
| #define SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
 | |
| 
 | |
| #define SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY
 | |
| #define SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR
 | |
| 
 | |
| #define SPIDER_ORDER_HAS_ENUM_ORDER
 | |
| 
 | |
| #define SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
 | |
| #define SPIDER_HANDLER_AUTO_REPAIR_HAS_ERROR
 | |
| 
 | |
| class spider_db_conn;
 | |
| typedef spider_db_conn SPIDER_DB_CONN;
 | |
| class spider_db_result;
 | |
| typedef spider_db_result SPIDER_DB_RESULT;
 | |
| class spider_db_row;
 | |
| typedef spider_db_row SPIDER_DB_ROW;
 | |
| class spider_db_result_buffer;
 | |
| typedef spider_db_result_buffer SPIDER_DB_RESULT_BUFFER;
 | |
| struct st_spider_conn;
 | |
| typedef st_spider_conn SPIDER_CONN;
 | |
| struct st_spider_result;
 | |
| typedef st_spider_result SPIDER_RESULT;
 | |
| 
 | |
| #define SPIDER_SQL_SEMICOLON_STR ";"
 | |
| #define SPIDER_SQL_SEMICOLON_LEN sizeof(SPIDER_SQL_SEMICOLON_STR) - 1
 | |
| #define SPIDER_SQL_COLON_STR ":"
 | |
| #define SPIDER_SQL_COLON_LEN sizeof(SPIDER_SQL_COLON_STR) - 1
 | |
| #define SPIDER_SQL_VALUE_QUOTE_STR "'"
 | |
| #define SPIDER_SQL_VALUE_QUOTE_LEN (sizeof(SPIDER_SQL_VALUE_QUOTE_STR) - 1)
 | |
| 
 | |
| #define SPIDER_SQL_DOT_STR "."
 | |
| #define SPIDER_SQL_DOT_LEN (sizeof(SPIDER_SQL_DOT_STR) - 1)
 | |
| #define SPIDER_SQL_PERCENT_STR "%"
 | |
| #define SPIDER_SQL_PERCENT_LEN (sizeof(SPIDER_SQL_PERCENT_STR) - 1)
 | |
| #define SPIDER_SQL_HYPHEN_STR "-"
 | |
| #define SPIDER_SQL_HYPHEN_LEN (sizeof(SPIDER_SQL_HYPHEN_STR) - 1)
 | |
| 
 | |
| #define SPIDER_SQL_EQUAL_STR " = "
 | |
| #define SPIDER_SQL_EQUAL_LEN (sizeof(SPIDER_SQL_EQUAL_STR) - 1)
 | |
| #define SPIDER_SQL_AND_STR " and "
 | |
| #define SPIDER_SQL_AND_LEN (sizeof(SPIDER_SQL_AND_STR) - 1)
 | |
| #define SPIDER_SQL_BETWEEN_STR " between "
 | |
| #define SPIDER_SQL_BETWEEN_LEN (sizeof(SPIDER_SQL_BETWEEN_STR) - 1)
 | |
| 
 | |
| #define SPIDER_SQL_TABLE_NAME_STR "`table_name`"
 | |
| #define SPIDER_SQL_TABLE_NAME_LEN sizeof(SPIDER_SQL_TABLE_NAME_STR) - 1
 | |
| 
 | |
| #define SPIDER_SQL_HS_LTEQUAL_STR "<="
 | |
| #define SPIDER_SQL_HS_LTEQUAL_LEN (sizeof(SPIDER_SQL_HS_LTEQUAL_STR) - 1)
 | |
| 
 | |
| #define SPIDER_SQL_CASE_STR "case "
 | |
| #define SPIDER_SQL_CASE_LEN (sizeof(SPIDER_SQL_CASE_STR) - 1)
 | |
| #define SPIDER_SQL_WHEN_STR " when "
 | |
| #define SPIDER_SQL_WHEN_LEN (sizeof(SPIDER_SQL_WHEN_STR) - 1)
 | |
| #define SPIDER_SQL_THEN_STR " then "
 | |
| #define SPIDER_SQL_THEN_LEN (sizeof(SPIDER_SQL_THEN_STR) - 1)
 | |
| #define SPIDER_SQL_ELSE_STR " else "
 | |
| #define SPIDER_SQL_ELSE_LEN (sizeof(SPIDER_SQL_ELSE_STR) - 1)
 | |
| #define SPIDER_SQL_END_STR " end"
 | |
| #define SPIDER_SQL_END_LEN (sizeof(SPIDER_SQL_END_STR) - 1)
 | |
| 
 | |
| #define SPIDER_SQL_USING_STR " using "
 | |
| #define SPIDER_SQL_USING_LEN (sizeof(SPIDER_SQL_USING_STR) - 1)
 | |
| #define SPIDER_SQL_MBR_STR "mbr"
 | |
| #define SPIDER_SQL_MBR_LEN (sizeof(SPIDER_SQL_MBR_STR) - 1)
 | |
| #define SPIDER_SQL_MBR_EQUAL_STR "mbrequal("
 | |
| #define SPIDER_SQL_MBR_EQUAL_LEN (sizeof(SPIDER_SQL_MBR_EQUAL_STR) - 1)
 | |
| #define SPIDER_SQL_MBR_CONTAIN_STR "mbrcontains("
 | |
| #define SPIDER_SQL_MBR_CONTAIN_LEN (sizeof(SPIDER_SQL_MBR_CONTAIN_STR) - 1)
 | |
| #define SPIDER_SQL_MBR_INTERSECT_STR "mbrintersects("
 | |
| #define SPIDER_SQL_MBR_INTERSECT_LEN (sizeof(SPIDER_SQL_MBR_INTERSECT_STR) - 1)
 | |
| #define SPIDER_SQL_MBR_WITHIN_STR "mbrwithin("
 | |
| #define SPIDER_SQL_MBR_WITHIN_LEN (sizeof(SPIDER_SQL_MBR_WITHIN_STR) - 1)
 | |
| #define SPIDER_SQL_MBR_DISJOINT_STR "mbrdisjoint("
 | |
| #define SPIDER_SQL_MBR_DISJOINT_LEN (sizeof(SPIDER_SQL_MBR_DISJOINT_STR) - 1)
 | |
| #define SPIDER_SQL_NOT_BETWEEN_STR "not between"
 | |
| #define SPIDER_SQL_NOT_BETWEEN_LEN (sizeof(SPIDER_SQL_NOT_BETWEEN_STR) - 1)
 | |
| #define SPIDER_SQL_TO_FLOAT_STR "/* create function to_float(a decimal(20,6)) returns float return a */ to_float("
 | |
| #define SPIDER_SQL_TO_FLOAT_LEN (sizeof(SPIDER_SQL_TO_FLOAT_STR) - 1)
 | |
| #define SPIDER_SQL_IN_STR "in("
 | |
| #define SPIDER_SQL_IN_LEN (sizeof(SPIDER_SQL_IN_STR) - 1)
 | |
| #define SPIDER_SQL_NOT_IN_STR "not in("
 | |
| #define SPIDER_SQL_NOT_IN_LEN (sizeof(SPIDER_SQL_NOT_IN_STR) - 1)
 | |
| #define SPIDER_SQL_LIKE_STR " like "
 | |
| #define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
 | |
| #define SPIDER_SQL_NOT_LIKE_STR "not like"
 | |
| #define SPIDER_SQL_NOT_LIKE_LEN (sizeof(SPIDER_SQL_NOT_LIKE_STR) - 1)
 | |
| #define SPIDER_SQL_CAST_STR "cast("
 | |
| #define SPIDER_SQL_CAST_LEN (sizeof(SPIDER_SQL_CAST_STR) - 1)
 | |
| #define SPIDER_SQL_AS_DATETIME_STR " as datetime"
 | |
| #define SPIDER_SQL_AS_DATETIME_LEN (sizeof(SPIDER_SQL_AS_DATETIME_STR) - 1)
 | |
| #define SPIDER_SQL_AS_DECIMAL_STR " as decimal"
 | |
| #define SPIDER_SQL_AS_DECIMAL_LEN (sizeof(SPIDER_SQL_AS_DECIMAL_STR) - 1)
 | |
| #define SPIDER_SQL_AS_SIGNED_STR " as signed"
 | |
| #define SPIDER_SQL_AS_SIGNED_LEN (sizeof(SPIDER_SQL_AS_SIGNED_STR) - 1)
 | |
| #define SPIDER_SQL_AS_UNSIGNED_STR " as unsigned"
 | |
| #define SPIDER_SQL_AS_UNSIGNED_LEN (sizeof(SPIDER_SQL_AS_UNSIGNED_STR) - 1)
 | |
| #define SPIDER_SQL_AS_DATE_STR " as date"
 | |
| #define SPIDER_SQL_AS_DATE_LEN (sizeof(SPIDER_SQL_AS_DATE_STR) - 1)
 | |
| #define SPIDER_SQL_AS_TIME_STR " as time"
 | |
| #define SPIDER_SQL_AS_TIME_LEN (sizeof(SPIDER_SQL_AS_TIME_STR) - 1)
 | |
| #define SPIDER_SQL_AS_BINARY_STR " as binary"
 | |
| #define SPIDER_SQL_AS_BINARY_LEN (sizeof(SPIDER_SQL_AS_BINARY_STR) - 1)
 | |
| #define SPIDER_SQL_AS_FLOAT_STR " as float"
 | |
| #define SPIDER_SQL_AS_FLOAT_LEN (sizeof(SPIDER_SQL_AS_FLOAT_STR) - 1)
 | |
| #define SPIDER_SQL_IS_TRUE_STR " is true"
 | |
| #define SPIDER_SQL_IS_TRUE_LEN (sizeof(SPIDER_SQL_IS_TRUE_STR) - 1)
 | |
| #define SPIDER_SQL_IS_NOT_TRUE_STR " is not true"
 | |
| #define SPIDER_SQL_IS_NOT_TRUE_LEN (sizeof(SPIDER_SQL_IS_NOT_TRUE_STR) - 1)
 | |
| #define SPIDER_SQL_IS_FALSE_STR " is false"
 | |
| #define SPIDER_SQL_IS_FALSE_LEN (sizeof(SPIDER_SQL_IS_FALSE_STR) - 1)
 | |
| #define SPIDER_SQL_IS_NOT_FALSE_STR " is not false"
 | |
| #define SPIDER_SQL_IS_NOT_FALSE_LEN (sizeof(SPIDER_SQL_IS_NOT_FALSE_STR) - 1)
 | |
| #define SPIDER_SQL_NULL_CHAR_STR ""
 | |
| #define SPIDER_SQL_NULL_CHAR_LEN (sizeof(SPIDER_SQL_NULL_CHAR_STR) - 1)
 | |
| #define SPIDER_SQL_CREATE_TABLE_STR "create table "
 | |
| #define SPIDER_SQL_CREATE_TABLE_LEN (sizeof(SPIDER_SQL_CREATE_TABLE_STR) - 1)
 | |
| #define SPIDER_SQL_DEFAULT_CHARSET_STR " default charset "
 | |
| #define SPIDER_SQL_DEFAULT_CHARSET_LEN (sizeof(SPIDER_SQL_DEFAULT_CHARSET_STR) - 1)
 | |
| #define SPIDER_SQL_CHARACTER_SET_STR " character set "
 | |
| #define SPIDER_SQL_CHARACTER_SET_LEN (sizeof(SPIDER_SQL_CHARACTER_SET_STR) - 1)
 | |
| #define SPIDER_SQL_COLLATE_STR " collate "
 | |
| #define SPIDER_SQL_COLLATE_LEN (sizeof(SPIDER_SQL_COLLATE_STR) - 1)
 | |
| #define SPIDER_SQL_COMMENT_STR " comment "
 | |
| #define SPIDER_SQL_COMMENT_LEN (sizeof(SPIDER_SQL_COMMENT_STR) - 1)
 | |
| #define SPIDER_SQL_CONNECTION_STR " connection "
 | |
| #define SPIDER_SQL_CONNECTION_LEN (sizeof(SPIDER_SQL_CONNECTION_STR) - 1)
 | |
| #define SPIDER_SQL_LCL_NAME_QUOTE_STR "`"
 | |
| #define SPIDER_SQL_LCL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_LCL_NAME_QUOTE_STR) - 1)
 | |
| #define SPIDER_SQL_MIN_STR "min"
 | |
| #define SPIDER_SQL_MIN_LEN (sizeof(SPIDER_SQL_MIN_STR) - 1)
 | |
| 
 | |
| #define SPIDER_SQL_LOP_CHK_PRM_PRF_STR "spider_lc_"
 | |
| #define SPIDER_SQL_LOP_CHK_PRM_PRF_LEN (sizeof(SPIDER_SQL_LOP_CHK_PRM_PRF_STR) - 1)
 | |
| 
 | |
| #define SPIDER_SQL_KIND_SQL (1 << 0)
 | |
| #define SPIDER_SQL_KIND_HANDLER (1 << 1)
 | |
| 
 | |
| #define SPIDER_SQL_TYPE_SELECT_SQL (1 << 0)
 | |
| #define SPIDER_SQL_TYPE_INSERT_SQL (1 << 1)
 | |
| #define SPIDER_SQL_TYPE_UPDATE_SQL (1 << 2)
 | |
| #define SPIDER_SQL_TYPE_DELETE_SQL (1 << 3)
 | |
| #define SPIDER_SQL_TYPE_BULK_UPDATE_SQL (1 << 4)
 | |
| #define SPIDER_SQL_TYPE_TMP_SQL (1 << 5)
 | |
| #define SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL (1 << 6)
 | |
| #define SPIDER_SQL_TYPE_OTHER_SQL (1 << 7)
 | |
| #define SPIDER_SQL_TYPE_HANDLER (1 << 8)
 | |
| 
 | |
| enum spider_bulk_upd_start {
 | |
|   SPD_BU_NOT_START,
 | |
|   SPD_BU_START_BY_INDEX_OR_RND_INIT,
 | |
|   SPD_BU_START_BY_BULK_INIT
 | |
| };
 | |
| 
 | |
| enum spider_index_rnd_init {
 | |
|   SPD_NONE,
 | |
|   SPD_INDEX,
 | |
|   SPD_RND
 | |
| };
 | |
| 
 | |
| struct st_spider_ft_info;
 | |
| struct st_spider_result;
 | |
| typedef struct st_spider_transaction SPIDER_TRX;
 | |
| typedef struct st_spider_share SPIDER_SHARE;
 | |
| class ha_spider;
 | |
| class spider_db_copy_table;
 | |
| class spider_db_handler;
 | |
| 
 | |
| class spider_string
 | |
| {
 | |
| public:
 | |
|   bool mem_calc_inited;
 | |
|   String str;
 | |
|   uint id;
 | |
|   const char *func_name;
 | |
|   const char *file_name;
 | |
|   ulong line_no;
 | |
|   uint32 current_alloc_mem;
 | |
|   spider_string *next;
 | |
| 
 | |
|   spider_string();
 | |
|   spider_string(
 | |
|     uint32 length_arg
 | |
|   );
 | |
|   spider_string(
 | |
|     const char *str,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   spider_string(
 | |
|     const char *str,
 | |
|     uint32 len,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   spider_string(
 | |
|     char *str,
 | |
|     uint32 len,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   spider_string(
 | |
|     const String &str
 | |
|   );
 | |
|   ~spider_string();
 | |
|   void init_mem_calc(
 | |
|     uint id,
 | |
|     const char *func_name,
 | |
|     const char *file_name,
 | |
|     ulong line_no
 | |
|   );
 | |
|   void mem_calc();
 | |
|   String *get_str();
 | |
|   void set_charset(
 | |
|     CHARSET_INFO *charset_arg
 | |
|   );
 | |
|   CHARSET_INFO *charset() const;
 | |
|   uint32 length() const;
 | |
|   uint32 alloced_length() const;
 | |
|   char &operator [] (
 | |
|     uint32 i
 | |
|   ) const;
 | |
|   void length(
 | |
|     uint32 len
 | |
|   );
 | |
|   bool is_empty() const;
 | |
|   const char *ptr() const;
 | |
|   char *c_ptr();
 | |
|   char *c_ptr_quick();
 | |
|   char *c_ptr_safe();
 | |
|   LEX_STRING lex_string() const;
 | |
|   void set(
 | |
|     String &str,
 | |
|     uint32 offset,
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   void set(
 | |
|     char *str,
 | |
|     uint32 arg_length,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   void set(
 | |
|     const char *str,
 | |
|     uint32 arg_length,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool set_ascii(
 | |
|     const char *str,
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   bool set_int(
 | |
|     longlong num,
 | |
|     bool unsigned_flag,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool set(
 | |
|     longlong num,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool set(
 | |
|     ulonglong num,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool set_real(
 | |
|     double num,
 | |
|     uint decimals,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   void chop();
 | |
|   void free();
 | |
|   bool alloc(
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   bool real_alloc(
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   bool realloc(
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   void shrink(
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   bool is_alloced();
 | |
|   spider_string& operator = (
 | |
|     const String &s
 | |
|   );
 | |
|   bool copy();
 | |
|   bool copy(
 | |
|     const spider_string &s
 | |
|   );
 | |
|   bool copy(
 | |
|     const String &s
 | |
|   );
 | |
|   bool copy(
 | |
|     const char *s,
 | |
|     uint32 arg_length,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool needs_conversion(
 | |
|     uint32 arg_length,
 | |
|     CHARSET_INFO *cs_from,
 | |
|     CHARSET_INFO *cs_to,
 | |
|     uint32 *offset
 | |
|   );
 | |
|   bool copy_aligned(
 | |
|     const char *s,
 | |
|     uint32 arg_length,
 | |
|     uint32 offset,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool set_or_copy_aligned(
 | |
|     const char *s,
 | |
|     uint32 arg_length,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool copy(
 | |
|     const char *s,
 | |
|     uint32 arg_length,
 | |
|     CHARSET_INFO *csfrom,
 | |
|     CHARSET_INFO *csto,
 | |
|     uint *errors
 | |
|   );
 | |
|   bool append(
 | |
|     const spider_string &s
 | |
|   );
 | |
|   bool append(
 | |
|     const String &s
 | |
|   );
 | |
|   bool append(
 | |
|     const char *s
 | |
|   );
 | |
|   bool append(
 | |
|     LEX_STRING *ls
 | |
|   );
 | |
|   bool append(
 | |
|     const char *s,
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   bool append(
 | |
|     const char *s,
 | |
|     uint32 arg_length,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool append_ulonglong(
 | |
|     ulonglong val
 | |
|   );
 | |
|   bool append(
 | |
|     IO_CACHE *file,
 | |
|     uint32 arg_length
 | |
|   );
 | |
|   int strstr(
 | |
|     const String &search,
 | |
|     uint32 offset = 0
 | |
|   );
 | |
|   int strrstr(
 | |
|     const String &search,
 | |
|     uint32 offset = 0
 | |
|   );
 | |
|   bool replace(
 | |
|     uint32 offset,
 | |
|     uint32 arg_length,
 | |
|     const char *to,
 | |
|     uint32 length
 | |
|   );
 | |
|   bool replace(
 | |
|     uint32 offset,
 | |
|     uint32 arg_length,
 | |
|     const String &to
 | |
|   );
 | |
|   inline bool append(
 | |
|     char chr
 | |
|   );
 | |
|   bool fill(
 | |
|     uint32 max_length,
 | |
|     char fill
 | |
|   );
 | |
|   void strip_sp();
 | |
|   uint32 numchars();
 | |
|   int charpos(
 | |
|     int i,
 | |
|     uint32 offset=0
 | |
|   );
 | |
|   int reserve(
 | |
|     uint32 space_needed
 | |
|   );
 | |
|   int reserve(
 | |
|     uint32 space_needed,
 | |
|     uint32 grow_by
 | |
|   );
 | |
|   void q_append(
 | |
|     const char c
 | |
|   );
 | |
|   void q_append(
 | |
|     const uint32 n
 | |
|   );
 | |
|   void q_append(
 | |
|     double d
 | |
|   );
 | |
|   void q_append(
 | |
|     double *d
 | |
|   );
 | |
|   void q_append(
 | |
|     const char *data,
 | |
|     uint32 data_len
 | |
|   );
 | |
|   void write_at_position(
 | |
|     int position,
 | |
|     uint32 value
 | |
|   );
 | |
|   void qs_append(
 | |
|     const char *str,
 | |
|     uint32 len
 | |
|   );
 | |
|   void qs_append(
 | |
|     double d
 | |
|   );
 | |
|   void qs_append(
 | |
|     double *d
 | |
|   );
 | |
|   void qs_append(
 | |
|     const char c
 | |
|   );
 | |
|   void qs_append(
 | |
|     int i
 | |
|   );
 | |
|   void qs_append(
 | |
|     uint i
 | |
|   );
 | |
|   char *prep_append(
 | |
|     uint32 arg_length,
 | |
|     uint32 step_alloc
 | |
|   );
 | |
|   bool append(
 | |
|     const char *s,
 | |
|     uint32 arg_length,
 | |
|     uint32 step_alloc
 | |
|   );
 | |
|   void append_escape_string(
 | |
|     const char *st,
 | |
|     uint len
 | |
|   );
 | |
|   void append_escape_string(
 | |
|     const char *st,
 | |
|     uint len,
 | |
|     CHARSET_INFO *cs
 | |
|   );
 | |
|   bool append_for_single_quote(
 | |
|     const char *st,
 | |
|     uint len
 | |
|   );
 | |
|   bool append_for_single_quote(
 | |
|     const String *s
 | |
|   );
 | |
|   bool append_for_single_quote(
 | |
|     const char *st
 | |
|   );
 | |
|   void print(
 | |
|     String *print
 | |
|   );
 | |
|   void swap(
 | |
|     spider_string &s
 | |
|   );
 | |
|   bool uses_buffer_owned_by(
 | |
|     const String *s
 | |
|   ) const;
 | |
|   bool is_ascii() const;
 | |
| };
 | |
| 
 | |
| typedef struct spider_table_link_idx_holder SPIDER_TABLE_LINK_IDX_HOLDER;
 | |
| typedef struct spider_table_holder SPIDER_TABLE_HOLDER;
 | |
| 
 | |
| typedef struct spider_link_idx_holder
 | |
| {
 | |
|   spider_table_link_idx_holder *table_link_idx_holder;
 | |
|   int link_idx;
 | |
|   int link_status;
 | |
|   spider_link_idx_holder *next_table;
 | |
|   spider_link_idx_holder *next;
 | |
| } SPIDER_LINK_IDX_HOLDER;
 | |
| 
 | |
| typedef struct spider_link_idx_chain
 | |
| {
 | |
|   SPIDER_CONN *conn;
 | |
|   spider_link_idx_holder *link_idx_holder;
 | |
|   spider_link_idx_holder *current_link_idx_holder;
 | |
|   int link_status;
 | |
|   spider_link_idx_chain *next;
 | |
| } SPIDER_LINK_IDX_CHAIN;
 | |
| 
 | |
| typedef struct spider_table_link_idx_holder
 | |
| {
 | |
|   spider_table_holder *table_holder;
 | |
|   spider_link_idx_holder *first_link_idx_holder;
 | |
|   spider_link_idx_holder *last_link_idx_holder;
 | |
|   spider_link_idx_holder *current_link_idx_holder;
 | |
|   uint link_idx_holder_count;
 | |
| } SPIDER_TABLE_LINK_IDX_HOLDER;
 | |
| 
 | |
| typedef struct spider_conn_holder
 | |
| {
 | |
|   SPIDER_CONN *conn;
 | |
|   spider_table_link_idx_holder *table_link_idx_holder;
 | |
|   uint link_idx_holder_count_max;
 | |
|   bool checked_for_same_conn;
 | |
|   long access_balance;
 | |
|   spider_conn_holder *prev;
 | |
|   spider_conn_holder *next;
 | |
| } SPIDER_CONN_HOLDER;
 | |
| 
 | |
| /* Record information of a local (spider) table, for use of the spider
 | |
| group by handler. */
 | |
| typedef struct spider_table_holder
 | |
| {
 | |
|   TABLE *table;
 | |
|   ha_spider *spider;
 | |
|   /* alias of the table, in the form of tk, where k is the index of
 | |
|   the table from `query->from' indexed by next_local. */
 | |
|   spider_string *alias;
 | |
| } SPIDER_TABLE_HOLDER;
 | |
| 
 | |
| /* For use of the spider group by handler. */
 | |
| class spider_fields
 | |
| {
 | |
|   uint dbton_count;
 | |
|   uint current_dbton_num;
 | |
|   uint dbton_ids[SPIDER_DBTON_SIZE];
 | |
|   /* Number of tables in `query->from'. */
 | |
|   uint table_count;
 | |
|   /* All tables in `query->from', in the same order by next_local. */
 | |
|   SPIDER_TABLE_HOLDER *table_holder;
 | |
|   SPIDER_LINK_IDX_CHAIN *first_link_idx_chain;
 | |
|   SPIDER_LINK_IDX_CHAIN *last_link_idx_chain;
 | |
|   SPIDER_LINK_IDX_CHAIN *current_link_idx_chain;
 | |
|   SPIDER_LINK_IDX_CHAIN *first_ok_link_idx_chain;
 | |
|   SPIDER_CONN_HOLDER *first_conn_holder;
 | |
|   SPIDER_CONN_HOLDER *last_conn_holder;
 | |
|   SPIDER_CONN_HOLDER *current_conn_holder;
 | |
|   Field **current_field_ptr;
 | |
| public:
 | |
|   spider_fields();
 | |
|   virtual ~spider_fields();
 | |
|   void add_dbton_id(
 | |
|     uint dbton_id_arg
 | |
|   );
 | |
|   void set_pos_to_first_dbton_id();
 | |
|   uint get_next_dbton_id();
 | |
|   int make_link_idx_chain(
 | |
|     int link_status
 | |
|   );
 | |
|   SPIDER_LINK_IDX_CHAIN *create_link_idx_chain();
 | |
|   void set_pos_to_first_link_idx_chain();
 | |
|   SPIDER_LINK_IDX_CHAIN *get_next_link_idx_chain();
 | |
|   SPIDER_LINK_IDX_HOLDER *get_dup_link_idx_holder(
 | |
|     SPIDER_TABLE_LINK_IDX_HOLDER *table_link_idx_holder,
 | |
|     SPIDER_LINK_IDX_HOLDER *current
 | |
|   );
 | |
|   bool check_link_ok_chain();
 | |
|   bool is_first_link_ok_chain(
 | |
|     SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
 | |
|   );
 | |
|   int get_ok_link_idx();
 | |
|   void set_first_link_idx();
 | |
|   int add_link_idx(
 | |
|     SPIDER_CONN_HOLDER *conn_holder_arg,
 | |
|     ha_spider *spider_arg,
 | |
|     int link_idx
 | |
|   );
 | |
|   SPIDER_LINK_IDX_HOLDER *create_link_idx_holder();
 | |
|   void set_pos_to_first_table_on_link_idx_chain(
 | |
|     SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
 | |
|   );
 | |
|   SPIDER_LINK_IDX_HOLDER *get_next_table_on_link_idx_chain(
 | |
|     SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
 | |
|   );
 | |
|   SPIDER_CONN_HOLDER *add_conn(
 | |
|     SPIDER_CONN *conn_arg,
 | |
|     long access_balance
 | |
|   );
 | |
|   SPIDER_CONN_HOLDER *create_conn_holder();
 | |
|   bool has_conn_holder();
 | |
|   void clear_conn_holder_from_conn();
 | |
|   bool check_conn_same_conn(
 | |
|     SPIDER_CONN *conn_arg
 | |
|   );
 | |
|   bool remove_conn_if_not_checked();
 | |
|   void check_support_dbton(
 | |
|     uchar *dbton_bitmap
 | |
|   );
 | |
|   void choose_a_conn();
 | |
|   void free_conn_holder(
 | |
|     SPIDER_CONN_HOLDER *conn_holder_arg
 | |
|   );
 | |
|   SPIDER_TABLE_HOLDER *find_table(Field *field);
 | |
|   void set_table_holder(
 | |
|     SPIDER_TABLE_HOLDER *table_holder_arg,
 | |
|     uint table_count_arg
 | |
|   );
 | |
|   SPIDER_TABLE_HOLDER *get_first_table_holder();
 | |
|   SPIDER_TABLE_HOLDER *get_table_holder(TABLE *table);
 | |
|   uint get_table_count();
 | |
|   void set_field_ptr(Field **field_arg);
 | |
|   Field **get_next_field_ptr();
 | |
|   int ping_table_mon_from_table(
 | |
|     SPIDER_LINK_IDX_CHAIN *link_idx_chain
 | |
|   );
 | |
| };
 | |
| 
 | |
| 
 | |
| struct st_spider_db_request_key
 | |
| {
 | |
|   ulonglong                spider_thread_id;
 | |
|   query_id_t               query_id;
 | |
|   void                     *handler;
 | |
|   ulonglong                request_id;
 | |
|   st_spider_db_request_key *next;
 | |
| };
 | |
| 
 | |
| class spider_db_util
 | |
| {
 | |
| public:
 | |
|   uint dbton_id;
 | |
|   spider_db_util() = default;
 | |
|   virtual ~spider_db_util() = default;
 | |
|   virtual int append_name(
 | |
|     spider_string *str,
 | |
|     const char *name,
 | |
|     uint name_length
 | |
|   ) = 0;
 | |
|   virtual int append_name_with_charset(
 | |
|     spider_string *str,
 | |
|     const char *name,
 | |
|     uint name_length,
 | |
|     CHARSET_INFO *name_charset
 | |
|   ) = 0;
 | |
|   virtual int append_escaped_name(
 | |
|     spider_string *str,
 | |
|     const char *name,
 | |
|     uint name_length
 | |
|   ) = 0;
 | |
|   virtual int append_escaped_name_with_charset(
 | |
|     spider_string *str,
 | |
|     const char *name,
 | |
|     uint name_length,
 | |
|     CHARSET_INFO *name_charset
 | |
|   ) = 0;
 | |
|   virtual bool is_name_quote(
 | |
|     const char head_code
 | |
|   ) = 0;
 | |
|   virtual int append_escaped_name_quote(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int append_column_value(ha_spider *spider, spider_string *str,
 | |
|                                   Field *field, const uchar *new_ptr,
 | |
|                                   bool is_like,
 | |
|                                   CHARSET_INFO *access_charset)= 0;
 | |
|   virtual int append_trx_isolation(
 | |
|     spider_string *str,
 | |
|     int trx_isolation
 | |
|   ) = 0;
 | |
|   virtual int append_autocommit(
 | |
|     spider_string *str,
 | |
|     bool autocommit
 | |
|   ) = 0;
 | |
|   virtual int append_sql_log_off(
 | |
|     spider_string *str,
 | |
|     bool sql_log_off
 | |
|   ) = 0;
 | |
|   virtual int append_wait_timeout(
 | |
|     spider_string *str,
 | |
|     int wait_timeout
 | |
|   ) = 0;
 | |
|   virtual int append_sql_mode(
 | |
|     spider_string *str,
 | |
|     sql_mode_t sql_mode
 | |
|   ) = 0;
 | |
|   virtual int append_time_zone(
 | |
|     spider_string *str,
 | |
|     Time_zone *time_zone
 | |
|   ) = 0;
 | |
|   virtual int append_loop_check(
 | |
|     spider_string *str,
 | |
|     SPIDER_CONN *conn
 | |
|   );
 | |
|   virtual int append_start_transaction(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int append_xa_start(
 | |
|     spider_string *str,
 | |
|     XID *xid
 | |
|   ) = 0;
 | |
|   virtual int append_lock_table_head(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int 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
 | |
|   ) = 0;
 | |
|   virtual int append_lock_table_tail(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int append_unlock_table(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int 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
 | |
|   ) = 0;
 | |
|   virtual int 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
 | |
|   ) = 0;
 | |
|   virtual int append_escaped_util(
 | |
|     spider_string *to,
 | |
|     String *from
 | |
|   ) = 0;
 | |
|   virtual int append_from_and_tables(
 | |
|     ha_spider *spider,
 | |
|     spider_fields *fields,
 | |
|     spider_string *str,
 | |
|     TABLE_LIST *table_list,
 | |
|     uint table_count
 | |
|   ) = 0;
 | |
|   virtual int append_where(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int append_having(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual bool tables_on_different_db_are_joinable();
 | |
|   virtual bool socket_has_default_value();
 | |
|   virtual bool database_has_default_value();
 | |
|   virtual bool default_file_has_default_value();
 | |
|   virtual bool host_has_default_value();
 | |
|   virtual bool port_has_default_value();
 | |
|   virtual bool append_charset_name_before_string();
 | |
|   virtual uint limit_mode();
 | |
| };
 | |
| 
 | |
| class spider_db_row
 | |
| {
 | |
| public:
 | |
|   uint dbton_id;
 | |
|   SPIDER_DB_ROW *next_pos;
 | |
|   spider_db_row(uint in_dbton_id) : dbton_id(in_dbton_id), next_pos(NULL) {}
 | |
|   virtual ~spider_db_row() = default;
 | |
|   /* Store the current field result to a given field */
 | |
|   virtual int store_to_field(
 | |
|     Field *field,
 | |
|     CHARSET_INFO *access_charset
 | |
|   ) = 0;
 | |
|   virtual int append_to_str(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int append_escaped_to_str(
 | |
|     spider_string *str,
 | |
|     uint dbton_id
 | |
|   ) = 0;
 | |
|   virtual void first() = 0;
 | |
|   /* Move to the next field result. */
 | |
|   virtual void next() = 0;
 | |
|   virtual bool is_null() = 0;
 | |
|   virtual int val_int() = 0;
 | |
|   virtual double val_real() = 0;
 | |
|   virtual my_decimal *val_decimal(
 | |
|     my_decimal *decimal_value,
 | |
|     CHARSET_INFO *access_charset
 | |
|   ) = 0;
 | |
|   virtual SPIDER_DB_ROW *clone() = 0;
 | |
|   virtual int store_to_tmp_table(
 | |
|     TABLE *tmp_table,
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual uint get_byte_size() = 0;
 | |
| };
 | |
| 
 | |
| class spider_db_result_buffer
 | |
| {
 | |
| public:
 | |
|   spider_db_result_buffer() = default;
 | |
|   virtual ~spider_db_result_buffer() = default;
 | |
|   virtual void clear() = 0;
 | |
|   virtual bool check_size(
 | |
|     longlong size
 | |
|   ) = 0;
 | |
| };
 | |
| 
 | |
| class spider_db_result
 | |
| {
 | |
| public:
 | |
|   SPIDER_DB_CONN *db_conn;
 | |
|   uint           dbton_id;
 | |
|   spider_db_result(SPIDER_DB_CONN *in_db_conn);
 | |
|   virtual ~spider_db_result() = default;
 | |
|   virtual void set_limit(longlong value) {}
 | |
|   virtual bool has_result() = 0;
 | |
|   virtual void free_result() = 0;
 | |
|   virtual SPIDER_DB_ROW *current_row() = 0;
 | |
|   virtual SPIDER_DB_ROW *fetch_row(MY_BITMAP *skips = NULL) = 0;
 | |
|   virtual SPIDER_DB_ROW *fetch_row_from_tmp_table(
 | |
|     TABLE *tmp_table
 | |
|   ) = 0;
 | |
|   virtual int fetch_table_status(
 | |
|     int mode,
 | |
|     ha_statistics &stat
 | |
|   ) = 0;
 | |
|   virtual int fetch_table_records(
 | |
|     int mode,
 | |
|     ha_rows &records
 | |
|   ) = 0;
 | |
|   virtual int fetch_table_checksum(
 | |
|     ha_spider *spider
 | |
|   );
 | |
|   virtual int fetch_table_cardinality(
 | |
|     int mode,
 | |
|     TABLE *table,
 | |
|     longlong *cardinality,
 | |
|     uchar *cardinality_upd,
 | |
|     int bitmap_size
 | |
|   ) = 0;
 | |
|   virtual int fetch_table_mon_status(
 | |
|     int &status
 | |
|   ) = 0;
 | |
|   virtual longlong num_rows() = 0;
 | |
|   virtual uint num_fields() = 0;
 | |
|   virtual void move_to_pos(
 | |
|     longlong pos
 | |
|   ) = 0;
 | |
|   virtual int get_errno() = 0;
 | |
| #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
 | |
|   virtual int fetch_columns_for_discover_table_structure(
 | |
|     spider_string *str,
 | |
|     CHARSET_INFO *access_charset
 | |
|   ) = 0;
 | |
|   virtual int fetch_index_for_discover_table_structure(
 | |
|     spider_string *str,
 | |
|     CHARSET_INFO *access_charset
 | |
|   ) = 0;
 | |
|   virtual int fetch_table_for_discover_table_structure(
 | |
|     spider_string *str,
 | |
|     SPIDER_SHARE *spider_share,
 | |
|     CHARSET_INFO *access_charset
 | |
|   ) = 0;
 | |
| #endif
 | |
|   virtual uint limit_mode();
 | |
| };
 | |
| 
 | |
| class spider_db_conn
 | |
| {
 | |
| public:
 | |
|   SPIDER_CONN    *conn;
 | |
|   uint           dbton_id;
 | |
|   spider_db_conn(
 | |
|     SPIDER_CONN *in_conn
 | |
|   );
 | |
|   virtual ~spider_db_conn() = default;
 | |
|   virtual int init() = 0;
 | |
|   virtual void set_limit(longlong value) {}
 | |
|   virtual bool is_connected() = 0;
 | |
|   virtual void bg_connect() = 0;
 | |
|   virtual int 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
 | |
|   ) = 0;
 | |
|   virtual int ping() = 0;
 | |
|   virtual void bg_disconnect() = 0;
 | |
|   virtual void disconnect() = 0;
 | |
|   virtual int set_net_timeout() = 0;
 | |
|   virtual int exec_query(
 | |
|     const char *query,
 | |
|     uint length,
 | |
|     int quick_mode
 | |
|   ) = 0;
 | |
|   virtual int get_errno() = 0;
 | |
|   virtual const char *get_error() = 0;
 | |
|   virtual bool is_server_gone_error(
 | |
|     int error_num
 | |
|   ) = 0;
 | |
|   virtual bool is_dup_entry_error(
 | |
|     int error_num
 | |
|   ) = 0;
 | |
|   virtual bool is_xa_nota_error(
 | |
|     int error_num
 | |
|   ) = 0;
 | |
|   virtual spider_db_result *store_result(
 | |
|     spider_db_result_buffer **spider_res_buf,
 | |
|     st_spider_db_request_key *request_key,
 | |
|     int *error_num
 | |
|   ) = 0;
 | |
|   virtual spider_db_result *use_result(
 | |
|     ha_spider *spider,
 | |
|     st_spider_db_request_key *request_key,
 | |
|     int *error_num
 | |
|   ) = 0;
 | |
|   virtual int next_result() = 0;
 | |
|   virtual uint affected_rows() = 0;
 | |
|   virtual uint matched_rows() = 0;
 | |
|   virtual bool inserted_info(
 | |
|     spider_db_handler *handler,
 | |
|     ha_copy_info *copy_info
 | |
|   ) = 0;
 | |
|   virtual ulonglong last_insert_id() = 0;
 | |
|   virtual int set_character_set(
 | |
|     const char *csname
 | |
|   ) = 0;
 | |
|   virtual int select_db(
 | |
|     const char *dbname
 | |
|   ) = 0;
 | |
|   virtual int consistent_snapshot(
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool trx_start_in_bulk_sql() = 0;
 | |
|   virtual int start_transaction(
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int commit(
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int rollback(
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool xa_start_in_bulk_sql() = 0;
 | |
|   virtual int xa_start(
 | |
|     XID *xid,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int xa_end(
 | |
|     XID *xid,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int xa_prepare(
 | |
|     XID *xid,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int xa_commit(
 | |
|     XID *xid,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int xa_rollback(
 | |
|     XID *xid,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool set_trx_isolation_in_bulk_sql() = 0;
 | |
|   virtual int set_trx_isolation(
 | |
|     int trx_isolation,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool set_autocommit_in_bulk_sql() = 0;
 | |
|   virtual int set_autocommit(
 | |
|     bool autocommit,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool set_sql_log_off_in_bulk_sql() = 0;
 | |
|   virtual int set_sql_log_off(
 | |
|     bool sql_log_off,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool set_wait_timeout_in_bulk_sql() = 0;
 | |
|   virtual int set_wait_timeout(
 | |
|     int wait_timeout,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool set_sql_mode_in_bulk_sql() = 0;
 | |
|   virtual int set_sql_mode(
 | |
|     sql_mode_t sql_mode,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual bool set_time_zone_in_bulk_sql() = 0;
 | |
|   virtual int set_time_zone(
 | |
|     Time_zone *time_zone,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int fin_loop_check();
 | |
|   virtual int 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
 | |
|   ) = 0;
 | |
|   virtual size_t escape_string(
 | |
|     char *to,
 | |
|     const char *from,
 | |
|     size_t from_length
 | |
|   ) = 0;
 | |
|   virtual bool have_lock_table_list() = 0;
 | |
|   virtual int append_lock_tables(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual int append_unlock_tables(
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
|   virtual uint get_lock_table_hash_count() = 0;
 | |
|   virtual void reset_lock_table_hash() = 0;
 | |
|   virtual uint get_opened_handler_count() = 0;
 | |
|   virtual void reset_opened_handler() = 0;
 | |
|   virtual void set_dup_key_idx(
 | |
|     ha_spider *spider,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual bool cmp_request_key_to_snd(
 | |
|     st_spider_db_request_key *request_key
 | |
|   ) = 0;
 | |
|   virtual uint limit_mode();
 | |
| };
 | |
| 
 | |
| class spider_db_share
 | |
| {
 | |
| protected:
 | |
|   uint               mem_calc_id;
 | |
|   const char         *mem_calc_func_name;
 | |
|   const char         *mem_calc_file_name;
 | |
|   ulong              mem_calc_line_no;
 | |
| public:
 | |
|   uint dbton_id;
 | |
|   st_spider_share *spider_share;
 | |
|   spider_db_share(
 | |
|     st_spider_share *share,
 | |
|     uint dbton_id
 | |
|   ) : dbton_id(dbton_id), spider_share(share) {}
 | |
|   virtual ~spider_db_share() = default;
 | |
|   virtual int init() = 0;
 | |
|   virtual uint get_column_name_length(
 | |
|     uint field_index
 | |
|   ) = 0;
 | |
|   virtual int append_column_name(
 | |
|     spider_string *str,
 | |
|     uint field_index
 | |
|   ) = 0;
 | |
|   virtual int append_column_name_with_alias(
 | |
|     spider_string *str,
 | |
|     uint field_index,
 | |
|     const char *alias,
 | |
|     uint alias_length
 | |
|   ) = 0;
 | |
|   virtual bool need_change_db_table_name() = 0;
 | |
| #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
 | |
|   virtual int discover_table_structure(
 | |
|     SPIDER_TRX *trx,
 | |
|     SPIDER_SHARE *spider_share,
 | |
|     spider_string *str
 | |
|   ) = 0;
 | |
| #endif
 | |
|   virtual bool checksum_support();
 | |
| };
 | |
| 
 | |
| class spider_db_handler
 | |
| {
 | |
| protected:
 | |
|   uint               mem_calc_id;
 | |
|   const char         *mem_calc_func_name;
 | |
|   const char         *mem_calc_file_name;
 | |
|   ulong              mem_calc_line_no;
 | |
| public:
 | |
|   uint dbton_id;
 | |
|   ha_spider *spider;
 | |
|   spider_db_share *db_share;
 | |
|   /* Index of active server, used in query construction. */
 | |
|   int first_link_idx;
 | |
|   bool strict_group_by= false;
 | |
|   bool no_where_cond= false;
 | |
|   spider_db_handler(ha_spider *spider, spider_db_share *db_share) :
 | |
|     dbton_id(db_share->dbton_id), spider(spider), db_share(db_share),
 | |
|     first_link_idx(-1) {}
 | |
|   virtual ~spider_db_handler() = default;
 | |
|   virtual int init() = 0;
 | |
|   virtual int append_index_hint(
 | |
|     spider_string *str,
 | |
|     int link_idx,
 | |
|     ulong sql_type
 | |
|     ) = 0;
 | |
|   virtual int append_table_name_with_adjusting(
 | |
|     spider_string *str,
 | |
|     int link_idx,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_tmp_table_and_sql_for_bka(
 | |
|     const key_range *start_key
 | |
|   ) = 0;
 | |
|   virtual int reuse_tmp_table_and_sql_for_bka() = 0;
 | |
|   virtual int append_union_table_and_sql_for_bka(
 | |
|     const key_range *start_key
 | |
|   ) = 0;
 | |
|   virtual int reuse_union_table_and_sql_for_bka() = 0;
 | |
|   virtual int append_insert_for_recovery(
 | |
|     ulong sql_type,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int append_update(
 | |
|     const TABLE *table,
 | |
|     my_ptrdiff_t ptr_diff
 | |
|   ) = 0;
 | |
|   virtual int append_update(
 | |
|     const TABLE *table,
 | |
|     my_ptrdiff_t ptr_diff,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int append_delete(
 | |
|     const TABLE *table,
 | |
|     my_ptrdiff_t ptr_diff
 | |
|   ) = 0;
 | |
|   virtual int append_delete(
 | |
|     const TABLE *table,
 | |
|     my_ptrdiff_t ptr_diff,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int append_insert_part() = 0;
 | |
|   virtual int append_update_part() = 0;
 | |
|   virtual int append_delete_part() = 0;
 | |
|   virtual int append_update_set_part() = 0;
 | |
|   virtual int append_direct_update_set_part() = 0;
 | |
|   virtual int append_dup_update_pushdown_part(
 | |
|     const char *alias,
 | |
|     uint alias_length
 | |
|   ) = 0;
 | |
|   virtual int append_update_columns_part(
 | |
|     const char *alias,
 | |
|     uint alias_length
 | |
|   ) = 0;
 | |
|   virtual int check_update_columns_part() = 0;
 | |
|   virtual int append_select_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_select(
 | |
|     spider_string *str,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_table_select_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_key_select_part(
 | |
|     ulong sql_type,
 | |
|     uint idx
 | |
|   ) = 0;
 | |
|   virtual int append_minimum_select_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_hint_after_table_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual void set_where_pos(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual void set_where_to_pos(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int check_item_type(
 | |
|     Item *item
 | |
|   ) = 0;
 | |
|   virtual int append_values_connector_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_values_terminator_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_union_table_connector_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_union_table_terminator_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_key_column_values_part(
 | |
|     const key_range *start_key,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_key_column_values_with_name_part(
 | |
|     const key_range *start_key,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_key_where_part(
 | |
|     const key_range *start_key,
 | |
|     const key_range *end_key,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int 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
 | |
|   ) = 0;
 | |
|   virtual int append_where_terminator_part(
 | |
|     ulong sql_type,
 | |
|     bool set_order,
 | |
|     int key_count
 | |
|   ) = 0;
 | |
|   virtual int append_match_where_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_condition_part(
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     ulong sql_type,
 | |
|     bool test_flg
 | |
|   ) = 0;
 | |
|   virtual int append_match_select_part(
 | |
|     ulong sql_type,
 | |
|     const char *alias,
 | |
|     uint alias_length
 | |
|   ) = 0;
 | |
|   virtual int append_sum_select_part(
 | |
|     ulong sql_type,
 | |
|     const char *alias,
 | |
|     uint alias_length
 | |
|   ) = 0;
 | |
|   virtual void set_order_pos(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual void set_order_to_pos(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_group_by_part(
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_key_order_for_merge_with_alias_part(
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_key_order_for_direct_order_limit_with_alias_part(
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_key_order_with_alias_part(
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_limit_part(
 | |
|     longlong offset,
 | |
|     longlong limit,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int reappend_limit_part(
 | |
|     longlong offset,
 | |
|     longlong limit,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_select_lock_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_union_all_start_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_union_all_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_union_all_end_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_multi_range_cnt_part(
 | |
|     ulong sql_type,
 | |
|     uint multi_range_cnt,
 | |
|     bool with_comma
 | |
|   ) = 0;
 | |
|   virtual int append_multi_range_cnt_with_name_part(
 | |
|     ulong sql_type,
 | |
|     uint multi_range_cnt
 | |
|   ) = 0;
 | |
|   virtual int append_open_handler_part(
 | |
|     ulong sql_type,
 | |
|     uint handler_id,
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int append_close_handler_part(
 | |
|     ulong sql_type,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int append_insert_terminator_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_insert_values_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_into_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual void set_insert_to_pos(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_from_part(
 | |
|     ulong sql_type,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int append_delete_all_rows_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_explain_select_part(
 | |
|     const key_range *start_key,
 | |
|     const key_range *end_key,
 | |
|     ulong sql_type,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual bool is_sole_projection_field(
 | |
|     uint16 field_index
 | |
|   ) = 0;
 | |
|   virtual bool is_bulk_insert_exec_period(
 | |
|     bool bulk_end
 | |
|   ) = 0;
 | |
|   virtual bool sql_is_filled_up(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual bool sql_is_empty(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual bool support_multi_split_read() = 0;
 | |
|   virtual bool support_bulk_update() = 0;
 | |
|   virtual int bulk_tmp_table_insert() = 0;
 | |
|   virtual int bulk_tmp_table_insert(
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int bulk_tmp_table_end_bulk_insert() = 0;
 | |
|   virtual int bulk_tmp_table_rnd_init() = 0;
 | |
|   virtual int bulk_tmp_table_rnd_next() = 0;
 | |
|   virtual int bulk_tmp_table_rnd_end() = 0;
 | |
|   virtual bool need_copy_for_update(
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual bool bulk_tmp_table_created() = 0;
 | |
|   virtual int mk_bulk_tmp_table_and_bulk_start() = 0;
 | |
|   virtual void rm_bulk_tmp_table() = 0;
 | |
|   virtual int insert_lock_tables_list(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int append_lock_tables_list(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx,
 | |
|     int *appended
 | |
|   ) = 0;
 | |
|   virtual int realloc_sql(
 | |
|     ulong *realloced
 | |
|   ) = 0;
 | |
|   virtual int reset_sql(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int set_sql_for_exec(
 | |
|     ulong sql_type,
 | |
|     int link_idx,
 | |
|     SPIDER_LINK_IDX_CHAIN *link_idx_chain
 | |
|   ) = 0;
 | |
|   virtual int set_sql_for_exec(
 | |
|     ulong sql_type,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int set_sql_for_exec(
 | |
|     spider_db_copy_table *tgt_ct,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int execute_sql(
 | |
|     ulong sql_type,
 | |
|     SPIDER_CONN *conn,
 | |
|     int quick_mode,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int reset() = 0;
 | |
|   virtual int sts_mode_exchange(
 | |
|     int sts_mode
 | |
|   ) = 0;
 | |
|   virtual int show_table_status(
 | |
|     int link_idx,
 | |
|     int sts_mode,
 | |
|     uint flag
 | |
|   ) = 0;
 | |
|   virtual int crd_mode_exchange(
 | |
|     int crd_mode
 | |
|   ) = 0;
 | |
|   virtual int show_index(
 | |
|     int link_idx,
 | |
|     int crd_mode
 | |
|   ) = 0;
 | |
|   virtual int show_records(
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int checksum_table(
 | |
|     int link_idx
 | |
|   );
 | |
|   virtual int show_last_insert_id(
 | |
|     int link_idx,
 | |
|     ulonglong &last_insert_id
 | |
|   ) = 0;
 | |
|   virtual ha_rows explain_select(
 | |
|     const key_range *start_key,
 | |
|     const key_range *end_key,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int lock_tables(
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int unlock_tables(
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int disable_keys(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int enable_keys(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int check_table(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx,
 | |
|     HA_CHECK_OPT* check_opt
 | |
|   ) = 0;
 | |
|   virtual int repair_table(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx,
 | |
|     HA_CHECK_OPT* check_opt
 | |
|   ) = 0;
 | |
|   virtual int analyze_table(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int optimize_table(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int flush_tables(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx,
 | |
|     bool lock
 | |
|   ) = 0;
 | |
|   virtual int flush_logs(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int insert_opened_handler(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int delete_opened_handler(
 | |
|     SPIDER_CONN *conn,
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual int sync_from_clone_source(
 | |
|     spider_db_handler *dbton_hdl
 | |
|   ) = 0;
 | |
|   virtual bool support_use_handler(
 | |
|     int use_handler
 | |
|   ) = 0;
 | |
|   virtual bool minimum_select_bit_is_set(
 | |
|     uint field_index
 | |
|   ) = 0;
 | |
|   virtual void copy_minimum_select_bitmap(
 | |
|     uchar *bitmap
 | |
|   ) = 0;
 | |
|   virtual int init_union_table_name_pos() = 0;
 | |
|   virtual int set_union_table_name_pos() = 0;
 | |
|   virtual int reset_union_table_name(
 | |
|     spider_string *str,
 | |
|     int link_idx,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_from_and_tables_part(
 | |
|     spider_fields *fields,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_where_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_having_part(
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_item_type_part(
 | |
|     Item *item,
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     bool use_fields,
 | |
|     spider_fields *fields,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_list_item_select_part(
 | |
|     List<Item> *select,
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     bool use_fields,
 | |
|     spider_fields *fields,
 | |
|     ulong sql_type,
 | |
|     int n_aux=0
 | |
|   ) = 0;
 | |
|   virtual int append_group_by_part(
 | |
|     ORDER *order,
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     bool use_fields,
 | |
|     spider_fields *fields,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual int append_order_by_part(
 | |
|     ORDER *order,
 | |
|     const char *alias,
 | |
|     uint alias_length,
 | |
|     bool use_fields,
 | |
|     spider_fields *fields,
 | |
|     ulong sql_type
 | |
|   ) = 0;
 | |
|   virtual bool check_direct_update(
 | |
|     st_select_lex *select_lex,
 | |
|     longlong select_limit,
 | |
|     longlong offset_limit
 | |
|   );
 | |
|   virtual bool check_direct_delete(
 | |
|     st_select_lex *select_lex,
 | |
|     longlong select_limit,
 | |
|     longlong offset_limit
 | |
|   );
 | |
| };
 | |
| 
 | |
| class spider_db_copy_table
 | |
| {
 | |
| public:
 | |
|   uint dbton_id;
 | |
|   spider_db_share *db_share;
 | |
|   spider_db_copy_table(spider_db_share *db_share) :
 | |
|     dbton_id(db_share->dbton_id), db_share(db_share) {}
 | |
|   virtual ~spider_db_copy_table() = default;
 | |
|   virtual int init() = 0;
 | |
|   virtual void set_sql_charset(
 | |
|     CHARSET_INFO *cs
 | |
|   ) = 0;
 | |
|   virtual int append_select_str() = 0;
 | |
|   virtual int append_insert_str(
 | |
|     int insert_flg
 | |
|   ) = 0;
 | |
|   virtual int append_table_columns(
 | |
|     TABLE_SHARE *table_share
 | |
|   ) = 0;
 | |
|   virtual int append_from_str() = 0;
 | |
|   virtual int append_table_name(
 | |
|     int link_idx
 | |
|   ) = 0;
 | |
|   virtual void set_sql_pos() = 0;
 | |
|   virtual void set_sql_to_pos() = 0;
 | |
|   virtual int append_copy_where(
 | |
|     spider_db_copy_table *source_ct,
 | |
|     KEY *key_info,
 | |
|     ulong *last_row_pos,
 | |
|     ulong *last_lengths
 | |
|   ) = 0;
 | |
|   virtual int append_key_order_str(
 | |
|     KEY *key_info,
 | |
|     int start_pos,
 | |
|     bool desc_flg
 | |
|   ) = 0;
 | |
|   virtual int append_limit(
 | |
|     longlong offset,
 | |
|     longlong limit
 | |
|   ) = 0;
 | |
|   virtual int append_into_str() = 0;
 | |
|   virtual int append_open_paren_str() = 0;
 | |
|   virtual int append_values_str() = 0;
 | |
|   virtual int append_select_lock_str(
 | |
|     int lock_mode
 | |
|   ) = 0;
 | |
|   virtual int exec_query(
 | |
|     SPIDER_CONN *conn,
 | |
|     int quick_mode,
 | |
|     int *need_mon
 | |
|   ) = 0;
 | |
|   virtual int copy_rows(
 | |
|     TABLE *table,
 | |
|     SPIDER_DB_ROW *row,
 | |
|     ulong **last_row_pos,
 | |
|     ulong **last_lengths
 | |
|   ) = 0;
 | |
|   virtual int copy_rows(
 | |
|     TABLE *table,
 | |
|     SPIDER_DB_ROW *row
 | |
|   ) = 0;
 | |
|   virtual int append_insert_terminator() = 0;
 | |
|   virtual int copy_insert_values(
 | |
|     spider_db_copy_table *source_ct
 | |
|   ) = 0;
 | |
| };
 | |
| 
 | |
| enum spider_db_access_type
 | |
| {
 | |
|   SPIDER_DB_ACCESS_TYPE_SQL,
 | |
|   SPIDER_DB_ACCESS_TYPE_NOSQL
 | |
| };
 | |
| 
 | |
| #define SPIDER_MATURITY_UNKNOWN      0
 | |
| #define SPIDER_MATURITY_EXPERIMENTAL 1
 | |
| #define SPIDER_MATURITY_ALPHA        2
 | |
| #define SPIDER_MATURITY_BETA         3
 | |
| #define SPIDER_MATURITY_GAMMA        4
 | |
| #define SPIDER_MATURITY_STABLE       5
 | |
| 
 | |
| static const LEX_CSTRING maturity_name[] =
 | |
| {
 | |
|   { STRING_WITH_LEN("Unknown") },
 | |
|   { STRING_WITH_LEN("Experimental") },
 | |
|   { STRING_WITH_LEN("Alpha") },
 | |
|   { STRING_WITH_LEN("Beta") },
 | |
|   { STRING_WITH_LEN("Gamma") },
 | |
|   { STRING_WITH_LEN("Stable") }
 | |
| };
 | |
| 
 | |
| /*
 | |
|   Type of singletons based on the type of the remote database.
 | |
| 
 | |
|   All such singletons are stored in the array `spider_dbton', see
 | |
|   `spider_db_init()'.
 | |
| */
 | |
| typedef struct st_spider_dbton
 | |
| {
 | |
|   uint dbton_id;
 | |
|   const char *wrapper;
 | |
|   enum spider_db_access_type db_access_type;
 | |
|   int (*init)();
 | |
|   int (*deinit)();
 | |
|   spider_db_share *(*create_db_share)(st_spider_share *share);
 | |
|   spider_db_handler *(*create_db_handler)(ha_spider *spider,
 | |
|     spider_db_share *db_share);
 | |
|   spider_db_copy_table *(*create_db_copy_table)(
 | |
|     spider_db_share *db_share);
 | |
|   SPIDER_DB_CONN *(*create_db_conn)(SPIDER_CONN *conn);
 | |
|   bool (*support_direct_join)();
 | |
|   spider_db_util *db_util;
 | |
|   const char *descr;
 | |
|   const char *version_info;
 | |
|   unsigned int maturity;
 | |
| } SPIDER_DBTON;
 | |
| 
 | |
| typedef struct st_spider_position
 | |
| {
 | |
|   SPIDER_DB_ROW          *row;
 | |
|   uint                   pos_mode;
 | |
|   bool                   use_position;
 | |
|   bool                   mrr_with_cnt;
 | |
|   bool                   direct_aggregate;
 | |
|   uint                   sql_kind;
 | |
|   uchar                  *position_bitmap;
 | |
|   st_spider_ft_info      *ft_first;
 | |
|   st_spider_ft_info      *ft_current;
 | |
|   my_off_t               tmp_tbl_pos;
 | |
|   SPIDER_RESULT          *result;
 | |
| } SPIDER_POSITION;
 | |
| 
 | |
| typedef struct st_spider_condition
 | |
| {
 | |
|   COND                   *cond;
 | |
|   st_spider_condition    *next;
 | |
| } SPIDER_CONDITION;
 | |
| 
 | |
| typedef struct st_spider_result
 | |
| {
 | |
|   uint                 dbton_id;
 | |
|   SPIDER_DB_RESULT     *result;
 | |
| #ifndef WITHOUT_SPIDER_BG_SEARCH
 | |
|   volatile
 | |
| #endif
 | |
|     st_spider_result   *prev;
 | |
| #ifndef WITHOUT_SPIDER_BG_SEARCH
 | |
|   volatile
 | |
| #endif
 | |
|     st_spider_result   *next;
 | |
|   SPIDER_POSITION      *first_position; /* for quick mode */
 | |
|   int                  pos_page_size; /* for quick mode */
 | |
|   longlong             record_num;    /* number of rows */
 | |
|   bool                 finish_flg;
 | |
|   bool                 use_position;
 | |
|   bool                 first_pos_use_position;
 | |
|   bool                 tmp_tbl_use_position;
 | |
|   uint                 field_count; /* for quick mode */
 | |
|   TABLE                *result_tmp_tbl;
 | |
|   TMP_TABLE_PARAM      result_tmp_tbl_prm;
 | |
|   THD                  *result_tmp_tbl_thd;
 | |
|   uint                 result_tmp_tbl_inited;
 | |
|   SPIDER_DB_ROW        *tmp_tbl_row;
 | |
| } SPIDER_RESULT;
 | |
| 
 | |
| typedef struct st_spider_result_list
 | |
| {
 | |
| #ifndef WITHOUT_SPIDER_BG_SEARCH
 | |
|   volatile
 | |
| #endif
 | |
|     SPIDER_RESULT        *first;
 | |
| #ifndef WITHOUT_SPIDER_BG_SEARCH
 | |
|   volatile
 | |
| #endif
 | |
|     SPIDER_RESULT        *last;
 | |
| #ifndef WITHOUT_SPIDER_BG_SEARCH
 | |
|   volatile
 | |
| #endif
 | |
|     SPIDER_RESULT         *current;
 | |
|   KEY                     *key_info;
 | |
|   int                     key_order;
 | |
|   spider_string           *sqls;
 | |
|   int                     ha_read_kind;
 | |
|   bool                    have_sql_kind_backup;
 | |
|   uint                    *sql_kind_backup;
 | |
|   uint                    sql_kinds_backup;
 | |
|   bool                    use_union;
 | |
|   bool                    use_both_key;
 | |
|   const key_range         *end_key;
 | |
|   spider_string           *insert_sqls;
 | |
|   spider_string           *update_sqls;
 | |
|   TABLE                   **upd_tmp_tbls;
 | |
|   TMP_TABLE_PARAM         *upd_tmp_tbl_prms;
 | |
|   bool                    tmp_table_join;
 | |
|   uchar                   *tmp_table_join_first;
 | |
|   bool                    tmp_tables_created;
 | |
|   uchar                   *tmp_table_created;
 | |
|   bool                    tmp_table_join_break_after_get_next;
 | |
|   key_part_map            tmp_table_join_key_part_map;
 | |
|   spider_string           *tmp_sqls;
 | |
|   bool                    tmp_reuse_sql;
 | |
|   bool                    sorted;
 | |
|   bool                    desc_flg;
 | |
|   longlong                current_row_num;
 | |
|   longlong                record_num; /* number of rows */
 | |
|   bool                    finish_flg;
 | |
|   longlong                limit_num;
 | |
|   longlong                internal_offset;
 | |
|   longlong                internal_limit;
 | |
|   longlong                split_read;
 | |
|   int                     multi_split_read;
 | |
|   int                     max_order;
 | |
|   int                     quick_mode;
 | |
|   longlong                quick_page_size;
 | |
|   longlong                quick_page_byte;
 | |
|   int                     low_mem_read;
 | |
|   int                     bulk_update_mode;
 | |
|   int                     bulk_update_size;
 | |
|   spider_bulk_upd_start   bulk_update_start;
 | |
|   bool                    check_direct_order_limit;
 | |
|   bool                    direct_order_limit;
 | |
|   /* the limit_offeset, without where condition */
 | |
|   bool                    direct_limit_offset;
 | |
|   bool                    direct_distinct;
 | |
|   bool                    direct_aggregate;
 | |
|   bool                    snap_mrr_with_cnt;
 | |
|   bool                    snap_direct_aggregate;
 | |
|   SPIDER_DB_ROW           *snap_row;
 | |
|   bool                    in_cmp_ref;
 | |
|   bool                    set_split_read;
 | |
|   bool                    insert_dup_update_pushdown;
 | |
|   longlong                split_read_base;
 | |
|   double                  semi_split_read;
 | |
|   longlong                semi_split_read_limit;
 | |
|   longlong                semi_split_read_base;
 | |
|   longlong                first_read;
 | |
|   longlong                second_read;
 | |
|   int                     set_split_read_count;
 | |
|   int                     *casual_read;
 | |
| #ifndef WITHOUT_SPIDER_BG_SEARCH
 | |
|   /* 0:nomal 1:store 2:store end */
 | |
|   volatile
 | |
| #endif
 | |
|     int                   quick_phase;
 | |
|   bool                    keyread;
 | |
|   TABLE                   *table;
 | |
| #ifndef WITHOUT_SPIDER_BG_SEARCH
 | |
|   volatile int            bgs_error;
 | |
|   bool                    bgs_error_with_message;
 | |
|   char                    bgs_error_msg[MYSQL_ERRMSG_SIZE];
 | |
|   volatile bool           bgs_working;
 | |
|   /* 0:not use bg 1:first read 2:second read 3:after second read */
 | |
|   volatile int            bgs_phase;
 | |
|   volatile longlong       bgs_first_read;
 | |
|   volatile longlong       bgs_second_read;
 | |
|   volatile longlong       bgs_split_read;
 | |
|   volatile
 | |
| #endif
 | |
|     SPIDER_RESULT         *bgs_current;
 | |
|   SPIDER_DB_ROW           *tmp_pos_row_first;
 | |
|   /*
 | |
|     A bitmap marking fields to skip when storing results fetched from
 | |
|     the data node to a SPIDER_DB_ROW
 | |
|   */
 | |
|   MY_BITMAP               *skips;
 | |
|   int                     n_aux;
 | |
| } SPIDER_RESULT_LIST;
 | 
