2014-03-24 20:23:24 +01:00
/* Copyright (C) 2012-2013 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 . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA */
# define MYSQL_SERVER 1
# include "mysql_version.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_partition.h"
# include "sql_analyse.h"
# ifdef HANDLER_HAS_DIRECT_AGGREGATE
# include "sql_select.h"
# endif
# endif
# ifdef HAVE_ORACLE_OCI
# include <oci.h>
# include "spd_err.h"
# include "spd_param.h"
# include "spd_db_include.h"
# include "spd_include.h"
# include "spd_db_oracle.h"
# include "ha_spider.h"
# include "spd_conn.h"
# include "spd_db_conn.h"
# include "spd_malloc.h"
# include "spd_sys_table.h"
# include "spd_table.h"
extern struct charset_info_st * spd_charset_utf8_bin ;
extern handlerton * spider_hton_ptr ;
extern pthread_mutex_t spider_open_conn_mutex ;
extern HASH spider_open_connections ;
extern SPIDER_DBTON spider_dbton [ SPIDER_DBTON_SIZE ] ;
extern const char spider_dig_upper [ ] ;
# define SPIDER_DB_WRAPPER_ORACLE "oracle"
# 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_ISO_READ_COMMITTED_STR "set transaction isolation level read committed"
# define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
# define SPIDER_SQL_ISO_SERIALIZABLE_STR "set transaction isolation level serializable"
# define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
# define SPIDER_SQL_START_TRANSACTION_STR "set transaction read write"
# define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
# define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set autocommit off"
# define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
# define SPIDER_SQL_AUTOCOMMIT_ON_STR "set autocommit on"
# define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
# define SPIDER_SQL_LOCK_TABLE_STR "lock table "
# define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
# define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
# define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
# define SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR " in share mode"
# define SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR) - 1)
# define SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR " in exclusive mode"
# define SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR) - 1)
# define SPIDER_SQL_COMMIT_STR "commit"
# define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
# define SPIDER_SQL_SET_NLS_DATE_FORMAT_STR "alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'"
# define SPIDER_SQL_SET_NLS_DATE_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_DATE_FORMAT_STR) - 1
# define SPIDER_SQL_SET_NLS_TIME_FORMAT_STR "alter session set nls_time_format='HH24:MI:SSXFF'"
# define SPIDER_SQL_SET_NLS_TIME_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_TIME_FORMAT_STR) - 1
# define SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR "alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SSXFF'"
# define SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR) - 1
# define SPIDER_SQL_SELECT_WRAPPER_HEAD_STR "select * from ("
# define SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN sizeof(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR) - 1
# define SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR " where rowid in (select rowid from (select rowid, row_number() over (order by "
# define SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN sizeof(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR) - 1
# define SPIDER_SQL_ROW_NUMBER_HEAD_STR ", row_number() over (order by "
# define SPIDER_SQL_ROW_NUMBER_HEAD_LEN sizeof(SPIDER_SQL_ROW_NUMBER_HEAD_STR) - 1
# define SPIDER_SQL_ROW_NUMBER_TAIL_STR "rowid) row_num"
# define SPIDER_SQL_ROW_NUMBER_TAIL_LEN sizeof(SPIDER_SQL_ROW_NUMBER_TAIL_STR) - 1
# define SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR "rowid desc) row_num"
# define SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN sizeof(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR) - 1
# define SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ") where row_num "
# define SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN sizeof(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR) - 1
# define SPIDER_SQL_ROW_NUM_STR "row_num"
# define SPIDER_SQL_ROW_NUM_LEN sizeof(SPIDER_SQL_ROW_NUM_STR) - 1
# define SPIDER_SQL_ROWNUM_STR "rownum"
# define SPIDER_SQL_ROWNUM_LEN sizeof(SPIDER_SQL_ROWNUM_STR) - 1
# define SPIDER_SQL_NEXTVAL_STR ".nextval"
# define SPIDER_SQL_NEXTVAL_LEN sizeof(SPIDER_SQL_NEXTVAL_STR) - 1
# define SPIDER_SQL_CURRVAL_STR ".currval"
# define SPIDER_SQL_CURRVAL_LEN sizeof(SPIDER_SQL_CURRVAL_STR) - 1
# define SPIDER_SQL_FROM_DUAL_STR " from dual"
# define SPIDER_SQL_FROM_DUAL_LEN sizeof(SPIDER_SQL_FROM_DUAL_STR) - 1
# define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
# define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
# define SPIDER_SQL_SELECT_TABLES_STATUS_STR "select `table_rows`,`avg_row_length`,`data_length`,`max_data_length`,`index_length`,`auto_increment`,`create_time`,`update_time`,`check_time` from `information_schema`.`tables` where `table_schema` = "
# define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
# define SPIDER_SQL_LIKE_STR " like "
# define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
# define SPIDER_SQL_LIMIT1_STR "rownum = 1"
# define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
# define SPIDER_SQL_ADD_MONTHS_STR "add_months"
# define SPIDER_SQL_ADD_MONTHS_LEN (sizeof(SPIDER_SQL_ADD_MONTHS_STR) - 1)
# define SPIDER_ORACLE_ERR_BUF_LEN 512
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_table_lock_str [ ] =
{
" in share mode " ,
" in share mode " ,
" in exclusive mode " ,
" in exclusive mode "
} ;
static const int spider_db_table_lock_len [ ] =
{
sizeof ( " in share mode " ) - 1 ,
sizeof ( " in share mode " ) - 1 ,
sizeof ( " in exclusive mode " ) - 1 ,
sizeof ( " in exclusive mode " ) - 1
} ;
int spider_db_oracle_get_error (
sword res ,
dvoid * hndlp ,
int error_num ,
const char * error1 ,
const char * error2 ,
CHARSET_INFO * access_charset ,
char * stored_error_msg
) {
sb4 error_code ;
char buf [ SPIDER_ORACLE_ERR_BUF_LEN ] ;
char buf2 [ SPIDER_ORACLE_ERR_BUF_LEN ] ;
spider_string tmp_str ( buf2 , SPIDER_ORACLE_ERR_BUF_LEN , system_charset_info ) ;
DBUG_ENTER ( " spider_db_oracle_get_error " ) ;
tmp_str . init_calc_mem ( 176 ) ;
tmp_str . length ( 0 ) ;
switch ( res )
{
case OCI_SUCCESS :
DBUG_PRINT ( " info " , ( " spider res=OCI_SUCCESS " ) ) ;
break ;
case OCI_SUCCESS_WITH_INFO :
DBUG_PRINT ( " info " , ( " spider res=OCI_SUCCESS_WITH_INFO " ) ) ;
OCIErrorGet ( hndlp , 1 , NULL , & error_code , ( OraText * ) buf , sizeof ( buf ) ,
OCI_HTYPE_ERROR ) ;
DBUG_PRINT ( " info " , ( " spider error_code=%d error='%s' " , error_code , buf ) ) ;
if ( access_charset & & access_charset - > cset ! = system_charset_info - > cset )
{
tmp_str . append ( buf , strlen ( buf ) , access_charset ) ;
} else {
tmp_str . set ( buf , strlen ( buf ) , system_charset_info ) ;
}
push_warning_printf ( current_thd , SPIDER_WARN_LEVEL_WARN ,
ER_SPIDER_ORACLE_NUM , ER_SPIDER_ORACLE_STR , res , error_code ,
tmp_str . c_ptr_safe ( ) ) ;
break ;
case OCI_NO_DATA :
DBUG_PRINT ( " info " , ( " spider res=OCI_NO_DATA " ) ) ;
DBUG_RETURN ( HA_ERR_END_OF_FILE ) ;
case OCI_ERROR :
DBUG_PRINT ( " info " , ( " spider res=OCI_ERROR " ) ) ;
OCIErrorGet ( hndlp , 1 , NULL , & error_code , ( OraText * ) buf , sizeof ( buf ) ,
OCI_HTYPE_ERROR ) ;
DBUG_PRINT ( " info " , ( " spider error_code=%d error='%s' " , error_code , buf ) ) ;
if ( error_code = = 1 )
{
DBUG_PRINT ( " info " , ( " spider found dupp key " ) ) ;
if ( stored_error_msg )
strmov ( stored_error_msg , buf ) ;
DBUG_RETURN ( HA_ERR_FOUND_DUPP_KEY ) ;
}
if ( error_num )
{
if ( error1 )
{
if ( error2 )
{
my_printf_error ( error_num , error1 , MYF ( 0 ) , error2 ) ;
} else {
my_printf_error ( error_num , error1 , MYF ( 0 ) ) ;
}
} else if ( error2 ) {
my_error ( error_num , MYF ( 0 ) , error2 ) ;
} else {
my_error ( error_num , MYF ( 0 ) ) ;
}
}
if ( access_charset & & access_charset - > cset ! = system_charset_info - > cset )
{
tmp_str . append ( buf , strlen ( buf ) , access_charset ) ;
} else {
tmp_str . set ( buf , strlen ( buf ) , system_charset_info ) ;
}
my_printf_error ( ER_SPIDER_ORACLE_NUM , ER_SPIDER_ORACLE_STR , MYF ( 0 ) ,
res , error_code , tmp_str . c_ptr_safe ( ) ) ;
if ( error_num )
{
DBUG_RETURN ( error_num ) ;
} else {
DBUG_RETURN ( ER_SPIDER_ORACLE_NUM ) ;
}
case OCI_INVALID_HANDLE :
case OCI_NEED_DATA :
if ( res = = OCI_INVALID_HANDLE )
DBUG_PRINT ( " info " , ( " spider res=OCI_INVALID_HANDLE " ) ) ;
else
DBUG_PRINT ( " info " , ( " spider res=OCI_NEED_DATA " ) ) ;
default :
DBUG_PRINT ( " info " , ( " spider res=%d " , res ) ) ;
if ( error_num )
{
if ( error1 )
{
if ( error2 )
{
my_printf_error ( error_num , error1 , MYF ( 0 ) , error2 ) ;
} else {
my_printf_error ( error_num , error1 , MYF ( 0 ) ) ;
}
} else if ( error2 ) {
my_error ( error_num , MYF ( 0 ) , error2 ) ;
} else {
my_error ( error_num , MYF ( 0 ) ) ;
}
}
my_printf_error ( ER_SPIDER_ORACLE_NUM , ER_SPIDER_ORACLE_STR , MYF ( 0 ) ,
res , 0 , " " ) ;
if ( error_num )
{
DBUG_RETURN ( error_num ) ;
} else {
DBUG_RETURN ( ER_SPIDER_ORACLE_NUM ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_init ( )
{
DBUG_ENTER ( " spider_oracle_init " ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_deinit ( )
{
DBUG_ENTER ( " spider_oracle_deinit " ) ;
DBUG_RETURN ( 0 ) ;
}
spider_db_share * spider_oracle_create_share (
SPIDER_SHARE * share
) {
DBUG_ENTER ( " spider_oracle_create_share " ) ;
DBUG_RETURN ( new spider_oracle_share ( share ) ) ;
}
spider_db_handler * spider_oracle_create_handler (
ha_spider * spider ,
spider_db_share * db_share
) {
DBUG_ENTER ( " spider_oracle_create_handler " ) ;
DBUG_RETURN ( new spider_oracle_handler ( spider ,
( spider_oracle_share * ) db_share ) ) ;
}
spider_db_copy_table * spider_oracle_create_copy_table (
spider_db_share * db_share
) {
DBUG_ENTER ( " spider_oracle_create_copy_table " ) ;
DBUG_RETURN ( new spider_oracle_copy_table (
( spider_oracle_share * ) db_share ) ) ;
}
SPIDER_DB_CONN * spider_oracle_create_conn (
SPIDER_CONN * conn
) {
DBUG_ENTER ( " spider_oracle_create_conn " ) ;
DBUG_RETURN ( new spider_db_oracle ( conn ) ) ;
}
spider_db_oracle_util spider_db_oracle_utility ;
SPIDER_DBTON spider_dbton_oracle = {
0 ,
SPIDER_DB_WRAPPER_ORACLE ,
SPIDER_DB_ACCESS_TYPE_SQL ,
spider_oracle_init ,
spider_oracle_deinit ,
spider_oracle_create_share ,
spider_oracle_create_handler ,
spider_oracle_create_copy_table ,
spider_oracle_create_conn ,
& spider_db_oracle_utility
} ;
spider_db_oracle_row : : spider_db_oracle_row ( ) :
spider_db_row ( spider_dbton_oracle . dbton_id ) ,
db_conn ( NULL ) , result ( NULL ) ,
ind ( NULL ) , val ( NULL ) , rlen ( NULL ) , ind_first ( NULL ) , val_first ( NULL ) ,
rlen_first ( NULL ) , val_str ( NULL ) , val_str_first ( NULL ) , defnp ( NULL ) ,
lobhp ( NULL ) , colhp ( NULL ) , coltp ( NULL ) , colsz ( NULL ) , field_count ( 0 ) ,
row_size ( NULL ) , row_size_first ( NULL ) , access_charset ( NULL ) , cloned ( FALSE )
{
DBUG_ENTER ( " spider_db_oracle_row::spider_db_oracle_row " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_VOID_RETURN ;
}
spider_db_oracle_row : : ~ spider_db_oracle_row ( )
{
DBUG_ENTER ( " spider_db_oracle_row::~spider_db_oracle_row " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
deinit ( ) ;
DBUG_VOID_RETURN ;
}
int spider_db_oracle_row : : store_to_field (
Field * field ,
CHARSET_INFO * access_charset
) {
DBUG_ENTER ( " spider_db_oracle_row::store_to_field " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider ind=%d " , * ind ) ) ;
if ( * ind = = - 1 )
{
DBUG_PRINT ( " info " , ( " spider field is null " ) ) ;
field - > set_null ( ) ;
field - > reset ( ) ;
} else {
DBUG_PRINT ( " info " , ( " spider field->type()=%u " , field - > type ( ) ) ) ;
field - > set_notnull ( ) ;
if ( field - > type ( ) = = MYSQL_TYPE_YEAR )
{
field - > store ( val_str - > ptr ( ) , 4 ,
field - > table - > s - > table_charset ) ;
} else if ( field - > type ( ) = = MYSQL_TYPE_DATE )
{
field - > store ( val_str - > ptr ( ) , 10 ,
field - > table - > s - > table_charset ) ;
} else if ( field - > type ( ) = = MYSQL_TYPE_TIME )
{
field - > store ( val_str - > ptr ( ) + 11 , 8 ,
field - > table - > s - > table_charset ) ;
} else {
DBUG_PRINT ( " info " , ( " spider val_str->length()=%u " , val_str - > length ( ) ) ) ;
if ( field - > flags & BLOB_FLAG )
{
DBUG_PRINT ( " info " , ( " spider blob field " ) ) ;
( ( Field_blob * ) field ) - > set_ptr (
val_str - > length ( ) , ( uchar * ) val_str - > ptr ( ) ) ;
} else {
field - > store ( val_str - > ptr ( ) , val_str - > length ( ) ,
field - > table - > s - > table_charset ) ;
}
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_row : : append_to_str (
spider_string * str
) {
DBUG_ENTER ( " spider_db_oracle_row::append_to_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( val_str - > length ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( val_str - > ptr ( ) , val_str - > length ( ) ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_row : : append_escaped_to_str (
spider_string * str ,
uint dbton_id
) {
DBUG_ENTER ( " spider_db_oracle_row::append_escaped_to_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/*
spider_string tmp_str ( * val , * rlen , str - > charset ( ) ) ;
tmp_str . init_calc_mem ( 174 ) ;
tmp_str . length ( * rlen ) ;
# ifndef DBUG_OFF
tmp_str . c_ptr_safe ( ) ;
# endif
if ( str - > reserve ( * rlen * 2 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
util . append_escaped ( str , tmp_str . get_str ( ) ) ;
*/
if ( str - > reserve ( val_str - > length ( ) * 2 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
spider_dbton [ dbton_id ] . db_util - > append_escaped_util ( str , val_str - > get_str ( ) ) ;
DBUG_RETURN ( 0 ) ;
}
void spider_db_oracle_row : : first ( )
{
DBUG_ENTER ( " spider_db_oracle_row::first " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider ind_first=%p " , ind_first ) ) ;
ind = ind_first ;
DBUG_PRINT ( " info " , ( " spider val_first=%p " , val_first ) ) ;
val = val_first ;
DBUG_PRINT ( " info " , ( " spider rlen_first=%p " , rlen_first ) ) ;
rlen = rlen_first ;
DBUG_PRINT ( " info " , ( " spider row_size_first=%p " , row_size_first ) ) ;
row_size = row_size_first ;
DBUG_PRINT ( " info " , ( " spider val_str_first=%p " , val_str_first ) ) ;
val_str = val_str_first ;
DBUG_VOID_RETURN ;
}
void spider_db_oracle_row : : next ( )
{
DBUG_ENTER ( " spider_db_oracle_row::next " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
ind + + ;
val + + ;
rlen + + ;
row_size + + ;
val_str + + ;
DBUG_VOID_RETURN ;
}
bool spider_db_oracle_row : : is_null ( )
{
DBUG_ENTER ( " spider_db_oracle_row::is_null " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( ( * ind = = - 1 ) ) ;
}
int spider_db_oracle_row : : val_int ( )
{
DBUG_ENTER ( " spider_db_oracle_row::val_int " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( ( * ind ! = - 1 ) ? atoi ( * val ) : 0 ) ;
}
double spider_db_oracle_row : : val_real ( )
{
DBUG_ENTER ( " spider_db_oracle_row::val_real " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( ( * ind ! = - 1 ) ? my_atof ( * val ) : 0.0 ) ;
}
my_decimal * spider_db_oracle_row : : val_decimal (
my_decimal * decimal_value ,
CHARSET_INFO * access_charset
) {
DBUG_ENTER ( " spider_db_oracle_row::val_decimal " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( * ind = = - 1 )
DBUG_RETURN ( NULL ) ;
# ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
decimal_operation_results ( str2my_decimal ( 0 , * val , * rlen , access_charset ,
decimal_value ) , " " , " " ) ;
# else
decimal_operation_results ( str2my_decimal ( 0 , * val , * rlen , access_charset ,
decimal_value ) ) ;
# endif
DBUG_RETURN ( decimal_value ) ;
}
SPIDER_DB_ROW * spider_db_oracle_row : : clone ( )
{
uint i ;
spider_db_oracle_row * clone_row ;
DBUG_ENTER ( " spider_db_oracle_row::clone " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! ( clone_row = new spider_db_oracle_row ( ) ) )
{
DBUG_RETURN ( NULL ) ;
}
clone_row - > db_conn = db_conn ;
clone_row - > result = result ;
clone_row - > field_count = field_count ;
clone_row - > access_charset = access_charset ;
clone_row - > cloned = TRUE ;
if ( clone_row - > init ( ) )
{
delete clone_row ;
DBUG_RETURN ( NULL ) ;
}
memcpy ( clone_row - > ind , ind_first , sizeof ( ub2 ) * field_count * 4 +
sizeof ( ulong ) * field_count ) ;
for ( i = 0 ; i < field_count ; i + + )
{
if ( clone_row - > val_str [ i ] . copy ( val_str_first [ i ] ) )
{
delete clone_row ;
DBUG_RETURN ( NULL ) ;
}
}
DBUG_RETURN ( ( SPIDER_DB_ROW * ) clone_row ) ;
}
int spider_db_oracle_row : : store_to_tmp_table (
TABLE * tmp_table ,
spider_string * str
) {
uint i ;
DBUG_ENTER ( " spider_db_oracle_row::store_to_tmp_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
for ( i = 0 ; i < field_count ; i + + )
{
if ( row_size_first [ i ] )
{
if ( str - > reserve ( val_str_first [ i ] . length ( ) ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( val_str_first [ i ] . ptr ( ) , val_str_first [ i ] . length ( ) ) ;
}
}
tmp_table - > field [ 0 ] - > set_notnull ( ) ;
tmp_table - > field [ 0 ] - > store (
( const char * ) row_size_first ,
sizeof ( ulong ) * 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_notnull ( ) ;
tmp_table - > field [ 2 ] - > store (
( char * ) ind_first , ( uint ) ( sizeof ( sb2 ) * field_count ) , & my_charset_bin ) ;
DBUG_RETURN ( tmp_table - > file - > ha_write_row ( tmp_table - > record [ 0 ] ) ) ;
}
int spider_db_oracle_row : : init ( )
{
char * tmp_val ;
uint i ;
DBUG_ENTER ( " spider_db_oracle_row::init " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if (
! ( ind = ( sb2 * )
spider_bulk_malloc ( spider_current_trx , 161 , MYF ( MY_WME | MY_ZEROFILL ) ,
& ind , sizeof ( sb2 ) * field_count ,
& rlen , sizeof ( ub2 ) * field_count ,
& coltp , sizeof ( ub2 ) * field_count ,
& colsz , sizeof ( ub2 ) * field_count ,
& row_size , sizeof ( ulong ) * field_count ,
& val , sizeof ( char * ) * field_count ,
& tmp_val , MAX_FIELD_WIDTH * field_count ,
& defnp , sizeof ( OCIDefine * ) * field_count ,
& lobhp , sizeof ( OCILobLocator * ) * field_count ,
& colhp , sizeof ( OCIParam * ) * field_count ,
NullS )
) | |
! ( val_str = new spider_string [ field_count ] )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
ind_first = ind ;
val_first = val ;
rlen_first = rlen ;
row_size_first = row_size ;
val_str_first = val_str ;
for ( i = 0 ; i < field_count ; i + + )
{
val [ i ] = tmp_val ;
val_str [ i ] . init_calc_mem ( 177 ) ;
val_str [ i ] . set ( tmp_val , MAX_FIELD_WIDTH , access_charset ) ;
tmp_val + = MAX_FIELD_WIDTH ;
}
DBUG_RETURN ( 0 ) ;
}
void spider_db_oracle_row : : deinit ( )
{
uint i ;
DBUG_ENTER ( " spider_db_oracle_row::deinit " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! cloned )
{
for ( i = 0 ; i < field_count ; i + + )
{
if ( defnp & & defnp [ i ] )
{
OCIHandleFree ( defnp [ i ] , OCI_HTYPE_DEFINE ) ;
defnp [ i ] = NULL ;
}
if ( lobhp & & lobhp [ i ] )
{
OCIDescriptorFree ( lobhp [ i ] , OCI_DTYPE_LOB ) ;
lobhp [ i ] = NULL ;
}
}
}
if ( val_str_first )
{
delete [ ] val_str_first ;
val_str_first = NULL ;
}
if ( ind_first )
{
spider_free ( spider_current_trx , ind_first , MYF ( 0 ) ) ;
ind_first = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_db_oracle_row : : define ( )
{
sword res ;
uint i ;
DBUG_ENTER ( " spider_db_oracle_row::define " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
for ( i = 0 ; i < field_count ; i + + )
{
if ( coltp [ i ] = = SQLT_BLOB )
{
res = OCIDescriptorAlloc ( db_conn - > envhp , ( dvoid * * ) & lobhp [ i ] ,
OCI_DTYPE_LOB , 0 , 0 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_RETURN (
spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL , NULL ,
access_charset , NULL ) ) ;
}
res = OCIDefineByPos ( result - > stmtp , & defnp [ i ] , db_conn - > errhp , i + 1 ,
& lobhp [ i ] , 0 , SQLT_BLOB , & ind [ i ] , & rlen [ i ] , NULL ,
OCI_DEFAULT ) ;
} else if ( coltp [ i ] = = SQLT_DAT )
{
res = OCIDefineByPos ( result - > stmtp , & defnp [ i ] , db_conn - > errhp , i + 1 ,
( char * ) val_str [ i ] . ptr ( ) + 20 , sizeof ( ub1 ) * 7 , SQLT_DAT , & ind [ i ] ,
& rlen [ i ] , NULL , OCI_DEFAULT ) ;
} else {
if ( val_str [ i ] . alloc ( colsz [ i ] ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
res = OCIDefineByPos ( result - > stmtp , & defnp [ i ] , db_conn - > errhp , i + 1 ,
( char * ) val_str [ i ] . ptr ( ) , colsz [ i ] , SQLT_CHR , & ind [ i ] , & rlen [ i ] , NULL ,
OCI_DEFAULT ) ;
}
if ( res ! = OCI_SUCCESS )
{
DBUG_RETURN (
spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL , NULL ,
access_charset , NULL ) ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_row : : fetch ( )
{
sword res ;
uint i ;
DBUG_ENTER ( " spider_db_oracle_row::fetch " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
for ( i = 0 ; i < field_count ; i + + )
{
if ( ind [ i ] = = - 1 )
{
DBUG_PRINT ( " info " , ( " spider NULL " ) ) ;
val_str [ i ] . length ( 0 ) ;
} else {
if ( coltp [ i ] = = SQLT_BLOB )
{
DBUG_PRINT ( " info " , ( " spider SQLT_BLOB " ) ) ;
oraub8 len ;
res = OCILobGetLength2 ( db_conn - > svchp , db_conn - > errhp , lobhp [ i ] , & len ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_RETURN (
spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL , NULL ,
access_charset , NULL ) ) ;
}
# ifndef DBUG_OFF
{
ulonglong print_len = len ;
DBUG_PRINT ( " info " , ( " spider len=%llu " , print_len ) ) ;
}
# endif
if ( val_str [ i ] . alloc ( len ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
res = OCILobRead2 ( db_conn - > svchp , db_conn - > errhp , lobhp [ i ] , & len ,
NULL , 1 , ( char * ) val_str [ i ] . ptr ( ) , len , OCI_ONE_PIECE , NULL , NULL ,
0 , 0 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_RETURN (
spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL , NULL ,
access_charset , NULL ) ) ;
}
# ifndef DBUG_OFF
{
ulonglong print_len = len ;
DBUG_PRINT ( " info " , ( " spider lenb=%llu " , print_len ) ) ;
}
# endif
val_str [ i ] . length ( len ) ;
} else if ( coltp [ i ] = = SQLT_DAT )
{
DBUG_PRINT ( " info " , ( " spider SQLT_DAT " ) ) ;
char * val = ( char * ) val_str [ i ] . ptr ( ) ;
ub1 * src = ( ub1 * ) val + 20 ;
val_str [ i ] . length ( 19 ) ;
if ( src [ 0 ] < 100 )
my_sprintf ( val , ( val , " 0000-00-00 00:00:00 " ) ) ;
else
my_sprintf ( val , ( val , " %02u%02u-%02u-%02u %02u:%02u:%02u " ,
src [ 0 ] - 100 , src [ 1 ] - 100 , src [ 2 ] , src [ 3 ] ,
src [ 4 ] - 1 , src [ 5 ] - 1 , src [ 6 ] - 1 ) ) ;
} else {
val_str [ i ] . length ( rlen [ i ] ) ;
}
}
row_size [ i ] = val_str [ i ] . length ( ) ;
}
DBUG_RETURN ( 0 ) ;
}
spider_db_oracle_result : : spider_db_oracle_result ( ) :
spider_db_result ( spider_dbton_oracle . dbton_id ) ,
db_conn ( NULL ) , stmtp ( NULL ) , field_count ( 0 ) , access_charset ( NULL ) ,
fetched ( FALSE )
{
DBUG_ENTER ( " spider_db_oracle_result::spider_db_oracle_result " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_VOID_RETURN ;
}
spider_db_oracle_result : : ~ spider_db_oracle_result ( )
{
DBUG_ENTER ( " spider_db_oracle_result::~spider_db_oracle_result " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
free_result ( ) ;
DBUG_VOID_RETURN ;
}
bool spider_db_oracle_result : : has_result ( )
{
DBUG_ENTER ( " spider_db_oracle_result::has_result " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( stmtp ) ;
}
void spider_db_oracle_result : : free_result ( )
{
DBUG_ENTER ( " spider_db_oracle_result::free_result " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( stmtp )
{
OCIHandleFree ( stmtp , OCI_HTYPE_STMT ) ;
stmtp = NULL ;
}
DBUG_VOID_RETURN ;
}
SPIDER_DB_ROW * spider_db_oracle_result : : current_row ( )
{
DBUG_ENTER ( " spider_db_oracle_result::current_row " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( ( SPIDER_DB_ROW * ) row . clone ( ) ) ;
}
SPIDER_DB_ROW * spider_db_oracle_result : : fetch_row ( )
{
sword res ;
DBUG_ENTER ( " spider_db_oracle_result::fetch_row " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
row . ind = row . ind_first ;
row . val = row . val_first ;
row . rlen = row . rlen_first ;
row . row_size = row . row_size_first ;
row . val_str = row . val_str_first ;
if ( fetched )
{
/* already fetched */
fetched = FALSE ;
} else {
res = OCIStmtFetch2 ( stmtp , db_conn - > errhp , 1 , OCI_FETCH_NEXT , 0 ,
OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
store_error_num = spider_db_oracle_get_error ( res , db_conn - > errhp , 0 ,
NULL , NULL , access_charset , NULL ) ;
DBUG_RETURN ( NULL ) ;
}
}
if ( ( store_error_num = row . fetch ( ) ) )
{
DBUG_RETURN ( NULL ) ;
}
DBUG_RETURN ( ( SPIDER_DB_ROW * ) & row ) ;
}
SPIDER_DB_ROW * spider_db_oracle_result : : fetch_row_from_result_buffer (
spider_db_result_buffer * spider_res_buf
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle_result::fetch_row_from_result_buffer " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
row . ind = row . ind_first ;
row . val = row . val_first ;
row . rlen = row . rlen_first ;
row . row_size = row . row_size_first ;
row . val_str = row . val_str_first ;
if ( fetched )
{
/* already fetched */
fetched = FALSE ;
} else {
res = OCIStmtFetch2 ( stmtp , db_conn - > errhp , 1 , OCI_FETCH_NEXT , 0 ,
OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
store_error_num = spider_db_oracle_get_error ( res , db_conn - > errhp , 0 ,
NULL , NULL , access_charset , NULL ) ;
DBUG_RETURN ( NULL ) ;
}
}
if ( ( store_error_num = row . fetch ( ) ) )
{
DBUG_RETURN ( NULL ) ;
}
DBUG_RETURN ( ( SPIDER_DB_ROW * ) & row ) ;
}
SPIDER_DB_ROW * spider_db_oracle_result : : fetch_row_from_tmp_table (
TABLE * tmp_table
) {
uint i ;
const char * str ;
spider_string tmp_str1 , tmp_str2 , tmp_str3 ;
DBUG_ENTER ( " spider_db_oracle_result::fetch_row_from_tmp_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
tmp_str1 . init_calc_mem ( 175 ) ;
tmp_str2 . init_calc_mem ( 178 ) ;
tmp_str3 . init_calc_mem ( 179 ) ;
tmp_table - > field [ 0 ] - > val_str ( tmp_str1 . get_str ( ) ) ;
tmp_table - > field [ 1 ] - > val_str ( tmp_str2 . get_str ( ) ) ;
tmp_table - > field [ 2 ] - > val_str ( tmp_str3 . get_str ( ) ) ;
tmp_str1 . mem_calc ( ) ;
tmp_str2 . mem_calc ( ) ;
tmp_str3 . mem_calc ( ) ;
row . ind = row . ind_first ;
row . val = row . val_first ;
row . rlen = row . rlen_first ;
row . row_size = row . row_size_first ;
row . val_str = row . val_str_first ;
DBUG_PRINT ( " info " , ( " spider tmp_str1.length()=%u " , tmp_str1 . length ( ) ) ) ;
DBUG_PRINT ( " info " , ( " spider tmp_str2.length()=%u " , tmp_str2 . length ( ) ) ) ;
DBUG_PRINT ( " info " , ( " spider tmp_str3.length()=%u " , tmp_str3 . length ( ) ) ) ;
memcpy ( row . ind , tmp_str3 . ptr ( ) , tmp_str3 . length ( ) ) ;
memcpy ( row . row_size , tmp_str1 . ptr ( ) , tmp_str1 . length ( ) ) ;
row . field_count = tmp_str1 . length ( ) / sizeof ( ulong ) ;
str = tmp_str2 . ptr ( ) ;
for ( i = 0 ; i < row . field_count ; i + + )
{
row . val_str [ i ] . length ( 0 ) ;
if ( row . row_size [ i ] )
{
if ( row . val_str [ i ] . reserve ( row . row_size [ i ] ) )
{
store_error_num = HA_ERR_OUT_OF_MEM ;
DBUG_RETURN ( NULL ) ;
}
row . val_str [ i ] . q_append ( str , row . row_size [ i ] ) ;
str + = row . row_size [ i ] ;
}
}
DBUG_RETURN ( ( SPIDER_DB_ROW * ) & row ) ;
}
int spider_db_oracle_result : : fetch_table_status (
int mode ,
ha_rows & records ,
ulong & mean_rec_length ,
ulonglong & data_file_length ,
ulonglong & max_data_file_length ,
ulonglong & index_file_length ,
ulonglong & auto_increment_value ,
time_t & create_time ,
time_t & update_time ,
time_t & check_time
) {
DBUG_ENTER ( " spider_db_oracle_result::fetch_table_status " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
records = 2 ;
mean_rec_length = 65535 ;
data_file_length = 65535 ;
max_data_file_length = 65535 ;
index_file_length = 65535 ;
/*
auto_increment_value = 0 ;
*/
create_time = ( time_t ) 0 ;
update_time = ( time_t ) 0 ;
check_time = ( time_t ) 0 ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_result : : fetch_table_records (
int mode ,
ha_rows & records
) {
DBUG_ENTER ( " spider_db_oracle_result::fetch_table_records " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! fetch_row ( ) )
{
records = 0 ;
} else {
records = row . val_int ( ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_result : : fetch_table_cardinality (
int mode ,
TABLE * table ,
longlong * cardinality ,
uchar * cardinality_upd ,
int bitmap_size
) {
DBUG_ENTER ( " spider_db_oracle_result::fetch_table_cardinality " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_result : : fetch_table_mon_status (
int & status
) {
DBUG_ENTER ( " spider_db_oracle_result::fetch_table_mon_status " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
status = SPIDER_LINK_MON_OK ;
DBUG_RETURN ( 0 ) ;
}
longlong spider_db_oracle_result : : num_rows ( )
{
sword res ;
ub4 rowcnt ;
DBUG_ENTER ( " spider_db_oracle_result::num_rows " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
res = OCIAttrGet ( stmtp , OCI_HTYPE_STMT , & rowcnt , 0 ,
OCI_ATTR_ROW_COUNT , db_conn - > errhp ) ;
if ( res ! = OCI_SUCCESS )
{
spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL , NULL ,
access_charset , NULL ) ;
DBUG_RETURN ( 0 ) ;
}
DBUG_PRINT ( " info " , ( " spider rowcnt=%u " , rowcnt ) ) ;
DBUG_RETURN ( ( longlong ) rowcnt ) ;
}
uint spider_db_oracle_result : : num_fields ( )
{
sword res ;
ub4 parmcnt ;
DBUG_ENTER ( " spider_db_oracle_result::num_fields " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
res = OCIAttrGet ( stmtp , OCI_HTYPE_STMT , & parmcnt , 0 ,
OCI_ATTR_PARAM_COUNT , db_conn - > errhp ) ;
if ( res ! = OCI_SUCCESS )
{
spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL , NULL ,
access_charset , NULL ) ;
DBUG_RETURN ( 0 ) ;
}
DBUG_RETURN ( ( uint ) parmcnt ) ;
}
void spider_db_oracle_result : : move_to_pos (
longlong pos
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle_result::move_to_pos " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider pos=%lld " , pos ) ) ;
res = OCIStmtFetch2 ( stmtp , db_conn - > errhp , 1 , OCI_FETCH_ABSOLUTE , pos ,
OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL , NULL ,
access_charset , NULL ) ;
}
DBUG_VOID_RETURN ;
}
int spider_db_oracle_result : : set_column_info ( )
{
sword res ;
uint i ;
DBUG_ENTER ( " spider_db_oracle_result::set_column_info " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
for ( i = 0 ; i < field_count ; i + + )
{
res = OCIParamGet ( stmtp , OCI_HTYPE_STMT , db_conn - > errhp ,
( dvoid * * ) & row . colhp [ i ] , i + 1 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_RETURN ( spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL ,
NULL , access_charset , NULL ) ) ;
}
res = OCIAttrGet ( row . colhp [ i ] , OCI_DTYPE_PARAM , & row . coltp [ i ] , NULL ,
OCI_ATTR_DATA_TYPE , db_conn - > errhp ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_RETURN ( spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL ,
NULL , access_charset , NULL ) ) ;
}
res = OCIAttrGet ( row . colhp [ i ] , OCI_DTYPE_PARAM , & row . colsz [ i ] , NULL ,
OCI_ATTR_DATA_SIZE , db_conn - > errhp ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_RETURN ( spider_db_oracle_get_error ( res , db_conn - > errhp , 0 , NULL ,
NULL , access_charset , NULL ) ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_result : : get_errno ( )
{
DBUG_ENTER ( " spider_db_oracle_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_oracle_result : : fetch_columns_for_discover_table_structure (
spider_string * str ,
CHARSET_INFO * access_charset
) {
DBUG_ENTER ( " spider_db_oracle_result::fetch_columns_for_discover_table_structure " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( HA_ERR_WRONG_COMMAND ) ;
}
int spider_db_oracle_result : : fetch_index_for_discover_table_structure (
spider_string * str ,
CHARSET_INFO * access_charset
) {
DBUG_ENTER ( " spider_db_oracle_result::fetch_index_for_discover_table_structure " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( HA_ERR_WRONG_COMMAND ) ;
}
# endif
spider_db_oracle : : spider_db_oracle (
SPIDER_CONN * conn
) : spider_db_conn ( conn ) , envhp ( NULL ) , errhp ( NULL ) , srvhp ( NULL ) , svchp ( NULL ) ,
usrhp ( NULL ) , stmtp ( NULL ) , txnhp ( NULL ) , result ( NULL ) , table_lock_mode ( 0 ) ,
lock_table_hash_inited ( FALSE ) , handler_open_array_inited ( FALSE )
{
DBUG_ENTER ( " spider_db_oracle::spider_db_oracle " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_VOID_RETURN ;
}
spider_db_oracle : : ~ spider_db_oracle ( )
{
DBUG_ENTER ( " spider_db_oracle::~spider_db_oracle " ) ;
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 ) ;
}
if ( lock_table_hash_inited )
{
spider_free_mem_calc ( spider_current_trx ,
lock_table_hash_id ,
lock_table_hash . array . max_element *
lock_table_hash . array . size_of_element ) ;
my_hash_free ( & lock_table_hash ) ;
}
disconnect ( ) ;
DBUG_VOID_RETURN ;
}
int spider_db_oracle : : init ( )
{
DBUG_ENTER ( " spider_db_oracle::init " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if (
my_hash_init ( & lock_table_hash , spd_charset_utf8_bin , 32 , 0 , 0 ,
( my_hash_get_key ) spider_link_get_key , 0 , 0 )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
spider_alloc_calc_mem_init ( lock_table_hash , 199 ) ;
spider_alloc_calc_mem ( spider_current_trx ,
lock_table_hash ,
lock_table_hash . array . max_element *
lock_table_hash . array . size_of_element ) ;
lock_table_hash_inited = TRUE ;
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 , 164 ) ;
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_oracle : : is_connected ( )
{
DBUG_ENTER ( " spider_db_oracle::is_connected " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( svchp ) ;
}
void spider_db_oracle : : bg_connect ( )
{
sword res ;
DBUG_ENTER ( " spider_db_oracle::bg_connect " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
res = OCIEnvNlsCreate ( & envhp , OCI_DEFAULT , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ;
/*
res = OCIEnvCreate ( & envhp , OCI_THREADED , 0 , 0 , 0 , 0 , 0 , 0 ) ;
*/
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider create environment error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
goto error ;
}
DBUG_PRINT ( " info " , ( " spider OCI init envhp=%p " , envhp ) ) ;
res = OCIHandleAlloc ( envhp , ( dvoid * * ) & errhp , OCI_HTYPE_ERROR , 0 , 0 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider create error handler error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
DBUG_PRINT ( " info " , ( " spider OCI init errhp=%p " , errhp ) ) ;
res = OCIHandleAlloc ( envhp , ( dvoid * * ) & srvhp , OCI_HTYPE_SERVER , 0 , 0 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider create server handler error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
DBUG_PRINT ( " info " , ( " spider OCI init srvhp=%p " , srvhp ) ) ;
res = OCIServerAttach ( srvhp , errhp , ( OraText * ) tgt_host , strlen ( tgt_host ) ,
OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider attach server error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
res = OCIHandleAlloc ( envhp , ( dvoid * * ) & svchp , OCI_HTYPE_SVCCTX , 0 , 0 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider create service context error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
DBUG_PRINT ( " info " , ( " spider OCI init svchp=%p " , svchp ) ) ;
res = OCIAttrSet ( svchp , OCI_HTYPE_SVCCTX , srvhp , 0 , OCI_ATTR_SERVER , errhp ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider set server attr error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
res = OCIHandleAlloc ( envhp , ( dvoid * * ) & usrhp , OCI_HTYPE_SESSION , 0 , 0 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider create session handler error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
DBUG_PRINT ( " info " , ( " spider OCI init usrhp=%p " , usrhp ) ) ;
res = OCIAttrSet ( usrhp , OCI_HTYPE_SESSION ,
tgt_username , strlen ( tgt_username ) , OCI_ATTR_USERNAME , errhp ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider set username attr error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
res = OCIAttrSet ( usrhp , OCI_HTYPE_SESSION ,
tgt_password , strlen ( tgt_password ) , OCI_ATTR_PASSWORD , errhp ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider set password attr error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
res = OCISessionBegin ( svchp , errhp , usrhp , OCI_CRED_RDBMS , OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider session begin error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
DBUG_PRINT ( " info " , ( " spider OCISessionBegin " ) ) ;
// set the session in the context handle
res = OCIAttrSet ( svchp , OCI_HTYPE_SVCCTX , usrhp , 0 , OCI_ATTR_SESSION , errhp ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider set session attr error " ) ) ;
stored_error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
bg_disconnect ( ) ;
goto error ;
}
if (
( stored_error_num = exec_query ( SPIDER_SQL_SET_NLS_DATE_FORMAT_STR ,
SPIDER_SQL_SET_NLS_DATE_FORMAT_LEN , - 1 ) ) | |
( stored_error_num = exec_query ( SPIDER_SQL_SET_NLS_TIME_FORMAT_STR ,
SPIDER_SQL_SET_NLS_TIME_FORMAT_LEN , - 1 ) ) | |
( stored_error_num = exec_query ( SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR ,
SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_LEN , - 1 ) )
) {
DBUG_PRINT ( " info " , ( " spider init connection error " ) ) ;
bg_disconnect ( ) ;
goto error ;
}
DBUG_VOID_RETURN ;
error :
strmov ( stored_error_msg , spider_stmt_da_message ( current_thd ) ) ;
current_thd - > clear_error ( ) ;
DBUG_VOID_RETURN ;
}
int spider_db_oracle : : 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
) {
int error_num ;
DBUG_ENTER ( " spider_db_oracle::connect " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
this - > tgt_host = tgt_host ;
this - > tgt_username = tgt_username ;
this - > tgt_password = tgt_password ;
this - > tgt_port = tgt_port ;
this - > tgt_socket = tgt_socket ;
this - > server_name = server_name ;
this - > connect_retry_count = connect_retry_count ;
this - > connect_retry_interval = connect_retry_interval ;
if ( ( error_num = spider_create_conn_thread ( conn ) ) )
DBUG_RETURN ( error_num ) ;
spider_bg_conn_simple_action ( conn , SPIDER_BG_SIMPLE_CONNECT ) ;
if ( stored_error_num )
{
my_message ( stored_error_num , stored_error_msg , MYF ( 0 ) ) ;
DBUG_RETURN ( stored_error_num ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : ping (
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle::ping " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
res = OCIPing ( svchp , errhp , OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider ping error %d " , res ) ) ;
DBUG_RETURN ( ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM ) ;
}
DBUG_RETURN ( 0 ) ;
}
void spider_db_oracle : : bg_disconnect ( )
{
DBUG_ENTER ( " spider_db_oracle::bg_disconnect " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( result )
{
delete result ;
result = NULL ;
}
if ( txnhp )
{
DBUG_PRINT ( " info " , ( " spider OCI free txnhp=%p " , txnhp ) ) ;
OCIHandleFree ( txnhp , OCI_HTYPE_TRANS ) ;
txnhp = NULL ;
}
if ( stmtp )
{
DBUG_PRINT ( " info " , ( " spider OCI free stmtp=%p " , stmtp ) ) ;
OCIHandleFree ( stmtp , OCI_HTYPE_STMT ) ;
stmtp = NULL ;
}
if ( svchp & & errhp & & usrhp )
{
DBUG_PRINT ( " info " , ( " spider OCISessionEnd " ) ) ;
OCISessionEnd ( svchp , errhp , usrhp , OCI_DEFAULT ) ;
}
if ( usrhp )
{
DBUG_PRINT ( " info " , ( " spider OCI free usrhp=%p " , usrhp ) ) ;
OCIHandleFree ( usrhp , OCI_HTYPE_SESSION ) ;
usrhp = NULL ;
}
if ( svchp )
{
DBUG_PRINT ( " info " , ( " spider OCI free svchp=%p " , svchp ) ) ;
OCIHandleFree ( svchp , OCI_HTYPE_SVCCTX ) ;
svchp = NULL ;
}
if ( srvhp )
{
DBUG_PRINT ( " info " , ( " spider OCI free srvhp=%p " , srvhp ) ) ;
OCIServerDetach ( srvhp , errhp , OCI_DEFAULT ) ;
OCIHandleFree ( srvhp , OCI_HTYPE_SERVER ) ;
srvhp = NULL ;
}
if ( errhp )
{
DBUG_PRINT ( " info " , ( " spider OCI free errhp=%p " , errhp ) ) ;
OCIHandleFree ( errhp , OCI_HTYPE_ERROR ) ;
errhp = NULL ;
}
if ( envhp )
{
DBUG_PRINT ( " info " , ( " spider OCI free envhp=%p " , envhp ) ) ;
OCIHandleFree ( envhp , OCI_HTYPE_ENV ) ;
envhp = NULL ;
}
DBUG_VOID_RETURN ;
}
void spider_db_oracle : : disconnect ( )
{
DBUG_ENTER ( " spider_db_oracle::disconnect " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! conn - > bg_init )
DBUG_VOID_RETURN ;
spider_bg_conn_simple_action ( conn , SPIDER_BG_SIMPLE_DISCONNECT ) ;
DBUG_VOID_RETURN ;
}
int spider_db_oracle : : set_net_timeout ( )
{
DBUG_ENTER ( " spider_db_oracle::set_net_timeout " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : exec_query (
const char * query ,
uint length ,
int quick_mode
) {
sword res ;
int error_num ;
DBUG_ENTER ( " spider_db_oracle::exec_query " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( spider_param_general_log ( ) )
{
const char * tgt_str = conn - > tgt_host ;
uint32 tgt_len = conn - > tgt_host_length ;
spider_string tmp_query_str ( length + conn - > tgt_wrapper_length +
tgt_len + ( SPIDER_SQL_SPACE_LEN * 2 ) ) ;
tmp_query_str . init_calc_mem ( 232 ) ;
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 ( query , length ) ;
general_log_write ( current_thd , COM_QUERY , tmp_query_str . ptr ( ) ,
tmp_query_str . length ( ) ) ;
}
stored_error_num = 0 ;
if ( table_lock_mode & & ! conn - > in_before_query )
{
DBUG_PRINT ( " info " , ( " spider table_lock_mode=%d " , table_lock_mode ) ) ;
table_lock_mode = 0 ;
if ( ( error_num = exec_query ( exec_lock_sql - > ptr ( ) , exec_lock_sql - > length ( ) ,
- 1 ) ) ) {
DBUG_RETURN ( error_num ) ;
}
}
if ( length )
{
if ( result )
{
delete result ;
result = NULL ;
}
if ( ! stmtp )
{
DBUG_PRINT ( " info " , ( " spider create stmt " ) ) ;
res = OCIHandleAlloc ( envhp , ( dvoid * * ) & stmtp , OCI_HTYPE_STMT , 0 , 0 ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider create stmt handler error " ) ) ;
DBUG_RETURN ( set_error ( res , errhp , 0 , NULL , NULL ) ) ;
}
}
res = OCIStmtPrepare ( stmtp , errhp , ( OraText * ) query , length ,
OCI_NTV_SYNTAX , OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider stmt prepare error " ) ) ;
DBUG_RETURN ( set_error ( res , errhp , 0 , NULL , NULL ) ) ;
}
/*
if ( ( result = new spider_db_oracle_result ( ) ) )
{
result - > db_conn = this ;
result - > stmtp = stmtp ;
stmtp = NULL ;
result - > field_count = result - > num_fields ( ) ;
result - > row . field_count = result - > field_count ;
result - > row . db_conn = this ;
result - > row . result = result ;
if ( ( error_num = result - > row . init ( ) ) )
{
delete result ;
result = NULL ;
DBUG_RETURN ( error_num ) ;
}
} else {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
*/
/* select statement check */
ub4 iters ;
if (
! strncasecmp ( query , " select " , sizeof ( " select " ) - 1 ) | |
! strncasecmp ( query , " (select " , sizeof ( " (select " ) - 1 )
) {
iters = 0 ;
} else {
iters = 1 ;
}
if ( quick_mode )
{
DBUG_PRINT ( " info " , ( " spider use OCI_DEFAULT " ) ) ;
res = OCIStmtExecute ( svchp , stmtp , errhp , iters , 0 , NULL , NULL ,
OCI_DEFAULT ) ;
} else {
DBUG_PRINT ( " info " , ( " spider use OCI_STMT_SCROLLABLE_READONLY " ) ) ;
res = OCIStmtExecute ( svchp , stmtp , errhp , iters , 0 , NULL , NULL ,
OCI_STMT_SCROLLABLE_READONLY ) ;
/*
if ( res = = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider fetch last for row count " ) ) ;
res = OCIStmtFetch2 ( result - > stmtp , errhp , 1 , OCI_FETCH_LAST , 0 ,
OCI_DEFAULT ) ;
}
if ( res = = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider fetch first for row count " ) ) ;
res = OCIStmtFetch2 ( result - > stmtp , errhp , 1 , OCI_FETCH_FIRST , 0 ,
OCI_DEFAULT ) ;
}
*/
}
if ( res = = OCI_SUCCESS & & iters )
{
DBUG_PRINT ( " info " , ( " spider get row count " ) ) ;
ub4 row_count ;
res = OCIAttrGet ( stmtp , OCI_HTYPE_STMT , & row_count , 0 ,
OCI_ATTR_ROW_COUNT , errhp ) ;
update_rows = ( uint ) row_count ;
DBUG_PRINT ( " info " , ( " spider row_count=%u " , update_rows ) ) ;
}
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider stmt execute error " ) ) ;
error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
if ( error_num = = HA_ERR_END_OF_FILE )
DBUG_RETURN ( 0 ) ;
DBUG_RETURN ( error_num ) ;
}
if ( ( result = new spider_db_oracle_result ( ) ) )
{
result - > db_conn = this ;
result - > stmtp = stmtp ;
stmtp = NULL ;
result - > field_count = result - > num_fields ( ) ;
result - > row . field_count = result - > field_count ;
result - > row . db_conn = this ;
result - > row . result = result ;
result - > row . access_charset = conn - > access_charset ;
result - > access_charset = conn - > access_charset ;
if (
( error_num = result - > row . init ( ) ) | |
( error_num = result - > set_column_info ( ) )
) {
delete result ;
result = NULL ;
DBUG_RETURN ( error_num ) ;
}
result - > row . define ( ) ;
} else {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
if ( ! quick_mode & & ! iters )
{
if ( res = = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider fetch last for row count " ) ) ;
res = OCIStmtFetch2 ( result - > stmtp , errhp , 1 , OCI_FETCH_LAST , 0 ,
OCI_DEFAULT ) ;
}
if ( res = = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider fetch first for row count " ) ) ;
res = OCIStmtFetch2 ( result - > stmtp , errhp , 1 , OCI_FETCH_FIRST , 0 ,
OCI_DEFAULT ) ;
}
if ( res ! = OCI_SUCCESS )
{
DBUG_PRINT ( " info " , ( " spider stmt execute error " ) ) ;
error_num = set_error ( res , errhp , 0 , NULL , NULL ) ;
if ( error_num = = HA_ERR_END_OF_FILE )
DBUG_RETURN ( 0 ) ;
DBUG_RETURN ( error_num ) ;
}
result - > fetched = TRUE ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : get_errno ( )
{
DBUG_ENTER ( " spider_db_oracle::get_errno " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider stored_error=%d " , stored_error_num ) ) ;
DBUG_RETURN ( stored_error_num ) ;
}
const char * spider_db_oracle : : get_error ( )
{
DBUG_ENTER ( " spider_db_oracle::get_error " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider error=%s " , stored_error ) ) ;
DBUG_RETURN ( stored_error ) ;
}
bool spider_db_oracle : : is_server_gone_error (
int error_num
) {
DBUG_ENTER ( " spider_db_oracle::is_server_gone_error " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
DBUG_RETURN ( FALSE ) ;
}
bool spider_db_oracle : : is_dup_entry_error (
int error_num
) {
DBUG_ENTER ( " spider_db_oracle::is_dup_entry_error " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( error_num = = HA_ERR_FOUND_DUPP_KEY )
DBUG_RETURN ( TRUE ) ;
DBUG_RETURN ( FALSE ) ;
}
bool spider_db_oracle : : is_xa_nota_error (
int error_num
) {
DBUG_ENTER ( " spider_db_oracle::is_xa_nota_error " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
DBUG_RETURN ( FALSE ) ;
}
spider_db_result * spider_db_oracle : : store_result (
spider_db_result_buffer * * spider_res_buf ,
st_spider_db_request_key * request_key ,
int * error_num
) {
spider_db_oracle_result * tmp_result = result ;
DBUG_ENTER ( " spider_db_oracle::store_result " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( ! spider_res_buf ) ;
if ( stored_error_num = = HA_ERR_END_OF_FILE )
{
* error_num = HA_ERR_END_OF_FILE ;
DBUG_RETURN ( NULL ) ;
}
* error_num = 0 ;
result = NULL ;
DBUG_RETURN ( tmp_result ) ;
}
spider_db_result * spider_db_oracle : : use_result (
st_spider_db_request_key * request_key ,
int * error_num
) {
spider_db_oracle_result * tmp_result = result ;
DBUG_ENTER ( " spider_db_oracle::use_result " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( stored_error_num = = HA_ERR_END_OF_FILE )
{
* error_num = HA_ERR_END_OF_FILE ;
DBUG_RETURN ( NULL ) ;
}
* error_num = 0 ;
result = NULL ;
DBUG_RETURN ( tmp_result ) ;
}
int spider_db_oracle : : next_result ( )
{
DBUG_ENTER ( " spider_db_oracle::next_result " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
DBUG_RETURN ( - 1 ) ;
}
uint spider_db_oracle : : affected_rows ( )
{
DBUG_ENTER ( " spider_db_oracle::affected_rows " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( update_rows ) ;
}
ulonglong spider_db_oracle : : last_insert_id ( )
{
DBUG_ENTER ( " spider_db_oracle::last_insert_id " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( stored_last_insert_id ) ;
}
int spider_db_oracle : : set_character_set (
const char * csname
) {
DBUG_ENTER ( " spider_db_oracle::set_character_set " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* TODO: develop later */
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : select_db (
const char * dbname
) {
DBUG_ENTER ( " spider_db_oracle::select_db " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* nothing to do for oracle */
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : consistent_snapshot (
int * need_mon
) {
DBUG_ENTER ( " spider_db_oracle::consistent_snapshot " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* nothing to do for oracle */
DBUG_RETURN ( 0 ) ;
}
bool spider_db_oracle : : trx_start_in_bulk_sql ( )
{
DBUG_ENTER ( " spider_db_oracle::trx_start_in_bulk_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_db_oracle : : start_transaction (
int * need_mon
) {
DBUG_ENTER ( " spider_db_oracle::start_transaction " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( conn - > in_before_query )
{
if ( conn - > queued_semi_trx_isolation )
{
if ( conn - > queued_semi_trx_isolation_val ! = conn - > trx_isolation )
{
/* nothing to do */
DBUG_RETURN ( 0 ) ;
}
} else if ( conn - > queued_trx_isolation )
{
if ( conn - > queued_trx_isolation_val ! = conn - > trx_isolation )
{
/* nothing to do */
DBUG_RETURN ( 0 ) ;
}
}
DBUG_RETURN ( set_trx_isolation ( conn - > trx_isolation , need_mon ) ) ;
}
if ( spider_db_query (
conn ,
SPIDER_SQL_START_TRANSACTION_STR ,
SPIDER_SQL_START_TRANSACTION_LEN ,
- 1 ,
need_mon )
)
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : commit (
int * need_mon
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle::commit " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( conn - > table_locked )
{
conn - > table_locked = FALSE ;
spider_current_trx - > locked_connections - - ;
}
res = OCITransCommit ( svchp , errhp , OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
* need_mon = set_error ( res , errhp , 0 , NULL , NULL ) ;
DBUG_RETURN ( * need_mon ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : rollback (
int * need_mon
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle::rollback " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( conn - > table_locked )
{
conn - > table_locked = FALSE ;
spider_current_trx - > locked_connections - - ;
}
if ( svchp & & errhp )
{
res = OCITransRollback ( svchp , errhp , OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
* need_mon = set_error ( res , errhp , 0 , NULL , NULL ) ;
DBUG_RETURN ( * need_mon ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
bool spider_db_oracle : : xa_start_in_bulk_sql ( )
{
DBUG_ENTER ( " spider_db_oracle::xa_start_in_bulk_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_db_oracle : : xa_start (
XID * xid ,
int * need_mon
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle::xa_start " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( txnhp )
{
OCIHandleFree ( txnhp , OCI_HTYPE_TRANS ) ;
txnhp = NULL ;
}
OCIHandleAlloc ( ( dvoid * ) envhp , ( dvoid * * ) & txnhp , OCI_HTYPE_TRANS , 0 , 0 ) ;
OCIAttrSet ( ( dvoid * ) svchp , OCI_HTYPE_SVCCTX , ( dvoid * ) txnhp , 0 ,
OCI_ATTR_TRANS , errhp ) ;
OCIAttrSet ( ( dvoid * ) txnhp , OCI_HTYPE_TRANS , ( dvoid * ) xid , sizeof ( XID ) ,
OCI_ATTR_XID , errhp ) ;
res = OCITransStart ( svchp , errhp , 31622400 , OCI_TRANS_NEW ) ;
if ( res ! = OCI_SUCCESS )
{
* need_mon = set_error ( res , errhp , 0 , NULL , NULL ) ;
DBUG_RETURN ( * need_mon ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : xa_end (
XID * xid ,
int * need_mon
) {
DBUG_ENTER ( " spider_db_oracle::xa_end " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* nothing to do for oracle */
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : xa_prepare (
XID * xid ,
int * need_mon
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle::xa_prepare " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
res = OCITransPrepare ( svchp , errhp , OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
* need_mon = set_error ( res , errhp , 0 , NULL , NULL ) ;
DBUG_RETURN ( * need_mon ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : xa_commit (
XID * xid ,
int * need_mon
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle::xa_commit " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( conn - > table_locked )
{
conn - > table_locked = FALSE ;
spider_current_trx - > locked_connections - - ;
}
res = OCITransCommit ( svchp , errhp , OCI_TRANS_TWOPHASE ) ;
if ( res ! = OCI_SUCCESS )
{
* need_mon = set_error ( res , errhp , 0 , NULL , NULL ) ;
if ( txnhp )
{
OCIHandleFree ( txnhp , OCI_HTYPE_TRANS ) ;
txnhp = NULL ;
}
DBUG_RETURN ( * need_mon ) ;
}
if ( txnhp )
{
OCIHandleFree ( txnhp , OCI_HTYPE_TRANS ) ;
txnhp = NULL ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : xa_rollback (
XID * xid ,
int * need_mon
) {
sword res ;
DBUG_ENTER ( " spider_db_oracle::xa_rollback " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( svchp & & errhp )
{
res = OCITransRollback ( svchp , errhp , OCI_DEFAULT ) ;
if ( res ! = OCI_SUCCESS )
{
* need_mon = set_error ( res , errhp , 0 , NULL , NULL ) ;
if ( txnhp )
{
OCIHandleFree ( txnhp , OCI_HTYPE_TRANS ) ;
txnhp = NULL ;
}
DBUG_RETURN ( * need_mon ) ;
}
}
if ( txnhp )
{
OCIHandleFree ( txnhp , OCI_HTYPE_TRANS ) ;
txnhp = NULL ;
}
DBUG_RETURN ( 0 ) ;
}
bool spider_db_oracle : : set_trx_isolation_in_bulk_sql ( )
{
DBUG_ENTER ( " spider_db_oracle::set_trx_isolation_in_bulk_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_db_oracle : : set_trx_isolation (
int trx_isolation ,
int * need_mon
) {
DBUG_ENTER ( " spider_db_oracle::set_trx_isolation " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( trx_isolation )
{
case ISO_READ_UNCOMMITTED :
case ISO_READ_COMMITTED :
if ( conn - > in_before_query )
{
DBUG_RETURN ( exec_query ( SPIDER_SQL_ISO_READ_COMMITTED_STR ,
SPIDER_SQL_ISO_READ_COMMITTED_LEN , - 1 ) ) ;
}
if ( spider_db_query (
conn ,
SPIDER_SQL_ISO_READ_COMMITTED_STR ,
SPIDER_SQL_ISO_READ_COMMITTED_LEN ,
- 1 ,
need_mon )
)
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
break ;
case ISO_REPEATABLE_READ :
case ISO_SERIALIZABLE :
if ( conn - > in_before_query )
{
DBUG_RETURN ( exec_query ( SPIDER_SQL_ISO_SERIALIZABLE_STR ,
SPIDER_SQL_ISO_SERIALIZABLE_LEN , - 1 ) ) ;
}
if ( spider_db_query (
conn ,
SPIDER_SQL_ISO_SERIALIZABLE_STR ,
SPIDER_SQL_ISO_SERIALIZABLE_LEN ,
- 1 ,
need_mon )
)
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
break ;
default :
DBUG_RETURN ( HA_ERR_UNSUPPORTED ) ;
}
DBUG_RETURN ( 0 ) ;
}
bool spider_db_oracle : : set_autocommit_in_bulk_sql ( )
{
DBUG_ENTER ( " spider_db_oracle::set_autocommit_in_bulk_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_db_oracle : : set_autocommit (
bool autocommit ,
int * need_mon
) {
DBUG_ENTER ( " spider_db_oracle::set_autocommit " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( autocommit )
{
if ( conn - > in_before_query )
{
DBUG_RETURN ( exec_query ( SPIDER_SQL_AUTOCOMMIT_ON_STR ,
SPIDER_SQL_AUTOCOMMIT_ON_LEN , - 1 ) ) ;
}
if ( spider_db_query (
conn ,
SPIDER_SQL_AUTOCOMMIT_ON_STR ,
SPIDER_SQL_AUTOCOMMIT_ON_LEN ,
- 1 ,
need_mon )
)
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
} else {
if ( conn - > in_before_query )
{
DBUG_RETURN ( exec_query ( SPIDER_SQL_AUTOCOMMIT_OFF_STR ,
SPIDER_SQL_AUTOCOMMIT_OFF_LEN , - 1 ) ) ;
}
if ( spider_db_query (
conn ,
SPIDER_SQL_AUTOCOMMIT_OFF_STR ,
SPIDER_SQL_AUTOCOMMIT_OFF_LEN ,
- 1 ,
need_mon )
)
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
}
DBUG_RETURN ( 0 ) ;
}
bool spider_db_oracle : : set_sql_log_off_in_bulk_sql ( )
{
DBUG_ENTER ( " spider_db_oracle::set_sql_log_off_in_bulk_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_db_oracle : : set_sql_log_off (
bool sql_log_off ,
int * need_mon
) {
DBUG_ENTER ( " spider_db_oracle::set_sql_log_off " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* nothing to do */
DBUG_RETURN ( 0 ) ;
}
bool spider_db_oracle : : set_time_zone_in_bulk_sql ( )
{
DBUG_ENTER ( " spider_db_oracle::set_time_zone_in_bulk_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_db_oracle : : set_time_zone (
Time_zone * time_zone ,
int * need_mon
) {
DBUG_ENTER ( " spider_db_oracle::set_time_zone " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* nothing to do */
DBUG_RETURN ( 0 ) ;
}
# if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
int spider_db_oracle : : append_sql (
char * sql ,
ulong sql_length ,
st_spider_db_request_key * request_key
) {
DBUG_ENTER ( " spider_db_oracle::append_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : 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
) {
DBUG_ENTER ( " spider_db_oracle::append_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : 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
) {
DBUG_ENTER ( " spider_db_oracle::append_select " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : append_insert (
uint handler_id ,
SPIDER_DB_HS_STRING_REF_BUFFER * upds ,
st_spider_db_request_key * request_key
) {
DBUG_ENTER ( " spider_db_oracle::append_insert " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : 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
) {
DBUG_ENTER ( " spider_db_oracle::append_update " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : 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
) {
DBUG_ENTER ( " spider_db_oracle::append_delete " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
void spider_db_oracle : : reset_request_queue ( )
{
DBUG_ENTER ( " spider_db_oracle::reset_request_queue " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_VOID_RETURN ;
}
# endif
size_t spider_db_oracle : : escape_string (
char * to ,
const char * from ,
size_t from_length
) {
DBUG_ENTER ( " spider_db_oracle::escape_string " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( util . escape_string ( to , from , from_length , conn - > access_charset ) ) ;
}
bool spider_db_oracle : : have_lock_table_list ( )
{
DBUG_ENTER ( " spider_db_oracle::have_lock_table_list " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( lock_table_hash . records ) ;
}
int spider_db_oracle : : append_lock_tables (
spider_string * str
) {
int error_num ;
ha_spider * tmp_spider ;
int lock_type ;
uint conn_link_idx ;
int tmp_link_idx ;
SPIDER_LINK_FOR_HASH * tmp_link_for_hash ;
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 ;
DBUG_ENTER ( " spider_db_oracle::lock_tables " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ( tmp_link_for_hash =
( SPIDER_LINK_FOR_HASH * ) my_hash_element ( & lock_table_hash , 0 ) ) )
{
if ( ( error_num = spider_db_oracle_utility . append_lock_table_head ( str ) ) )
{
DBUG_RETURN ( error_num ) ;
}
tmp_spider = tmp_link_for_hash - > spider ;
tmp_link_idx = tmp_link_for_hash - > link_idx ;
switch ( tmp_spider - > lock_type )
{
case TL_READ :
lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL ;
break ;
case TL_READ_NO_INSERT :
lock_type = SPIDER_DB_TABLE_LOCK_READ ;
break ;
case TL_WRITE_LOW_PRIORITY :
lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE ;
break ;
case TL_WRITE :
lock_type = SPIDER_DB_TABLE_LOCK_WRITE ;
break ;
default :
// no lock
DBUG_PRINT ( " info " , ( " spider lock_type=%d " , tmp_spider - > lock_type ) ) ;
DBUG_RETURN ( 0 ) ;
}
conn_link_idx = tmp_spider - > conn_link_idx [ tmp_link_idx ] ;
spider_oracle_share * db_share = ( spider_oracle_share * )
tmp_spider - > share - > dbton_share [ conn - > dbton_id ] ;
if ( & db_share - > db_names_str [ conn_link_idx ] )
{
db_name = db_share - > db_names_str [ conn_link_idx ] . ptr ( ) ;
db_name_length = db_share - > db_names_str [ conn_link_idx ] . length ( ) ;
db_name_charset = tmp_spider - > share - > access_charset ;
} else {
db_name = tmp_spider - > share - > tgt_dbs [ conn_link_idx ] ;
db_name_length = tmp_spider - > share - > tgt_dbs_lengths [ conn_link_idx ] ;
db_name_charset = system_charset_info ;
}
if ( & db_share - > table_names_str [ conn_link_idx ] )
{
table_name = db_share - > table_names_str [ conn_link_idx ] . ptr ( ) ;
table_name_length = db_share - > table_names_str [ conn_link_idx ] . length ( ) ;
table_name_charset = tmp_spider - > share - > access_charset ;
} else {
table_name = tmp_spider - > share - > tgt_table_names [ conn_link_idx ] ;
table_name_length =
tmp_spider - > share - > tgt_table_names_lengths [ conn_link_idx ] ;
table_name_charset = system_charset_info ;
}
if ( ( error_num = spider_db_oracle_utility .
append_lock_table_body (
str ,
db_name ,
db_name_length ,
db_name_charset ,
table_name ,
table_name_length ,
table_name_charset ,
lock_type
)
) ) {
my_hash_reset ( & lock_table_hash ) ;
DBUG_RETURN ( error_num ) ;
}
# ifdef HASH_UPDATE_WITH_HASH_VALUE
my_hash_delete_with_hash_value ( & lock_table_hash ,
tmp_link_for_hash - > db_table_str_hash_value , ( uchar * ) tmp_link_for_hash ) ;
# else
my_hash_delete ( & lock_table_hash , ( uchar * ) tmp_link_for_hash ) ;
# endif
if ( ( error_num = spider_db_oracle_utility . append_lock_table_tail ( str ) ) )
{
DBUG_RETURN ( error_num ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle : : append_unlock_tables (
spider_string * str
) {
int error_num ;
DBUG_ENTER ( " spider_db_oracle::append_unlock_tables " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ( error_num = spider_db_oracle_utility . append_unlock_table ( str ) ) )
{
DBUG_RETURN ( error_num ) ;
}
DBUG_RETURN ( 0 ) ;
}
uint spider_db_oracle : : get_lock_table_hash_count ( )
{
DBUG_ENTER ( " spider_db_oracle::get_lock_table_hash_count " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( lock_table_hash . records ) ;
}
void spider_db_oracle : : reset_lock_table_hash ( )
{
DBUG_ENTER ( " spider_db_oracle::reset_lock_table_hash " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
my_hash_reset ( & lock_table_hash ) ;
DBUG_VOID_RETURN ;
}
uint spider_db_oracle : : get_opened_handler_count ( )
{
DBUG_ENTER ( " spider_db_oracle::get_opened_handler_count " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( handler_open_array . elements ) ;
}
void spider_db_oracle : : reset_opened_handler ( )
{
ha_spider * tmp_spider ;
int tmp_link_idx ;
SPIDER_LINK_FOR_HASH * * tmp_link_for_hash ;
DBUG_ENTER ( " spider_db_oracle::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_oracle : : set_dup_key_idx (
ha_spider * spider ,
int link_idx
) {
TABLE * table = spider - > get_table ( ) ;
uint roop_count , pk_idx = table - > s - > primary_key ;
int key_name_length ;
int max_length = 0 ;
char * key_name , * tmp_pos ;
char buf [ SPIDER_ORACLE_ERR_BUF_LEN ] ;
DBUG_ENTER ( " spider_db_oracle::set_dup_key_idx " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider error_str=%s " , stored_error_msg ) ) ;
memcpy ( buf , spider - > share - > tgt_dbs [ link_idx ] ,
spider - > share - > tgt_dbs_lengths [ link_idx ] ) ;
tmp_pos = buf + spider - > share - > tgt_dbs_lengths [ link_idx ] ;
* tmp_pos = ' . ' ;
+ + tmp_pos ;
for ( roop_count = 0 ; roop_count < table - > s - > keys ; roop_count + + )
{
if ( roop_count = = pk_idx )
{
DBUG_PRINT ( " info " , ( " spider pk_idx=%u " , roop_count ) ) ;
int all_link_idx = spider - > conn_link_idx [ link_idx ] ;
key_name = spider - > share - > tgt_pk_names [ all_link_idx ] ;
key_name_length = spider - > share - > tgt_pk_names_lengths [ all_link_idx ] ;
} else {
key_name = table - > s - > key_info [ roop_count ] . name ;
key_name_length = strlen ( key_name ) ;
}
memcpy ( tmp_pos , key_name , key_name_length + 1 ) ;
DBUG_PRINT ( " info " , ( " spider key_name=%s " , key_name ) ) ;
DBUG_PRINT ( " info " , ( " spider full key name=%s " , buf ) ) ;
if (
max_length < key_name_length & &
strcasestr ( stored_error_msg , buf )
) {
max_length = key_name_length ;
spider - > dup_key_idx = roop_count ;
}
}
if ( max_length = = 0 )
spider - > dup_key_idx = ( uint ) - 1 ;
DBUG_PRINT ( " info " , ( " spider dup_key_idx=%d " , spider - > dup_key_idx ) ) ;
DBUG_VOID_RETURN ;
}
bool spider_db_oracle : : cmp_request_key_to_snd (
st_spider_db_request_key * request_key
) {
DBUG_ENTER ( " spider_db_oracle::cmp_request_key_to_snd " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( TRUE ) ;
}
int spider_db_oracle : : set_error (
sword res ,
dvoid * hndlp ,
int error_num ,
const char * error1 ,
const char * error2
) {
DBUG_ENTER ( " spider_db_oracle::set_error " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
stored_error_num =
spider_db_oracle_get_error ( res , hndlp , error_num , error1 , error2 ,
conn - > access_charset , stored_error_msg ) ;
if ( stored_error_num )
stored_error = ER_SPIDER_ORACLE_ERR ;
else
stored_error = " " ;
DBUG_RETURN ( stored_error_num ) ;
}
spider_db_oracle_util : : spider_db_oracle_util ( ) : spider_db_util ( )
{
DBUG_ENTER ( " spider_db_oracle_util::spider_db_oracle_util " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_VOID_RETURN ;
}
spider_db_oracle_util : : ~ spider_db_oracle_util ( )
{
DBUG_ENTER ( " spider_db_oracle_util::~spider_db_oracle_util " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_VOID_RETURN ;
}
int spider_db_oracle_util : : append_name (
spider_string * str ,
const char * name ,
uint name_length
) {
DBUG_ENTER ( " spider_db_oracle_util::append_name " ) ;
str - > q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
str - > q_append ( name , name_length ) ;
str - > q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_name_with_charset (
spider_string * str ,
const char * name ,
uint name_length ,
CHARSET_INFO * name_charset
) {
DBUG_ENTER ( " spider_db_oracle_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 ) ;
}
bool spider_db_oracle_util : : is_name_quote (
const char head_code
) {
DBUG_ENTER ( " spider_db_oracle_util::is_name_quote " ) ;
DBUG_RETURN ( head_code = = * name_quote_str ) ;
}
int spider_db_oracle_util : : append_escaped_name_quote (
spider_string * str
) {
DBUG_ENTER ( " spider_db_oracle_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_oracle_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_oracle_util::append_column_value " ) ;
tmp_str . init_calc_mem ( 181 ) ;
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
*/
if ( field - > result_type ( ) = = STRING_RESULT )
{
DBUG_PRINT ( " info " , ( " spider STRING_RESULT " ) ) ;
if ( str - > reserve ( SPIDER_SQL_VALUE_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
if (
field - > type ( ) = = MYSQL_TYPE_VARCHAR | |
( field - > type ( ) > = MYSQL_TYPE_ENUM & &
field - > type ( ) < = MYSQL_TYPE_GEOMETRY )
) {
DBUG_PRINT ( " info " , ( " spider append_escaped " ) ) ;
char buf2 [ MAX_FIELD_WIDTH ] ;
spider_string tmp_str2 ( buf2 , MAX_FIELD_WIDTH , access_charset ) ;
tmp_str2 . init_calc_mem ( 182 ) ;
tmp_str2 . length ( 0 ) ;
if (
tmp_str2 . append ( ptr - > ptr ( ) , ptr - > length ( ) , field - > charset ( ) ) | |
str - > reserve ( tmp_str2 . length ( ) * 2 ) | |
append_escaped_util ( str , tmp_str2 . get_str ( ) )
)
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
} else if ( str - > append ( * ptr ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
if ( str - > reserve ( SPIDER_SQL_VALUE_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
} else if ( field - > str_needs_quotes ( ) )
{
if ( str - > reserve ( SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr - > length ( ) * 2 + 2 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
append_escaped_util ( str , ptr ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
} else if ( str - > append ( * ptr ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_from_with_alias (
spider_string * str ,
const char * * table_names ,
uint * table_name_lengths ,
const char * * table_aliases ,
uint * table_alias_lengths ,
uint table_count ,
int * table_name_pos ,
bool over_write
) {
uint roop_count , length = 0 ;
DBUG_ENTER ( " spider_db_oracle_util::append_from_with_alias " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! over_write )
{
for ( roop_count = 0 ; roop_count < table_count ; roop_count + + )
length + = table_name_lengths [ roop_count ] + SPIDER_SQL_SPACE_LEN +
table_alias_lengths [ roop_count ] + SPIDER_SQL_COMMA_LEN ;
if ( str - > reserve ( SPIDER_SQL_FROM_LEN + length ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
* table_name_pos = str - > length ( ) ;
}
for ( roop_count = 0 ; roop_count < table_count ; roop_count + + )
{
str - > q_append ( table_names [ roop_count ] , table_name_lengths [ roop_count ] ) ;
str - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
str - > q_append ( table_aliases [ roop_count ] , table_alias_lengths [ roop_count ] ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_trx_isolation (
spider_string * str ,
int trx_isolation
) {
DBUG_ENTER ( " spider_db_oracle_util::append_trx_isolation " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN +
SPIDER_SQL_ISO_READ_COMMITTED_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
if ( str - > length ( ) )
{
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
switch ( trx_isolation )
{
case ISO_READ_UNCOMMITTED :
case ISO_READ_COMMITTED :
str - > q_append ( SPIDER_SQL_ISO_READ_COMMITTED_STR ,
SPIDER_SQL_ISO_READ_COMMITTED_LEN ) ;
break ;
case ISO_REPEATABLE_READ :
case ISO_SERIALIZABLE :
str - > q_append ( SPIDER_SQL_ISO_SERIALIZABLE_STR ,
SPIDER_SQL_ISO_SERIALIZABLE_LEN ) ;
break ;
default :
DBUG_RETURN ( HA_ERR_UNSUPPORTED ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_autocommit (
spider_string * str ,
bool autocommit
) {
DBUG_ENTER ( " spider_db_oracle_util::append_autocommit " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
if ( str - > length ( ) )
{
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
if ( autocommit )
{
str - > q_append ( SPIDER_SQL_AUTOCOMMIT_ON_STR ,
SPIDER_SQL_AUTOCOMMIT_ON_LEN ) ;
} else {
str - > q_append ( SPIDER_SQL_AUTOCOMMIT_OFF_STR ,
SPIDER_SQL_AUTOCOMMIT_OFF_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_sql_log_off (
spider_string * str ,
bool sql_log_off
) {
DBUG_ENTER ( " spider_db_oracle_util::append_sql_log_off " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* nothing to do */
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_time_zone (
spider_string * str ,
Time_zone * time_zone
) {
DBUG_ENTER ( " spider_db_oracle_util::append_time_zone " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
/* nothing to do */
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_start_transaction (
spider_string * str
) {
DBUG_ENTER ( " spider_db_oracle_util::append_start_transaction " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN +
SPIDER_SQL_START_TRANSACTION_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
if ( str - > length ( ) )
{
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
str - > q_append ( SPIDER_SQL_START_TRANSACTION_STR ,
SPIDER_SQL_START_TRANSACTION_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_xa_start (
spider_string * str ,
XID * xid
) {
DBUG_ENTER ( " spider_db_oracle_util::append_xa_start " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_lock_table_head (
spider_string * str
) {
DBUG_ENTER ( " spider_db_oracle_util::append_lock_table_head " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_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_oracle_util::append_lock_table_body " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_LOCK_TABLE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
if ( str - > length ( ) )
{
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
str - > q_append ( SPIDER_SQL_LOCK_TABLE_STR , SPIDER_SQL_LOCK_TABLE_LEN ) ;
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 ) ;
if (
str - > append ( db_name , db_name_length , db_name_charset ) | |
str - > reserve ( ( SPIDER_SQL_NAME_QUOTE_LEN ) * 2 + SPIDER_SQL_DOT_LEN )
) {
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_DOT_STR , SPIDER_SQL_DOT_LEN ) ;
str - > q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
if (
str - > append ( table_name , table_name_length , table_name_charset ) | |
str - > reserve ( SPIDER_SQL_NAME_QUOTE_LEN +
spider_db_table_lock_len [ lock_type ] )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
str - > q_append ( spider_db_table_lock_str [ lock_type ] ,
spider_db_table_lock_len [ lock_type ] ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_lock_table_tail (
spider_string * str
) {
DBUG_ENTER ( " spider_db_oracle_util::append_lock_table_tail " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : append_unlock_table (
spider_string * str
) {
DBUG_ENTER ( " spider_db_oracle_util::append_unlock_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_COMMIT_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_COMMIT_STR , SPIDER_SQL_COMMIT_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_db_oracle_util : : open_item_func (
Item_func * item_func ,
ha_spider * spider ,
spider_string * str ,
const char * alias ,
uint alias_length
) {
uint dbton_id = spider_dbton_oracle . 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 ,
* separete_str = SPIDER_SQL_NULL_CHAR_STR ,
* last_str = SPIDER_SQL_NULL_CHAR_STR ;
int func_name_length = SPIDER_SQL_NULL_CHAR_LEN ,
separete_str_length = SPIDER_SQL_NULL_CHAR_LEN ,
last_str_length = SPIDER_SQL_NULL_CHAR_LEN ;
int use_pushdown_udf ;
DBUG_ENTER ( " spider_db_oracle_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 ) & &
! item_func - > arg_count
) {
if ( str )
str - > length ( str - > length ( ) - SPIDER_SQL_OPEN_PAREN_LEN ) ;
DBUG_RETURN ( spider_db_open_item_int ( item_func , spider , str ,
alias , alias_length , dbton_id ) ) ;
} 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 ] , spider , str ,
alias , alias_length , dbton_id ) ) )
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 ] , spider , str ,
alias , alias_length , dbton_id ) ) )
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 ] , spider , str ,
alias , alias_length , dbton_id ) ) )
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 ] , spider , str ,
alias , alias_length , dbton_id ) ) )
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 , spider , str ,
alias , alias_length , dbton_id ) ) ;
} 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 , spider , str ,
alias , alias_length , dbton_id ) ) ;
} 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 & &
! 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 ( func_name_length = = 12 )
{
if ( ! strncasecmp ( " cast_as_date " , func_name , func_name_length ) )
{
if ( str )
{
str - > length ( str - > length ( ) - SPIDER_SQL_OPEN_PAREN_LEN ) ;
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 ) )
{
if ( str )
{
str - > length ( str - > length ( ) - SPIDER_SQL_OPEN_PAREN_LEN ) ;
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 & &
! 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 , spider , str ,
alias , alias_length , dbton_id ) ) ;
} else if ( func_name_length = = 14 )
{
if ( ! strncasecmp ( " cast_as_binary " , func_name , func_name_length ) )
{
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 ( 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 ) )
{
if ( str )
{
str - > length ( str - > length ( ) - SPIDER_SQL_OPEN_PAREN_LEN ) ;
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 ) )
{
if ( str )
{
str - > length ( str - > length ( ) - SPIDER_SQL_OPEN_PAREN_LEN ) ;
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 ) )
{
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 ( 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 ) )
{
if ( str )
{
str - > length ( str - > length ( ) - SPIDER_SQL_OPEN_PAREN_LEN ) ;
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 ;
switch ( item_date_add_interval - > int_type )
{
case INTERVAL_YEAR :
case INTERVAL_QUARTER :
case INTERVAL_MONTH :
if ( str )
{
if ( str - > reserve ( SPIDER_SQL_ADD_MONTHS_LEN +
SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ADD_MONTHS_STR ,
SPIDER_SQL_ADD_MONTHS_LEN ) ;
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR ,
SPIDER_SQL_OPEN_PAREN_LEN ) ;
}
if ( ( error_num = spider_db_print_item_type ( item_list [ 0 ] , spider ,
str , alias , alias_length , dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( str )
{
if ( item_date_add_interval - > date_sub_interval )
{
if ( str - > reserve ( SPIDER_SQL_COMMA_LEN +
SPIDER_SQL_MINUS_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
str - > q_append ( SPIDER_SQL_MINUS_STR , SPIDER_SQL_MINUS_LEN ) ;
} else {
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 ] , spider ,
str , alias , alias_length , dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( str )
{
if ( item_date_add_interval - > int_type = = INTERVAL_YEAR )
{
func_name = " * 12 " ;
func_name_length = sizeof ( " * 12 " ) - 1 ;
if ( str - > reserve ( func_name_length +
( SPIDER_SQL_CLOSE_PAREN_LEN * 2 ) ) )
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 ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR ,
SPIDER_SQL_CLOSE_PAREN_LEN ) ;
} else if ( item_date_add_interval - > int_type = =
INTERVAL_QUARTER )
{
func_name = " * 3 " ;
func_name_length = sizeof ( " * 3 " ) - 1 ;
if ( str - > reserve ( func_name_length +
( SPIDER_SQL_CLOSE_PAREN_LEN * 2 ) ) )
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 ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR ,
SPIDER_SQL_CLOSE_PAREN_LEN ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_CLOSE_PAREN_LEN * 2 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR ,
SPIDER_SQL_CLOSE_PAREN_LEN ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR ,
SPIDER_SQL_CLOSE_PAREN_LEN ) ;
}
}
break ;
case INTERVAL_WEEK :
case INTERVAL_DAY :
case INTERVAL_HOUR :
case INTERVAL_MINUTE :
case INTERVAL_SECOND :
case INTERVAL_MICROSECOND :
if ( ( error_num = spider_db_print_item_type ( item_list [ 0 ] , spider ,
str , alias , alias_length , dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( str )
{
if ( item_date_add_interval - > date_sub_interval )
{
if ( str - > reserve ( SPIDER_SQL_MINUS_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_MINUS_STR , SPIDER_SQL_MINUS_LEN ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_PLUS_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_PLUS_STR , SPIDER_SQL_PLUS_LEN ) ;
}
}
if ( ( error_num = spider_db_print_item_type ( item_list [ 1 ] , spider ,
str , alias , alias_length , dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( str )
{
if ( item_date_add_interval - > int_type = = INTERVAL_WEEK )
{
func_name = " * 7 " ;
func_name_length = sizeof ( " * 7 " ) - 1 ;
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 ) ;
} else if ( item_date_add_interval - > int_type = = INTERVAL_HOUR )
{
func_name = " / 24 " ;
func_name_length = sizeof ( " / 24 " ) - 1 ;
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 ) ;
} else if ( item_date_add_interval - > int_type = = INTERVAL_MINUTE )
{
func_name = " / 1440 " ;
func_name_length = sizeof ( " / 1440 " ) - 1 ;
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 ) ;
} else if ( item_date_add_interval - > int_type = = INTERVAL_SECOND )
{
func_name = " / 86400 " ;
func_name_length = sizeof ( " / 86400 " ) - 1 ;
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 ) ;
} else if ( item_date_add_interval - > int_type = =
INTERVAL_MICROSECOND )
{
func_name = " / 86400000000 " ;
func_name_length = sizeof ( " / 86400000000 " ) - 1 ;
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 ) ;
} else {
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 ;
default :
DBUG_RETURN ( ER_SPIDER_COND_SKIP_NUM ) ;
}
DBUG_RETURN ( 0 ) ;
break ;
}
}
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 ;
separete_str = SPIDER_SQL_COMMA_STR ;
separete_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 , spider , str ,
alias , alias_length , dbton_id ) ) ;
case Item_func : : CHAR_TYPECAST_FUNC :
{
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 ( 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 :
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 ;
separete_str = SPIDER_SQL_COMMA_STR ;
separete_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 ;
separete_str = SPIDER_SQL_COMMA_STR ;
separete_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 ;
separete_str = SPIDER_SQL_AND_STR ;
separete_str_length = SPIDER_SQL_AND_LEN ;
} else {
func_name = ( char * ) item_func - > func_name ( ) ;
func_name_length = strlen ( func_name ) ;
separete_str = SPIDER_SQL_AND_STR ;
separete_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 ;
separete_str = SPIDER_SQL_COMMA_STR ;
separete_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 ) ) ;
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 , spider , str ,
alias , alias_length , dbton_id ) ) ;
else
DBUG_RETURN ( spider_db_open_item_int ( item_func , spider , str ,
alias , alias_length , dbton_id ) ) ;
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 ) ;
}
separete_str = SPIDER_SQL_COMMA_STR ;
separete_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 ;
separete_str = SPIDER_SQL_COMMA_STR ;
separete_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 ( SPIDER_SQL_MBR_LEN + func_name_length +
SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_MBR_STR , SPIDER_SQL_MBR_LEN ) ;
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 ;
separete_str = SPIDER_SQL_COMMA_STR ;
separete_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 separete_str = %s " , separete_str ) ) ;
DBUG_PRINT ( " info " , ( " spider separete_str_length = %d " , separete_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 , spider , str ,
alias , alias_length , dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( roop_count = = 1 )
{
func_name = separete_str ;
func_name_length = separete_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 , spider , str ,
alias , alias_length , dbton_id ) ) )
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 , spider , str ,
alias , alias_length , dbton_id ) ) )
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 - > 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 ( 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_oracle_util : : open_item_sum_func (
Item_sum * item_sum ,
ha_spider * spider ,
spider_string * str ,
const char * alias ,
uint alias_length
) {
uint dbton_id = spider_dbton_oracle . dbton_id ;
uint roop_count , item_count = item_sum - > get_arg_count ( ) ;
int error_num ;
DBUG_ENTER ( " spider_db_oracle_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 , spider , str ,
alias , alias_length , dbton_id ) ) )
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 , spider , str ,
alias , alias_length , dbton_id ) ) )
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
size_t spider_db_oracle_util : : escape_string (
char * to ,
const char * from ,
size_t from_length ,
CHARSET_INFO * access_charset
) {
DBUG_ENTER ( " spider_db_oracle::escape_string " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( escape_quotes_for_mysql ( access_charset , to , 0 ,
from , from_length ) ) ;
}
int spider_db_oracle_util : : append_escaped_util (
spider_string * to ,
String * from
) {
size_t copy_length ;
DBUG_ENTER ( " spider_db_oracle_util::append_escaped_util " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider to=%s " , to - > c_ptr_safe ( ) ) ) ;
DBUG_PRINT ( " info " , ( " spider from=%s " , from - > c_ptr_safe ( ) ) ) ;
copy_length = escape_string ( ( char * ) to - > ptr ( ) + to - > length ( ) , from - > ptr ( ) ,
from - > length ( ) , to - > charset ( ) ) ;
DBUG_PRINT ( " info " , ( " spider copy_length=%zu " , copy_length ) ) ;
to - > length ( to - > length ( ) + copy_length ) ;
to - > mem_calc ( ) ;
DBUG_RETURN ( 0 ) ;
}
spider_oracle_share : : spider_oracle_share (
st_spider_share * share
) : spider_db_share (
share
) ,
table_select ( NULL ) ,
table_select_pos ( 0 ) ,
key_select ( NULL ) ,
key_select_pos ( NULL ) ,
key_hint ( NULL ) ,
show_table_status ( NULL ) ,
show_records ( NULL ) ,
show_autoinc ( NULL ) ,
show_last_insert_id ( NULL ) ,
show_index ( NULL ) ,
table_names_str ( NULL ) ,
db_names_str ( NULL ) ,
db_table_str ( NULL ) ,
nextval_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 ) ,
nextval_max_length ( 0 ) ,
column_name_str ( NULL ) ,
same_db_table_name ( TRUE ) ,
first_all_link_idx ( - 1 )
{
DBUG_ENTER ( " spider_oracle_share::spider_oracle_share " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
spider_alloc_calc_mem_init ( mem_calc , 220 ) ;
spider_alloc_calc_mem ( spider_current_trx , mem_calc , sizeof ( * this ) ) ;
DBUG_VOID_RETURN ;
}
spider_oracle_share : : ~ spider_oracle_share ( )
{
DBUG_ENTER ( " spider_oracle_share::~spider_oracle_share " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( table_select )
delete [ ] table_select ;
if ( key_select )
delete [ ] key_select ;
if ( key_hint )
delete [ ] key_hint ;
free_show_table_status ( ) ;
free_show_records ( ) ;
free_show_autoinc ( ) ;
free_show_last_insert_id ( ) ;
free_show_index ( ) ;
free_column_name_str ( ) ;
free_table_names_str ( ) ;
if ( key_select_pos )
{
spider_free ( spider_current_trx , key_select_pos , MYF ( 0 ) ) ;
}
spider_free_mem_calc ( spider_current_trx , mem_calc_id , sizeof ( * this ) ) ;
DBUG_VOID_RETURN ;
}
int spider_oracle_share : : init ( )
{
int error_num ;
uint roop_count ;
TABLE_SHARE * table_share = spider_share - > table_share ;
uint keys = table_share ? table_share - > keys : 0 ;
DBUG_ENTER ( " spider_oracle_share::init " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! ( key_select_pos = ( int * )
spider_bulk_alloc_mem ( spider_current_trx , 221 ,
__func__ , __FILE__ , __LINE__ , MYF ( MY_WME | MY_ZEROFILL ) ,
& key_select_pos ,
sizeof ( int ) * keys ,
# ifdef SPIDER_HAS_HASH_VALUE_TYPE
& db_table_str_hash_value ,
sizeof ( my_hash_value_type ) * spider_share - > all_link_count ,
# endif
NullS ) )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
if ( keys > 0 & &
! ( key_hint = new spider_string [ keys ] )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
for ( roop_count = 0 ; roop_count < keys ; roop_count + + )
{
key_hint [ roop_count ] . init_calc_mem ( 190 ) ;
key_hint [ roop_count ] . set_charset ( spider_share - > access_charset ) ;
}
DBUG_PRINT ( " info " , ( " spider key_hint=%p " , key_hint ) ) ;
if (
! ( table_select = new spider_string [ 1 ] ) | |
( keys > 0 & &
! ( key_select = new spider_string [ keys ] )
) | |
( error_num = create_table_names_str ( ) ) | |
( table_share & &
(
( error_num = create_column_name_str ( ) ) | |
( error_num = convert_key_hint_str ( ) ) | |
( error_num = append_show_table_status ( ) ) | |
( error_num = append_show_records ( ) ) | |
( error_num = append_show_autoinc ( ) ) | |
( error_num = append_show_last_insert_id ( ) ) | |
( error_num = append_show_index ( ) )
)
)
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
table_select - > init_calc_mem ( 191 ) ;
if ( table_share & & ( error_num = append_table_select ( ) ) )
DBUG_RETURN ( error_num ) ;
for ( roop_count = 0 ; roop_count < keys ; roop_count + + )
{
key_select [ roop_count ] . init_calc_mem ( 192 ) ;
if ( ( error_num = append_key_select ( roop_count ) ) )
DBUG_RETURN ( error_num ) ;
}
DBUG_RETURN ( error_num ) ;
}
uint spider_oracle_share : : get_column_name_length (
uint field_index
) {
DBUG_ENTER ( " spider_oracle_share::get_column_name_length " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( column_name_str [ field_index ] . length ( ) ) ;
}
int spider_oracle_share : : append_column_name (
spider_string * str ,
uint field_index
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_share::append_column_name " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = spider_db_oracle_utility . append_name ( str ,
column_name_str [ field_index ] . ptr ( ) , column_name_str [ field_index ] . length ( ) ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_share : : append_column_name_with_alias (
spider_string * str ,
uint field_index ,
const char * alias ,
uint alias_length
) {
DBUG_ENTER ( " spider_oracle_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 ) ;
}
int spider_oracle_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_oracle_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_oracle_utility . append_name ( str , db_nm , db_nm_len ) ;
str - > q_append ( SPIDER_SQL_DOT_STR , SPIDER_SQL_DOT_LEN ) ;
spider_db_oracle_utility . append_name ( str , table_nm , table_nm_len ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_share : : append_table_name_with_adjusting (
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 ( ) ;
uint db_nm_max_len = db_nm_max_length ;
const char * table_nm = table_names_str [ all_link_idx ] . ptr ( ) ;
uint table_nm_len = table_names_str [ all_link_idx ] . length ( ) ;
uint table_nm_max_len = table_nm_max_length ;
DBUG_ENTER ( " spider_oracle_share::append_table_name_with_adjusting " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
spider_db_oracle_utility . append_name ( str , db_nm , db_nm_len ) ;
str - > q_append ( SPIDER_SQL_DOT_STR , SPIDER_SQL_DOT_LEN ) ;
spider_db_oracle_utility . append_name ( str , table_nm , table_nm_len ) ;
uint length =
db_nm_max_len - db_nm_len +
table_nm_max_len - table_nm_len ;
memset ( ( char * ) str - > ptr ( ) + str - > length ( ) , ' ' , length ) ;
str - > length ( str - > length ( ) + length ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_share : : append_from_with_adjusted_table_name (
spider_string * str ,
int * table_name_pos
) {
const char * db_nm = db_names_str [ 0 ] . ptr ( ) ;
uint db_nm_len = db_names_str [ 0 ] . length ( ) ;
uint db_nm_max_len = db_nm_max_length ;
const char * table_nm = table_names_str [ 0 ] . ptr ( ) ;
uint table_nm_len = table_names_str [ 0 ] . length ( ) ;
uint table_nm_max_len = table_nm_max_length ;
DBUG_ENTER ( " spider_oracle_share::append_from_with_adjusted_table_name " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_FROM_LEN + db_nm_max_length +
SPIDER_SQL_DOT_LEN + table_nm_max_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
* table_name_pos = str - > length ( ) ;
spider_db_oracle_utility . append_name ( str , db_nm , db_nm_len ) ;
str - > q_append ( SPIDER_SQL_DOT_STR , SPIDER_SQL_DOT_LEN ) ;
spider_db_oracle_utility . append_name ( str , table_nm , table_nm_len ) ;
uint length =
db_nm_max_len - db_nm_len +
table_nm_max_len - table_nm_len ;
memset ( ( char * ) str - > ptr ( ) + str - > length ( ) , ' ' , length ) ;
str - > length ( str - > length ( ) + length ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_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_oracle . dbton_id ;
DBUG_ENTER ( " spider_oracle_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 ( 193 ) ;
db_names_str [ roop_count ] . init_calc_mem ( 194 ) ;
db_table_str [ roop_count ] . init_calc_mem ( 195 ) ;
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_oracle_share : : free_table_names_str ( )
{
DBUG_ENTER ( " spider_oracle_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_oracle_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_oracle . dbton_id ;
DBUG_ENTER ( " spider_oracle_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 ( 196 ) ;
str - > set_charset ( spider_share - > access_charset ) ;
if ( ( error_num = spider_db_append_name_with_quote_str ( str ,
( char * ) ( * 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_oracle_share : : free_column_name_str ( )
{
DBUG_ENTER ( " spider_oracle_share::free_column_name_str " ) ;
if ( column_name_str )
{
delete [ ] column_name_str ;
column_name_str = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_share : : convert_key_hint_str ( )
{
spider_string * tmp_key_hint ;
int roop_count ;
TABLE_SHARE * table_share = spider_share - > table_share ;
DBUG_ENTER ( " spider_oracle_share::convert_key_hint_str " ) ;
if ( spider_share - > access_charset - > cset ! = system_charset_info - > cset )
{
/* need convertion */
for ( roop_count = 0 , tmp_key_hint = key_hint ;
roop_count < ( int ) table_share - > keys ; roop_count + + , tmp_key_hint + + )
{
tmp_key_hint - > length ( 0 ) ;
if ( tmp_key_hint - > append ( spider_share - > key_hint - > ptr ( ) ,
spider_share - > key_hint - > length ( ) , system_charset_info ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
} else {
for ( roop_count = 0 , tmp_key_hint = key_hint ;
roop_count < ( int ) table_share - > keys ; roop_count + + , tmp_key_hint + + )
{
if ( tmp_key_hint - > copy ( spider_share - > key_hint [ roop_count ] ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_share : : append_show_table_status ( )
{
int roop_count ;
spider_string * str ;
uint dbton_id = spider_dbton_oracle . dbton_id ;
DBUG_ENTER ( " spider_oracle_append_show_table_status " ) ;
if ( ! ( show_table_status =
new spider_string [ 2 * spider_share - > all_link_count ] ) )
goto error ;
for ( roop_count = 0 ; roop_count < ( int ) spider_share - > all_link_count ;
roop_count + + )
{
show_table_status [ 0 + ( 2 * roop_count ) ] . init_calc_mem ( 197 ) ;
show_table_status [ 1 + ( 2 * roop_count ) ] . init_calc_mem ( 207 ) ;
if ( spider_share - > sql_dbton_ids [ roop_count ] ! = dbton_id )
continue ;
if (
show_table_status [ 0 + ( 2 * roop_count ) ] . reserve (
SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
db_names_str [ roop_count ] . length ( ) +
SPIDER_SQL_LIKE_LEN + table_names_str [ roop_count ] . length ( ) +
( ( SPIDER_SQL_NAME_QUOTE_LEN ) * 2 ) +
( ( SPIDER_SQL_VALUE_QUOTE_LEN ) * 2 ) ) | |
show_table_status [ 1 + ( 2 * roop_count ) ] . reserve (
SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
db_names_str [ roop_count ] . length ( ) +
SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
table_names_str [ roop_count ] . length ( ) +
( ( SPIDER_SQL_VALUE_QUOTE_LEN ) * 4 ) )
)
goto error ;
str = & show_table_status [ 0 + ( 2 * roop_count ) ] ;
str - > q_append (
SPIDER_SQL_SHOW_TABLE_STATUS_STR , SPIDER_SQL_SHOW_TABLE_STATUS_LEN ) ;
str - > q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
str - > q_append ( db_names_str [ roop_count ] . ptr ( ) ,
db_names_str [ roop_count ] . length ( ) ) ;
str - > q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
str - > q_append ( SPIDER_SQL_LIKE_STR , SPIDER_SQL_LIKE_LEN ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( table_names_str [ roop_count ] . ptr ( ) ,
table_names_str [ roop_count ] . length ( ) ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str = & show_table_status [ 1 + ( 2 * roop_count ) ] ;
str - > q_append (
SPIDER_SQL_SELECT_TABLES_STATUS_STR ,
SPIDER_SQL_SELECT_TABLES_STATUS_LEN ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( db_names_str [ roop_count ] . ptr ( ) ,
db_names_str [ roop_count ] . length ( ) ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
str - > q_append ( SPIDER_SQL_TABLE_NAME_STR , SPIDER_SQL_TABLE_NAME_LEN ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( table_names_str [ roop_count ] . ptr ( ) ,
table_names_str [ roop_count ] . length ( ) ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
error :
if ( show_table_status )
{
delete [ ] show_table_status ;
show_table_status = NULL ;
}
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
void spider_oracle_share : : free_show_table_status ( )
{
DBUG_ENTER ( " spider_oracle_free_show_table_status " ) ;
if ( show_table_status )
{
delete [ ] show_table_status ;
show_table_status = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_share : : append_show_records ( )
{
int roop_count ;
spider_string * str ;
uint dbton_id = spider_dbton_oracle . dbton_id ;
DBUG_ENTER ( " spider_oracle_share::append_show_records " ) ;
if ( ! ( show_records = new spider_string [ spider_share - > all_link_count ] ) )
goto error ;
for ( roop_count = 0 ; roop_count < ( int ) spider_share - > all_link_count ;
roop_count + + )
{
show_records [ roop_count ] . init_calc_mem ( 208 ) ;
if ( spider_share - > sql_dbton_ids [ roop_count ] ! = dbton_id )
continue ;
if (
show_records [ roop_count ] . reserve (
SPIDER_SQL_SHOW_RECORDS_LEN +
db_names_str [ roop_count ] . length ( ) +
SPIDER_SQL_DOT_LEN +
table_names_str [ roop_count ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 )
)
goto error ;
str = & show_records [ roop_count ] ;
str - > q_append ( SPIDER_SQL_SHOW_RECORDS_STR , SPIDER_SQL_SHOW_RECORDS_LEN ) ;
append_table_name ( str , roop_count ) ;
}
DBUG_RETURN ( 0 ) ;
error :
if ( show_records )
{
delete [ ] show_records ;
show_records = NULL ;
}
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
void spider_oracle_share : : free_show_records ( )
{
DBUG_ENTER ( " spider_oracle_share::free_show_records " ) ;
if ( show_records )
{
delete [ ] show_records ;
show_records = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_share : : append_show_autoinc ( )
{
uint roop_count , field_length ;
spider_string * str ;
uint dbton_id = spider_dbton_oracle . dbton_id ;
Field * * found_next_number_field =
spider_share - > table_share - > found_next_number_field ;
DBUG_ENTER ( " spider_oracle_share::append_show_autoinc " ) ;
if ( ! found_next_number_field )
DBUG_RETURN ( 0 ) ;
if ( ! ( show_autoinc = new spider_string [ spider_share - > all_link_count ] ) )
goto error ;
field_length =
column_name_str [ ( * found_next_number_field ) - > field_index ] . length ( ) ;
for ( roop_count = 0 ; roop_count < spider_share - > all_link_count ;
roop_count + + )
{
show_autoinc [ roop_count ] . init_calc_mem ( 224 ) ;
if ( spider_share - > sql_dbton_ids [ roop_count ] ! = dbton_id )
continue ;
if (
show_autoinc [ roop_count ] . reserve (
SPIDER_SQL_SELECT_LEN +
SPIDER_SQL_MAX_LEN +
SPIDER_SQL_OPEN_PAREN_LEN +
field_length +
SPIDER_SQL_CLOSE_PAREN_LEN +
SPIDER_SQL_FROM_LEN +
db_names_str [ roop_count ] . length ( ) +
SPIDER_SQL_DOT_LEN +
table_names_str [ roop_count ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 6 )
)
goto error ;
str = & show_autoinc [ roop_count ] ;
str - > q_append ( SPIDER_SQL_SELECT_STR , SPIDER_SQL_SELECT_LEN ) ;
str - > q_append ( SPIDER_SQL_MAX_STR , SPIDER_SQL_MAX_LEN ) ;
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
append_column_name ( str , ( * found_next_number_field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
str - > q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
append_table_name ( str , roop_count ) ;
}
DBUG_RETURN ( 0 ) ;
error :
if ( show_autoinc )
{
delete [ ] show_autoinc ;
show_autoinc = NULL ;
}
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
void spider_oracle_share : : free_show_autoinc ( )
{
DBUG_ENTER ( " spider_oracle_share::free_show_autoinc " ) ;
if ( show_autoinc )
{
delete [ ] show_autoinc ;
show_autoinc = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_share : : append_show_last_insert_id ( )
{
uint roop_count ;
spider_string * str ;
uint dbton_id = spider_dbton_oracle . dbton_id ;
Field * * found_next_number_field =
spider_share - > table_share - > found_next_number_field ;
uint seq_nm_max_length = 0 ;
DBUG_ENTER ( " spider_oracle_share::append_show_last_insert_id " ) ;
if ( ! found_next_number_field )
DBUG_RETURN ( 0 ) ;
if (
! ( show_last_insert_id = new spider_string [ spider_share - > all_link_count ] ) | |
! ( nextval_str = new spider_string [ spider_share - > all_link_count ] )
)
goto error ;
for ( roop_count = 0 ; roop_count < spider_share - > all_link_count ;
roop_count + + )
{
show_last_insert_id [ roop_count ] . init_calc_mem ( 225 ) ;
nextval_str [ roop_count ] . init_calc_mem ( 226 ) ;
if ( spider_share - > sql_dbton_ids [ roop_count ] ! = dbton_id )
continue ;
if (
show_last_insert_id [ roop_count ] . reserve (
SPIDER_SQL_SELECT_LEN +
spider_share - > tgt_sequence_names_lengths [ roop_count ] +
SPIDER_SQL_CURRVAL_LEN +
SPIDER_SQL_FROM_DUAL_LEN +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 )
)
goto error ;
str = & show_last_insert_id [ roop_count ] ;
str - > q_append ( SPIDER_SQL_SELECT_STR , SPIDER_SQL_SELECT_LEN ) ;
spider_db_oracle_utility . append_name ( str ,
spider_share - > tgt_sequence_names [ roop_count ] ,
spider_share - > tgt_sequence_names_lengths [ roop_count ] ) ;
str - > q_append ( SPIDER_SQL_CURRVAL_STR , SPIDER_SQL_CURRVAL_LEN ) ;
str - > q_append ( SPIDER_SQL_FROM_DUAL_STR , SPIDER_SQL_FROM_DUAL_LEN ) ;
if ( seq_nm_max_length <
spider_share - > tgt_sequence_names_lengths [ roop_count ] )
{
seq_nm_max_length =
spider_share - > tgt_sequence_names_lengths [ roop_count ] ;
}
}
for ( roop_count = 0 ; roop_count < spider_share - > all_link_count ;
roop_count + + )
{
if ( spider_share - > sql_dbton_ids [ roop_count ] ! = dbton_id )
continue ;
if (
nextval_str [ roop_count ] . reserve (
seq_nm_max_length +
SPIDER_SQL_NEXTVAL_LEN +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 )
)
goto error ;
str = & nextval_str [ roop_count ] ;
spider_db_oracle_utility . append_name ( str ,
spider_share - > tgt_sequence_names [ roop_count ] ,
spider_share - > tgt_sequence_names_lengths [ roop_count ] ) ;
str - > q_append ( SPIDER_SQL_NEXTVAL_STR , SPIDER_SQL_NEXTVAL_LEN ) ;
uint length =
seq_nm_max_length - spider_share - > tgt_sequence_names_lengths [ roop_count ] ;
memset ( ( char * ) str - > ptr ( ) + str - > length ( ) , ' ' , length ) ;
str - > length ( str - > length ( ) + length ) ;
nextval_max_length = str - > length ( ) ;
}
DBUG_RETURN ( 0 ) ;
error :
if ( show_last_insert_id )
{
delete [ ] show_last_insert_id ;
show_last_insert_id = NULL ;
}
if ( nextval_str )
{
delete [ ] nextval_str ;
nextval_str = NULL ;
}
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
void spider_oracle_share : : free_show_last_insert_id ( )
{
DBUG_ENTER ( " spider_oracle_share::free_show_last_insert_id " ) ;
if ( show_last_insert_id )
{
delete [ ] show_last_insert_id ;
show_last_insert_id = NULL ;
}
if ( nextval_str )
{
delete [ ] nextval_str ;
nextval_str = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_share : : append_show_index ( )
{
int roop_count ;
spider_string * str ;
uint dbton_id = spider_dbton_oracle . dbton_id ;
DBUG_ENTER ( " spider_oracle_share::append_show_index " ) ;
if ( ! ( show_index = new spider_string [ 2 * spider_share - > all_link_count ] ) )
goto error ;
for ( roop_count = 0 ; roop_count < ( int ) spider_share - > all_link_count ;
roop_count + + )
{
show_index [ 0 + ( 2 * roop_count ) ] . init_calc_mem ( 209 ) ;
show_index [ 1 + ( 2 * roop_count ) ] . init_calc_mem ( 210 ) ;
if ( spider_share - > sql_dbton_ids [ roop_count ] ! = dbton_id )
continue ;
if (
show_index [ 0 + ( 2 * roop_count ) ] . reserve (
SPIDER_SQL_SHOW_INDEX_LEN + db_names_str [ roop_count ] . length ( ) +
SPIDER_SQL_DOT_LEN +
table_names_str [ roop_count ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 ) | |
show_index [ 1 + ( 2 * roop_count ) ] . reserve (
SPIDER_SQL_SELECT_STATISTICS_LEN +
db_names_str [ roop_count ] . length ( ) +
SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
table_names_str [ roop_count ] . length ( ) +
( ( SPIDER_SQL_VALUE_QUOTE_LEN ) * 4 ) +
SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN )
)
goto error ;
str = & show_index [ 0 + ( 2 * roop_count ) ] ;
str - > q_append (
SPIDER_SQL_SHOW_INDEX_STR , SPIDER_SQL_SHOW_INDEX_LEN ) ;
append_table_name ( str , roop_count ) ;
str = & show_index [ 1 + ( 2 * roop_count ) ] ;
str - > q_append (
SPIDER_SQL_SELECT_STATISTICS_STR , SPIDER_SQL_SELECT_STATISTICS_LEN ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( db_names_str [ roop_count ] . ptr ( ) ,
db_names_str [ roop_count ] . length ( ) ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
str - > q_append ( SPIDER_SQL_TABLE_NAME_STR , SPIDER_SQL_TABLE_NAME_LEN ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( table_names_str [ roop_count ] . ptr ( ) ,
table_names_str [ roop_count ] . length ( ) ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
str - > q_append ( SPIDER_SQL_GROUP_STR , SPIDER_SQL_GROUP_LEN ) ;
str - > q_append ( SPIDER_SQL_COLUMN_NAME_STR , SPIDER_SQL_COLUMN_NAME_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
error :
if ( show_index )
{
delete [ ] show_index ;
show_index = NULL ;
}
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
void spider_oracle_share : : free_show_index ( )
{
DBUG_ENTER ( " spider_oracle_share::free_show_index " ) ;
if ( show_index )
{
delete [ ] show_index ;
show_index = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_share : : append_table_select ( )
{
Field * * field ;
uint field_length ;
spider_string * str = table_select ;
TABLE_SHARE * table_share = spider_share - > table_share ;
DBUG_ENTER ( " spider_oracle_share::append_table_select " ) ;
for ( field = table_share - > field ; * field ; field + + )
{
field_length = column_name_str [ ( * field ) - > field_index ] . length ( ) ;
if ( str - > reserve ( field_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
append_column_name ( str , ( * field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( append_from_with_adjusted_table_name ( str , & table_select_pos ) ) ;
}
int spider_oracle_share : : append_key_select (
uint idx
) {
KEY_PART_INFO * key_part ;
Field * field ;
uint part_num ;
uint field_length ;
spider_string * str = & key_select [ idx ] ;
TABLE_SHARE * table_share = spider_share - > table_share ;
const KEY * key_info = & table_share - > key_info [ idx ] ;
DBUG_ENTER ( " spider_oracle_share::append_key_select " ) ;
for ( key_part = key_info - > key_part , part_num = 0 ;
part_num < spider_user_defined_key_parts ( key_info ) ; key_part + + , part_num + + )
{
field = key_part - > field ;
field_length = column_name_str [ field - > field_index ] . length ( ) ;
if ( str - > reserve ( field_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( append_from_with_adjusted_table_name ( str , & key_select_pos [ idx ] ) ) ;
}
bool spider_oracle_share : : need_change_db_table_name ( )
{
DBUG_ENTER ( " spider_oracle_share::need_change_db_table_name " ) ;
DBUG_RETURN ( ! same_db_table_name ) ;
}
# ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
int spider_oracle_share : : discover_table_structure (
SPIDER_TRX * trx ,
SPIDER_SHARE * spider_share ,
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_share::discover_table_structure " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( HA_ERR_WRONG_COMMAND ) ;
}
# endif
spider_oracle_handler : : spider_oracle_handler (
ha_spider * spider ,
spider_oracle_share * db_share
) : spider_db_handler (
spider ,
db_share
) ,
where_pos ( 0 ) ,
order_pos ( 0 ) ,
limit_pos ( 0 ) ,
table_name_pos ( 0 ) ,
update_set_pos ( 0 ) ,
ha_read_pos ( 0 ) ,
ha_next_pos ( 0 ) ,
ha_where_pos ( 0 ) ,
ha_limit_pos ( 0 ) ,
ha_table_name_pos ( 0 ) ,
insert_pos ( 0 ) ,
insert_table_name_pos ( 0 ) ,
upd_tmp_tbl ( NULL ) ,
tmp_sql_pos1 ( 0 ) ,
tmp_sql_pos2 ( 0 ) ,
tmp_sql_pos3 ( 0 ) ,
tmp_sql_pos4 ( 0 ) ,
tmp_sql_pos5 ( 0 ) ,
table_lock_mode ( 0 ) ,
reading_from_bulk_tmp_table ( FALSE ) ,
filled_up ( FALSE ) ,
select_rownum_appended ( FALSE ) ,
update_rownum_appended ( FALSE ) ,
union_table_name_pos_first ( NULL ) ,
union_table_name_pos_current ( NULL ) ,
oracle_share ( db_share ) ,
link_for_hash ( NULL )
{
DBUG_ENTER ( " spider_oracle_handler::spider_oracle_handler " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
spider_alloc_calc_mem_init ( mem_calc , 222 ) ;
spider_alloc_calc_mem ( spider_current_trx , mem_calc , sizeof ( * this ) ) ;
DBUG_VOID_RETURN ;
}
spider_oracle_handler : : ~ spider_oracle_handler ( )
{
DBUG_ENTER ( " spider_oracle_handler::~spider_oracle_handler " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
while ( union_table_name_pos_first )
{
SPIDER_INT_HLD * tmp_pos = union_table_name_pos_first ;
union_table_name_pos_first = tmp_pos - > next ;
spider_free ( spider_current_trx , tmp_pos , MYF ( 0 ) ) ;
}
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_oracle_handler : : init ( )
{
uint roop_count ;
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_oracle_handler::init " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
sql . init_calc_mem ( 67 ) ;
sql_part . init_calc_mem ( 68 ) ;
sql_part2 . init_calc_mem ( 69 ) ;
ha_sql . init_calc_mem ( 70 ) ;
insert_sql . init_calc_mem ( 72 ) ;
update_sql . init_calc_mem ( 73 ) ;
tmp_sql . init_calc_mem ( 74 ) ;
dup_update_sql . init_calc_mem ( 167 ) ;
if (
( sql . real_alloc ( init_sql_alloc_size ) ) | |
( insert_sql . real_alloc ( init_sql_alloc_size ) ) | |
( update_sql . real_alloc ( init_sql_alloc_size ) ) | |
( tmp_sql . real_alloc ( init_sql_alloc_size ) )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
sql . set_charset ( share - > access_charset ) ;
sql_part . set_charset ( share - > access_charset ) ;
ha_sql . set_charset ( share - > access_charset ) ;
insert_sql . set_charset ( share - > access_charset ) ;
update_sql . set_charset ( share - > access_charset ) ;
tmp_sql . set_charset ( share - > access_charset ) ;
upd_tmp_tbl_prm . init ( ) ;
upd_tmp_tbl_prm . field_count = 1 ;
if ( ! ( link_for_hash = ( SPIDER_LINK_FOR_HASH * )
spider_bulk_alloc_mem ( spider_current_trx , 223 ,
__func__ , __FILE__ , __LINE__ , MYF ( MY_WME | MY_ZEROFILL ) ,
& link_for_hash ,
sizeof ( SPIDER_LINK_FOR_HASH ) * share - > link_count ,
NullS ) )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
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 =
& oracle_share - > db_table_str [ roop_count ] ;
# ifdef SPIDER_HAS_HASH_VALUE_TYPE
link_for_hash [ roop_count ] . db_table_str_hash_value =
oracle_share - > db_table_str_hash_value [ roop_count ] ;
# endif
}
# if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
hs_upds . init ( ) ;
# endif
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_table_name_with_adjusting (
spider_string * str ,
int link_idx ,
ulong sql_type
) {
int error_num = 0 ;
DBUG_ENTER ( " spider_oracle_handler::append_table_name_with_adjusting " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql_type = = SPIDER_SQL_TYPE_HANDLER )
{
str - > q_append ( spider - > m_handler_cid [ link_idx ] , SPIDER_SQL_HANDLER_CID_LEN ) ;
} else {
error_num = oracle_share - > append_table_name_with_adjusting ( str ,
spider - > conn_link_idx [ link_idx ] ) ;
}
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_key_column_types (
const key_range * start_key ,
spider_string * str
) {
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
KEY * key_info = result_list - > key_info ;
uint key_name_length , key_count ;
key_part_map full_key_part_map =
make_prev_keypart_map ( spider_user_defined_key_parts ( key_info ) ) ;
key_part_map start_key_part_map ;
KEY_PART_INFO * key_part ;
Field * field ;
char tmp_buf [ MAX_FIELD_WIDTH ] ;
spider_string tmp_str ( tmp_buf , sizeof ( tmp_buf ) , system_charset_info ) ;
DBUG_ENTER ( " spider_oracle_handler::append_key_column_types " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
tmp_str . init_calc_mem ( 227 ) ;
start_key_part_map = start_key - > keypart_map & full_key_part_map ;
DBUG_PRINT ( " info " , ( " spider spider_user_defined_key_parts=%u " ,
spider_user_defined_key_parts ( key_info ) ) ) ;
DBUG_PRINT ( " info " , ( " spider full_key_part_map=%lu " , full_key_part_map ) ) ;
DBUG_PRINT ( " info " , ( " spider start_key_part_map=%lu " , start_key_part_map ) ) ;
if ( ! start_key_part_map )
DBUG_RETURN ( 0 ) ;
for (
key_part = key_info - > key_part ,
key_count = 0 ;
start_key_part_map ;
start_key_part_map > > = 1 ,
key_part + + ,
key_count + +
) {
field = key_part - > field ;
key_name_length = my_sprintf ( tmp_buf , ( tmp_buf , " c%u " , key_count ) ) ;
if ( str - > reserve ( key_name_length + SPIDER_SQL_SPACE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( tmp_buf , key_name_length ) ;
str - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
if ( tmp_str . ptr ( ) ! = tmp_buf )
tmp_str . set ( tmp_buf , sizeof ( tmp_buf ) , system_charset_info ) ;
else
tmp_str . set_charset ( system_charset_info ) ;
field - > sql_type ( * tmp_str . get_str ( ) ) ;
tmp_str . mem_calc ( ) ;
str - > append ( tmp_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 ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_join_columns_for_bka (
const key_range * start_key ,
spider_string * str ,
const char * * table_aliases ,
uint * table_alias_lengths
) {
KEY * key_info = spider - > result_list . key_info ;
uint length , key_name_length , key_count ;
key_part_map full_key_part_map =
make_prev_keypart_map ( spider_user_defined_key_parts ( key_info ) ) ;
key_part_map start_key_part_map ;
KEY_PART_INFO * key_part ;
Field * field ;
char tmp_buf [ MAX_FIELD_WIDTH ] ;
bool start_where = ( ( int ) str - > length ( ) = = where_pos ) ;
DBUG_ENTER ( " spider_oracle_handler::append_key_join_columns_for_bka " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
start_key_part_map = start_key - > keypart_map & full_key_part_map ;
DBUG_PRINT ( " info " , ( " spider spider_user_defined_key_parts=%u " ,
spider_user_defined_key_parts ( key_info ) ) ) ;
DBUG_PRINT ( " info " , ( " spider full_key_part_map=%lu " , full_key_part_map ) ) ;
DBUG_PRINT ( " info " , ( " spider start_key_part_map=%lu " , start_key_part_map ) ) ;
if ( ! start_key_part_map )
DBUG_RETURN ( 0 ) ;
if ( start_where )
{
if ( str - > reserve ( SPIDER_SQL_WHERE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_WHERE_STR , SPIDER_SQL_WHERE_LEN ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_AND_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
}
for (
key_part = key_info - > key_part ,
key_count = 0 ;
start_key_part_map ;
start_key_part_map > > = 1 ,
key_part + + ,
key_count + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
length = my_sprintf ( tmp_buf , ( tmp_buf , " c%u " , key_count ) ) ;
if ( str - > reserve ( length + table_alias_lengths [ 0 ] + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
table_alias_lengths [ 1 ] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( table_aliases [ 0 ] , table_alias_lengths [ 0 ] ) ;
str - > q_append ( tmp_buf , length ) ;
str - > q_append ( SPIDER_SQL_PF_EQUAL_STR , SPIDER_SQL_PF_EQUAL_LEN ) ;
str - > q_append ( table_aliases [ 1 ] , table_alias_lengths [ 1 ] ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_AND_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_tmp_table_and_sql_for_bka (
const key_range * start_key
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_tmp_table_and_sql_for_bka " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
char tmp_table_name [ MAX_FIELD_WIDTH * 2 ] ,
tgt_table_name [ MAX_FIELD_WIDTH * 2 ] ;
int tmp_table_name_length ;
spider_string tgt_table_name_str ( tgt_table_name , MAX_FIELD_WIDTH * 2 ,
oracle_share - > db_names_str [ 0 ] . charset ( ) ) ;
const char * table_names [ 2 ] , * table_aliases [ 2 ] , * table_dot_aliases [ 2 ] ;
uint table_name_lengths [ 2 ] , table_alias_lengths [ 2 ] ,
table_dot_alias_lengths [ 2 ] ;
tgt_table_name_str . init_calc_mem ( 200 ) ;
tgt_table_name_str . length ( 0 ) ;
create_tmp_bka_table_name ( tmp_table_name , & tmp_table_name_length ,
first_link_idx ) ;
if ( ( error_num = append_table_name_with_adjusting ( & tgt_table_name_str ,
first_link_idx , SPIDER_SQL_TYPE_SELECT_SQL ) ) )
{
DBUG_RETURN ( error_num ) ;
}
table_names [ 0 ] = tmp_table_name ;
table_names [ 1 ] = tgt_table_name_str . c_ptr_safe ( ) ;
table_name_lengths [ 0 ] = tmp_table_name_length ;
table_name_lengths [ 1 ] = tgt_table_name_str . length ( ) ;
table_aliases [ 0 ] = SPIDER_SQL_A_STR ;
table_aliases [ 1 ] = SPIDER_SQL_B_STR ;
table_alias_lengths [ 0 ] = SPIDER_SQL_A_LEN ;
table_alias_lengths [ 1 ] = SPIDER_SQL_B_LEN ;
table_dot_aliases [ 0 ] = SPIDER_SQL_A_DOT_STR ;
table_dot_aliases [ 1 ] = SPIDER_SQL_B_DOT_STR ;
table_dot_alias_lengths [ 0 ] = SPIDER_SQL_A_DOT_LEN ;
table_dot_alias_lengths [ 1 ] = SPIDER_SQL_B_DOT_LEN ;
if (
( error_num = append_drop_tmp_bka_table (
& tmp_sql , tmp_table_name , tmp_table_name_length ,
& tmp_sql_pos1 , & tmp_sql_pos5 , TRUE ) ) | |
( error_num = append_create_tmp_bka_table (
start_key ,
& tmp_sql , tmp_table_name ,
tmp_table_name_length ,
& tmp_sql_pos2 , spider - > share - > table_share - > table_charset ) ) | |
( error_num = append_insert_tmp_bka_table (
start_key ,
& tmp_sql , tmp_table_name ,
tmp_table_name_length , & tmp_sql_pos3 ) )
)
DBUG_RETURN ( error_num ) ;
tmp_sql_pos4 = tmp_sql . length ( ) ;
if ( ( error_num = spider_db_append_select ( spider ) ) )
DBUG_RETURN ( error_num ) ;
if ( sql . reserve ( SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_A_DOT_STR , SPIDER_SQL_A_DOT_LEN ) ;
sql . q_append ( SPIDER_SQL_ID_STR , SPIDER_SQL_ID_LEN ) ;
sql . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
if (
( error_num = append_select_columns_with_alias ( & sql ,
SPIDER_SQL_B_DOT_STR , SPIDER_SQL_B_DOT_LEN ) ) | |
( error_num = spider_db_oracle_utility . append_from_with_alias ( & sql ,
table_names , table_name_lengths ,
table_aliases , table_alias_lengths , 2 ,
& table_name_pos , FALSE ) )
)
DBUG_RETURN ( error_num ) ;
if (
oracle_share - > key_hint & &
( error_num = spider_db_append_hint_after_table ( spider ,
& sql , & oracle_share - > key_hint [ spider - > active_index ] ) )
)
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
where_pos = sql . length ( ) ;
if (
( error_num = append_key_join_columns_for_bka (
start_key , & sql ,
table_dot_aliases , table_dot_alias_lengths ) ) | |
( error_num = append_condition_part (
SPIDER_SQL_B_DOT_STR , SPIDER_SQL_B_DOT_LEN ,
SPIDER_SQL_TYPE_SELECT_SQL , FALSE ) ) | |
(
spider - > result_list . direct_order_limit & &
( error_num = append_key_order_for_direct_order_limit_with_alias ( & sql ,
SPIDER_SQL_B_DOT_STR , SPIDER_SQL_B_DOT_LEN ) )
)
)
DBUG_RETURN ( error_num ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : reuse_tmp_table_and_sql_for_bka ( )
{
DBUG_ENTER ( " spider_oracle_handler::reuse_tmp_table_and_sql_for_bka " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
tmp_sql . length ( tmp_sql_pos4 ) ;
sql . length ( limit_pos ) ;
ha_sql . length ( ha_limit_pos ) ;
DBUG_RETURN ( 0 ) ;
}
void spider_oracle_handler : : create_tmp_bka_table_name (
char * tmp_table_name ,
int * tmp_table_name_length ,
int link_idx
) {
uint adjust_length =
oracle_share - > db_nm_max_length -
oracle_share - > db_names_str [ spider - > conn_link_idx [ link_idx ] ] . length ( ) +
oracle_share - > table_nm_max_length -
oracle_share - > table_names_str [ spider - > conn_link_idx [ link_idx ] ] . length ( ) ,
length ;
DBUG_ENTER ( " spider_oracle_handler::create_tmp_bka_table_name " ) ;
* tmp_table_name_length = oracle_share - > db_nm_max_length +
oracle_share - > table_nm_max_length ;
memset ( tmp_table_name , ' ' , adjust_length ) ;
tmp_table_name + = adjust_length ;
memcpy ( tmp_table_name , oracle_share - > db_names_str [ link_idx ] . c_ptr ( ) ,
oracle_share - > db_names_str [ link_idx ] . length ( ) ) ;
tmp_table_name + = oracle_share - > db_names_str [ link_idx ] . length ( ) ;
length = my_sprintf ( tmp_table_name , ( tmp_table_name ,
" %s%s%p%s " , SPIDER_SQL_DOT_STR , SPIDER_SQL_TMP_BKA_STR , spider ,
SPIDER_SQL_UNDERSCORE_STR ) ) ;
* tmp_table_name_length + = length ;
tmp_table_name + = length ;
memcpy ( tmp_table_name ,
oracle_share - > table_names_str [ spider - > conn_link_idx [ link_idx ] ] . c_ptr ( ) ,
oracle_share - > table_names_str [ spider - > conn_link_idx [ link_idx ] ] . length ( ) ) ;
DBUG_VOID_RETURN ;
}
int spider_oracle_handler : : append_create_tmp_bka_table (
const key_range * start_key ,
spider_string * str ,
char * tmp_table_name ,
int tmp_table_name_length ,
int * db_name_pos ,
CHARSET_INFO * table_charset
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
THD * thd = spider - > trx - > thd ;
char * bka_engine = spider_param_bka_engine ( thd , share - > bka_engine ) ;
uint bka_engine_length = strlen ( bka_engine ) ,
cset_length = strlen ( table_charset - > csname ) ;
DBUG_ENTER ( " spider_oracle_handler::append_create_tmp_bka_table " ) ;
if ( str - > reserve ( SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_CREATE_TMP_STR , SPIDER_SQL_CREATE_TMP_LEN ) ;
* db_name_pos = str - > length ( ) ;
str - > q_append ( tmp_table_name , tmp_table_name_length ) ;
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
str - > q_append ( SPIDER_SQL_ID_STR , SPIDER_SQL_ID_LEN ) ;
str - > q_append ( SPIDER_SQL_ID_TYPE_STR , SPIDER_SQL_ID_TYPE_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
if ( ( error_num = append_key_column_types ( start_key , str ) ) )
DBUG_RETURN ( error_num ) ;
if ( str - > reserve ( SPIDER_SQL_ENGINE_LEN + bka_engine_length +
SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_SEMICOLON_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ENGINE_STR , SPIDER_SQL_ENGINE_LEN ) ;
str - > q_append ( bka_engine , bka_engine_length ) ;
str - > q_append ( SPIDER_SQL_DEF_CHARSET_STR , SPIDER_SQL_DEF_CHARSET_LEN ) ;
str - > q_append ( table_charset - > csname , cset_length ) ;
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_drop_tmp_bka_table (
spider_string * str ,
char * tmp_table_name ,
int tmp_table_name_length ,
int * db_name_pos ,
int * drop_table_end_pos ,
bool with_semicolon
) {
DBUG_ENTER ( " spider_oracle_handler::append_drop_tmp_bka_table " ) ;
if ( str - > reserve ( SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
( with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0 ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_DROP_TMP_STR , SPIDER_SQL_DROP_TMP_LEN ) ;
* db_name_pos = str - > length ( ) ;
str - > q_append ( tmp_table_name , tmp_table_name_length ) ;
* drop_table_end_pos = str - > length ( ) ;
if ( with_semicolon )
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_insert_tmp_bka_table (
const key_range * start_key ,
spider_string * str ,
char * tmp_table_name ,
int tmp_table_name_length ,
int * db_name_pos
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_insert_tmp_bka_table " ) ;
if ( str - > reserve ( SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_INSERT_STR , SPIDER_SQL_INSERT_LEN ) ;
str - > q_append ( SPIDER_SQL_INTO_STR , SPIDER_SQL_INTO_LEN ) ;
* db_name_pos = str - > length ( ) ;
str - > q_append ( tmp_table_name , tmp_table_name_length ) ;
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
str - > q_append ( SPIDER_SQL_ID_STR , SPIDER_SQL_ID_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
if ( ( error_num = spider_db_append_key_columns ( start_key , spider , str ) ) )
DBUG_RETURN ( error_num ) ;
if ( str - > reserve ( SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_VALUES_STR , SPIDER_SQL_VALUES_LEN ) ;
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_union_table_and_sql_for_bka (
const key_range * start_key
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_union_table_and_sql_for_bka " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
char tgt_table_name [ MAX_FIELD_WIDTH * 2 ] ;
spider_string tgt_table_name_str ( tgt_table_name , MAX_FIELD_WIDTH * 2 ,
oracle_share - > db_names_str [ 0 ] . charset ( ) ) ;
const char * table_names [ 2 ] , * table_aliases [ 2 ] , * table_dot_aliases [ 2 ] ;
uint table_name_lengths [ 2 ] , table_alias_lengths [ 2 ] ,
table_dot_alias_lengths [ 2 ] ;
tgt_table_name_str . init_calc_mem ( 234 ) ;
tgt_table_name_str . length ( 0 ) ;
if ( ( error_num = append_table_name_with_adjusting ( & tgt_table_name_str ,
first_link_idx , SPIDER_SQL_TYPE_SELECT_SQL ) ) )
{
DBUG_RETURN ( error_num ) ;
}
table_names [ 0 ] = " " ;
table_names [ 1 ] = tgt_table_name_str . c_ptr_safe ( ) ;
table_name_lengths [ 0 ] = 0 ;
table_name_lengths [ 1 ] = tgt_table_name_str . length ( ) ;
table_aliases [ 0 ] = SPIDER_SQL_A_STR ;
table_aliases [ 1 ] = SPIDER_SQL_B_STR ;
table_alias_lengths [ 0 ] = SPIDER_SQL_A_LEN ;
table_alias_lengths [ 1 ] = SPIDER_SQL_B_LEN ;
table_dot_aliases [ 0 ] = SPIDER_SQL_A_DOT_STR ;
table_dot_aliases [ 1 ] = SPIDER_SQL_B_DOT_STR ;
table_dot_alias_lengths [ 0 ] = SPIDER_SQL_A_DOT_LEN ;
table_dot_alias_lengths [ 1 ] = SPIDER_SQL_B_DOT_LEN ;
if ( ( error_num = spider_db_append_select ( spider ) ) )
DBUG_RETURN ( error_num ) ;
if ( sql . reserve ( SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_A_DOT_STR , SPIDER_SQL_A_DOT_LEN ) ;
sql . q_append ( SPIDER_SQL_ID_STR , SPIDER_SQL_ID_LEN ) ;
sql . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
if ( ( error_num = append_select_columns_with_alias ( & sql ,
SPIDER_SQL_B_DOT_STR , SPIDER_SQL_B_DOT_LEN ) ) )
DBUG_RETURN ( error_num ) ;
if ( sql . reserve ( SPIDER_SQL_FROM_LEN + ( SPIDER_SQL_OPEN_PAREN_LEN * 2 ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
sql . q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
sql . q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
tmp_sql_pos1 = sql . length ( ) ;
if (
( error_num = spider_db_oracle_utility . append_from_with_alias ( & tmp_sql ,
table_names , table_name_lengths ,
table_aliases , table_alias_lengths , 2 ,
& table_name_pos , FALSE ) )
)
DBUG_RETURN ( error_num ) ;
if (
oracle_share - > key_hint & &
( error_num = spider_db_append_hint_after_table ( spider ,
& tmp_sql , & oracle_share - > key_hint [ spider - > active_index ] ) )
)
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
where_pos = tmp_sql . length ( ) ;
if (
( error_num = append_key_join_columns_for_bka (
start_key , & tmp_sql ,
table_dot_aliases , table_dot_alias_lengths ) ) | |
( error_num = append_condition_part (
SPIDER_SQL_B_DOT_STR , SPIDER_SQL_B_DOT_LEN ,
SPIDER_SQL_TYPE_TMP_SQL , FALSE ) ) | |
(
spider - > result_list . direct_order_limit & &
( error_num = append_key_order_for_direct_order_limit_with_alias ( & tmp_sql ,
SPIDER_SQL_B_DOT_STR , SPIDER_SQL_B_DOT_LEN ) )
)
)
DBUG_RETURN ( error_num ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : reuse_union_table_and_sql_for_bka ( )
{
DBUG_ENTER ( " spider_oracle_handler::reuse_union_table_and_sql_for_bka " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
sql . length ( tmp_sql_pos1 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_insert_for_recovery (
ulong sql_type ,
int link_idx
) {
const TABLE * table = spider - > get_table ( ) ;
SPIDER_SHARE * share = spider - > share ;
Field * * field ;
uint field_name_length = 0 ;
bool add_value = FALSE ;
spider_string * insert_sql ;
DBUG_ENTER ( " spider_oracle_handler::append_insert_for_recovery " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql_type = = SPIDER_SQL_TYPE_INSERT_SQL )
{
insert_sql = & spider - > result_list . insert_sqls [ link_idx ] ;
insert_sql - > length ( 0 ) ;
} else {
insert_sql = & spider - > result_list . update_sqls [ link_idx ] ;
}
if ( insert_sql - > reserve (
SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
SPIDER_SQL_INTO_LEN + oracle_share - > db_nm_max_length +
SPIDER_SQL_DOT_LEN + oracle_share - > table_nm_max_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
insert_sql - > q_append ( SPIDER_SQL_INSERT_STR , SPIDER_SQL_INSERT_LEN ) ;
insert_sql - > q_append ( SPIDER_SQL_SQL_IGNORE_STR , SPIDER_SQL_SQL_IGNORE_LEN ) ;
insert_sql - > q_append ( SPIDER_SQL_INTO_STR , SPIDER_SQL_INTO_LEN ) ;
oracle_share - > append_table_name ( insert_sql , spider - > conn_link_idx [ link_idx ] ) ;
insert_sql - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
for ( field = table - > field ; * field ; field + + )
{
field_name_length =
oracle_share - > column_name_str [ ( * field ) - > field_index ] . length ( ) ;
if ( insert_sql - > reserve ( field_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( insert_sql , ( * field ) - > field_index ) ;
insert_sql - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
if ( field_name_length )
insert_sql - > length ( insert_sql - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( insert_sql - > reserve ( SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
insert_sql - > q_append ( SPIDER_SQL_VALUES_STR , SPIDER_SQL_VALUES_LEN ) ;
insert_sql - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
for ( field = table - > field ; * field ; field + + )
{
add_value = TRUE ;
if ( ( * field ) - > is_null ( ) )
{
if ( insert_sql - > reserve ( SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
insert_sql - > q_append ( SPIDER_SQL_NULL_STR , SPIDER_SQL_NULL_LEN ) ;
} else {
if (
spider_db_oracle_utility .
append_column_value ( spider , insert_sql , * field , NULL ,
share - > access_charset ) | |
insert_sql - > reserve ( SPIDER_SQL_COMMA_LEN )
)
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
insert_sql - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
if ( add_value )
insert_sql - > length ( insert_sql - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( insert_sql - > reserve ( SPIDER_SQL_CLOSE_PAREN_LEN , SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
insert_sql - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
if ( sql_type = = SPIDER_SQL_TYPE_INSERT_SQL )
{
exec_insert_sql = insert_sql ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_update (
const TABLE * table ,
my_ptrdiff_t ptr_diff
) {
int error_num ;
spider_string * str = & update_sql ;
DBUG_ENTER ( " spider_oracle_handler::append_update " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > length ( ) > 0 )
{
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
if (
( error_num = append_update ( str , 0 ) ) | |
( error_num = append_update_set ( str ) ) | |
( error_num = append_update_where ( str , table , ptr_diff ) )
)
DBUG_RETURN ( error_num ) ;
filled_up = ( str - > length ( ) > = ( uint ) spider - > result_list . bulk_update_size ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_update (
const TABLE * table ,
my_ptrdiff_t ptr_diff ,
int link_idx
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . update_sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::append_update " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > length ( ) > 0 )
{
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
if (
( error_num = append_update ( str , link_idx ) ) | |
( error_num = append_update_set ( str ) ) | |
( error_num = append_update_where ( str , table , ptr_diff ) )
)
DBUG_RETURN ( error_num ) ;
if (
spider - > pk_update & &
share - > link_statuses [ link_idx ] = = SPIDER_LINK_STATUS_RECOVERY
) {
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
if ( ( error_num = append_insert_for_recovery (
SPIDER_SQL_TYPE_UPDATE_SQL , link_idx ) ) )
DBUG_RETURN ( error_num ) ;
}
if ( ! filled_up )
filled_up = ( str - > length ( ) > = ( uint ) spider - > result_list . bulk_update_size ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_delete (
const TABLE * table ,
my_ptrdiff_t ptr_diff
) {
int error_num ;
spider_string * str = & update_sql ;
DBUG_ENTER ( " spider_oracle_handler::append_delete " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > length ( ) > 0 )
{
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
if (
( error_num = append_delete ( str ) ) | |
( error_num = append_from ( str , SPIDER_SQL_TYPE_DELETE_SQL ,
first_link_idx ) ) | |
( error_num = append_update_where ( str , table , ptr_diff ) )
)
DBUG_RETURN ( error_num ) ;
filled_up = ( str - > length ( ) > = ( uint ) spider - > result_list . bulk_update_size ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_delete (
const TABLE * table ,
my_ptrdiff_t ptr_diff ,
int link_idx
) {
int error_num ;
spider_string * str = & spider - > result_list . update_sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::append_delete " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > length ( ) > 0 )
{
if ( str - > reserve ( SPIDER_SQL_SEMICOLON_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SEMICOLON_STR , SPIDER_SQL_SEMICOLON_LEN ) ;
}
if (
( error_num = append_delete ( str ) ) | |
( error_num = append_from ( str , SPIDER_SQL_TYPE_DELETE_SQL , link_idx ) ) | |
( error_num = append_update_where ( str , table , ptr_diff ) )
)
DBUG_RETURN ( error_num ) ;
if ( ! filled_up )
filled_up = ( str - > length ( ) > = ( uint ) spider - > result_list . bulk_update_size ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_insert_part ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_insert_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = append_insert ( & insert_sql , 0 ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_insert (
spider_string * str ,
int link_idx
) {
DBUG_ENTER ( " spider_oracle_handler::append_insert " ) ;
if ( str - > reserve ( SPIDER_SQL_INSERT_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_INSERT_STR , SPIDER_SQL_INSERT_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_update_part ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_update_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = append_update ( & update_sql , 0 ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_update (
spider_string * str ,
int link_idx
) {
DBUG_ENTER ( " spider_oracle_handler::append_update " ) ;
if ( str - > reserve ( SPIDER_SQL_UPDATE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_UPDATE_STR , SPIDER_SQL_UPDATE_LEN ) ;
if ( str - > reserve ( oracle_share - > db_nm_max_length +
SPIDER_SQL_DOT_LEN + oracle_share - > table_nm_max_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
table_name_pos = str - > length ( ) ;
append_table_name_with_adjusting ( str , link_idx , SPIDER_SQL_TYPE_UPDATE_SQL ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_delete_part ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_delete_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = append_delete ( & update_sql ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_delete (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_delete " ) ;
if ( str - > reserve ( SPIDER_SQL_DELETE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_DELETE_STR , SPIDER_SQL_DELETE_LEN ) ;
str - > length ( str - > length ( ) - 1 ) ;
DBUG_RETURN ( 0 ) ;
}
# if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
# ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
int spider_oracle_handler : : append_increment_update_set_part ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_increment_update_set_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = append_increment_update_set ( & update_sql ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_increment_update_set (
spider_string * str
) {
uint field_name_length ;
uint roop_count ;
Field * field ;
DBUG_ENTER ( " spider_oracle_handler::append_increment_update_set " ) ;
if ( str - > reserve ( SPIDER_SQL_SET_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SET_STR , SPIDER_SQL_SET_LEN ) ;
const SPIDER_HS_STRING_REF * value = hs_upds . ptr ( ) ;
for ( roop_count = 0 ; roop_count < hs_upds . size ( ) ;
roop_count + + )
{
DBUG_PRINT ( " info " , ( " spider value_size[%u]=%zu " , roop_count ,
value [ roop_count ] . size ( ) ) ) ;
# ifndef DBUG_OFF
char print_buf [ MAX_FIELD_WIDTH ] ;
if ( value [ roop_count ] . size ( ) < MAX_FIELD_WIDTH )
{
memcpy ( print_buf , value [ roop_count ] . begin ( ) , value [ roop_count ] . size ( ) ) ;
print_buf [ value [ roop_count ] . size ( ) ] = ' \0 ' ;
DBUG_PRINT ( " info " , ( " spider value[%u]=%s " , roop_count , print_buf ) ) ;
}
# endif
if (
value [ roop_count ] . size ( ) = = 1 & &
* ( value [ roop_count ] . begin ( ) ) = = ' 0 '
)
continue ;
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 ;
field_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( str - > reserve ( field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
SPIDER_SQL_COMMA_LEN + value [ roop_count ] . size ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
if ( spider - > hs_increment )
str - > q_append ( SPIDER_SQL_HS_INCREMENT_STR ,
SPIDER_SQL_HS_INCREMENT_LEN ) ;
else
str - > q_append ( SPIDER_SQL_HS_DECREMENT_STR ,
SPIDER_SQL_HS_DECREMENT_LEN ) ;
str - > q_append ( value [ roop_count ] . begin ( ) , value [ roop_count ] . size ( ) ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
# endif
# endif
int spider_oracle_handler : : append_update_set_part ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_update_set_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
update_set_pos = update_sql . length ( ) ;
error_num = append_update_set ( & update_sql ) ;
where_pos = update_sql . length ( ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_update_set (
spider_string * str
) {
uint field_name_length ;
SPIDER_SHARE * share = spider - > share ;
TABLE * table = spider - > get_table ( ) ;
Field * * fields ;
DBUG_ENTER ( " spider_oracle_handler::append_update_set " ) ;
if ( str - > reserve ( SPIDER_SQL_SET_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SET_STR , SPIDER_SQL_SET_LEN ) ;
for ( fields = table - > field ; * fields ; fields + + )
{
if ( bitmap_is_set ( table - > write_set , ( * fields ) - > field_index ) )
{
field_name_length =
oracle_share - > column_name_str [ ( * fields ) - > field_index ] . length ( ) ;
if ( ( * fields ) - > is_null ( ) )
{
if ( str - > reserve ( field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , ( * fields ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
str - > q_append ( SPIDER_SQL_NULL_STR , SPIDER_SQL_NULL_LEN ) ;
} else {
if ( str - > reserve ( field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
2 + SPIDER_SQL_EQUAL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , ( * fields ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
# ifndef DBUG_OFF
my_bitmap_map * tmp_map = dbug_tmp_use_all_columns ( table ,
table - > read_set ) ;
# endif
if (
spider_db_oracle_utility .
append_column_value ( spider , str , * fields , NULL ,
share - > access_charset ) | |
str - > reserve ( SPIDER_SQL_COMMA_LEN )
) {
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
}
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
# ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
int spider_oracle_handler : : append_direct_update_set_part ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_direct_update_set_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
update_set_pos = update_sql . length ( ) ;
error_num = append_direct_update_set ( & update_sql ) ;
where_pos = update_sql . length ( ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_direct_update_set (
spider_string * str
) {
uint field_name_length ;
SPIDER_SHARE * share = spider - > share ;
# ifndef DBUG_OFF
TABLE * table = spider - > get_table ( ) ;
# endif
DBUG_ENTER ( " spider_oracle_handler::append_direct_update_set " ) ;
if (
spider - > direct_update_kinds = = SPIDER_SQL_KIND_SQL & &
spider - > direct_update_fields
) {
if ( str - > reserve ( SPIDER_SQL_SET_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SET_STR , SPIDER_SQL_SET_LEN ) ;
DBUG_RETURN ( append_update_columns ( str , NULL , 0 ) ) ;
}
if (
( spider - > direct_update_kinds & SPIDER_SQL_KIND_SQL )
) {
size_t roop_count ;
Field * field ;
if ( str - > reserve ( SPIDER_SQL_SET_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SET_STR , SPIDER_SQL_SET_LEN ) ;
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 ;
field_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( top_table_field - > is_null ( ) )
{
if ( str - > reserve ( field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
str - > q_append ( SPIDER_SQL_NULL_STR , SPIDER_SQL_NULL_LEN ) ;
} else {
if ( str - > reserve ( field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
2 + SPIDER_SQL_EQUAL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
# ifndef DBUG_OFF
my_bitmap_map * tmp_map = dbug_tmp_use_all_columns ( table ,
table - > read_set ) ;
# endif
if (
spider_db_oracle_utility .
append_column_value ( spider , str , top_table_field , NULL ,
share - > access_charset ) | |
str - > reserve ( SPIDER_SQL_COMMA_LEN )
) {
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
}
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_dup_update_pushdown_part (
const char * alias ,
uint alias_length
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_dup_update_pushdown_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
dup_update_sql . length ( 0 ) ;
error_num = append_update_columns ( & dup_update_sql , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_update_columns_part (
const char * alias ,
uint alias_length
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_update_columns_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = append_update_columns ( & update_sql , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : check_update_columns_part ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::check_update_columns_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = append_update_columns ( NULL , NULL , 0 ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_update_columns (
spider_string * str ,
const char * alias ,
uint alias_length
) {
int error_num ;
List_iterator_fast < Item > fi ( * spider - > direct_update_fields ) ,
vi ( * spider - > direct_update_values ) ;
Item * field , * value ;
DBUG_ENTER ( " spider_oracle_handler::append_update_columns " ) ;
while ( ( field = fi + + ) )
{
value = vi + + ;
if ( ( error_num = spider_db_print_item_type (
( Item * ) field , spider , str , alias , alias_length ,
spider_dbton_oracle . dbton_id ) ) )
{
if (
error_num = = ER_SPIDER_COND_SKIP_NUM & &
field - > type ( ) = = Item : : FIELD_ITEM & &
( ( Item_field * ) field ) - > field
)
continue ;
DBUG_RETURN ( error_num ) ;
}
if ( str )
{
if ( str - > reserve ( SPIDER_SQL_EQUAL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
}
if ( ( error_num = spider_db_print_item_type (
( Item * ) value , spider , str , alias , alias_length ,
spider_dbton_oracle . dbton_id ) ) )
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 ( str )
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
/*
error_num = spider_db_append_update_columns ( spider , str ,
alias , alias_length , spider_dbton_oracle . dbton_id ) ;
DBUG_RETURN ( error_num ) ;
*/
}
# endif
int spider_oracle_handler : : append_select_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_select_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_select ( str , sql_type ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_select (
spider_string * str ,
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::append_select " ) ;
if ( sql_type = = SPIDER_SQL_TYPE_HANDLER )
{
if ( str - > reserve ( SPIDER_SQL_HANDLER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_HANDLER_STR , SPIDER_SQL_HANDLER_LEN ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_SELECT_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SELECT_STR , SPIDER_SQL_SELECT_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_table_select_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_table_select_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_table_select ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_table_select (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_table_select " ) ;
table_name_pos = str - > length ( ) + oracle_share - > table_select_pos ;
if ( str - > append ( * ( oracle_share - > table_select ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_select_part (
ulong sql_type ,
uint idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_key_select_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_key_select ( str , idx ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_key_select (
spider_string * str ,
uint idx
) {
DBUG_ENTER ( " spider_oracle_handler::append_key_select " ) ;
table_name_pos = str - > length ( ) + oracle_share - > key_select_pos [ idx ] ;
if ( str - > append ( oracle_share - > key_select [ idx ] ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_minimum_select_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_minimum_select_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_minimum_select ( str , sql_type ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_minimum_select (
spider_string * str ,
ulong sql_type
) {
TABLE * table = spider - > get_table ( ) ;
Field * * field ;
int field_length ;
bool appended = FALSE ;
DBUG_ENTER ( " spider_oracle_handler::append_minimum_select " ) ;
for ( field = table - > field ; * field ; field + + )
{
if ( minimum_select_bit_is_set ( ( * field ) - > field_index ) )
{
field_length =
oracle_share - > column_name_str [ ( * field ) - > field_index ] . length ( ) ;
if ( str - > reserve ( field_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , ( * field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
appended = TRUE ;
}
}
if ( appended )
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
else {
if ( str - > reserve ( SPIDER_SQL_ONE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ONE_STR , SPIDER_SQL_ONE_LEN ) ;
}
DBUG_RETURN ( append_from ( str , sql_type , first_link_idx ) ) ;
}
int spider_oracle_handler : : append_table_select_with_alias (
spider_string * str ,
const char * alias ,
uint alias_length
) {
TABLE * table = spider - > get_table ( ) ;
Field * * field ;
int field_length ;
DBUG_ENTER ( " spider_oracle_handler::append_table_select_with_alias " ) ;
for ( field = table - > field ; * field ; field + + )
{
field_length =
oracle_share - > column_name_str [ ( * field ) - > field_index ] . length ( ) ;
if ( str - > reserve ( alias_length + field_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , ( * field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_select_with_alias (
spider_string * str ,
const KEY * key_info ,
const char * alias ,
uint alias_length
) {
KEY_PART_INFO * key_part ;
Field * field ;
uint part_num ;
int field_length ;
DBUG_ENTER ( " spider_oracle_handler::append_key_select_with_alias " ) ;
for ( key_part = key_info - > key_part , part_num = 0 ;
part_num < spider_user_defined_key_parts ( key_info ) ; key_part + + , part_num + + )
{
field = key_part - > field ;
field_length = oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( str - > reserve ( alias_length + field_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_minimum_select_with_alias (
spider_string * str ,
const char * alias ,
uint alias_length
) {
TABLE * table = spider - > get_table ( ) ;
Field * * field ;
int field_length ;
bool appended = FALSE ;
DBUG_ENTER ( " spider_oracle_handler::append_minimum_select_with_alias " ) ;
for ( field = table - > field ; * field ; field + + )
{
if ( minimum_select_bit_is_set ( ( * field ) - > field_index ) )
{
field_length =
oracle_share - > column_name_str [ ( * field ) - > field_index ] . length ( ) ;
if ( str - > reserve ( alias_length + field_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , ( * field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
appended = TRUE ;
}
}
if ( appended )
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
else {
if ( str - > reserve ( SPIDER_SQL_ONE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ONE_STR , SPIDER_SQL_ONE_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_select_columns_with_alias (
spider_string * str ,
const char * alias ,
uint alias_length
) {
int error_num ;
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
DBUG_ENTER ( " spider_oracle_handler::append_select_columns_with_alias " ) ;
# ifdef HANDLER_HAS_DIRECT_AGGREGATE
if (
result_list - > direct_aggregate & &
( error_num = append_sum_select ( str , alias , alias_length ) )
)
DBUG_RETURN ( error_num ) ;
# endif
if ( ( error_num = append_match_select ( str , alias , alias_length ) ) )
DBUG_RETURN ( error_num ) ;
if ( ! spider - > select_column_mode )
{
if ( result_list - > keyread )
DBUG_RETURN ( append_key_select_with_alias (
str , result_list - > key_info , alias , alias_length ) ) ;
else
DBUG_RETURN ( append_table_select_with_alias (
str , alias , alias_length ) ) ;
}
DBUG_RETURN ( append_minimum_select_with_alias ( str , alias , alias_length ) ) ;
}
int spider_oracle_handler : : append_hint_after_table_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_hint_after_table_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_hint_after_table ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_hint_after_table (
spider_string * str
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_hint_after_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if (
oracle_share - > key_hint & &
( error_num = spider_db_append_hint_after_table ( spider ,
str , & oracle_share - > key_hint [ spider - > active_index ] ) )
)
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
DBUG_RETURN ( 0 ) ;
}
void spider_oracle_handler : : set_where_pos (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::set_where_pos " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
where_pos = sql . length ( ) ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
where_pos = update_sql . length ( ) ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
ha_read_pos = ha_sql . length ( ) ;
break ;
default :
break ;
}
DBUG_VOID_RETURN ;
}
void spider_oracle_handler : : set_where_to_pos (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::set_where_to_pos " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
sql . length ( where_pos ) ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
update_sql . length ( where_pos ) ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
ha_sql . length ( ha_read_pos ) ;
break ;
default :
break ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_handler : : check_item_type (
Item * item
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::check_item_type " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = spider_db_print_item_type ( item , spider , NULL , NULL , 0 ,
spider_dbton_oracle . dbton_id ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_values_connector_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_values_connector_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_values_connector ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_values_connector (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_values_connector " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_CLOSE_PAREN_LEN +
SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_values_terminator_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_values_terminator_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_values_terminator ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_values_terminator (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_values_terminator " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( str - > length ( ) -
SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_union_table_connector_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_union_table_connector_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_union_table_connector ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_union_table_connector (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_union_table_connector " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( ( SPIDER_SQL_SPACE_LEN * 2 ) + SPIDER_SQL_UNION_ALL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
str - > q_append ( SPIDER_SQL_UNION_ALL_STR , SPIDER_SQL_UNION_ALL_LEN ) ;
str - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_union_table_terminator_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_union_table_terminator_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_union_table_terminator ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_union_table_terminator (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_union_table_terminator " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( str - > length ( ) -
( ( SPIDER_SQL_SPACE_LEN * 2 ) + SPIDER_SQL_UNION_ALL_LEN ) ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
table_name_pos = str - > length ( ) + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
SPIDER_SQL_COMMA_LEN ;
if ( str - > reserve ( tmp_sql . length ( ) - SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( tmp_sql . ptr ( ) + SPIDER_SQL_FROM_LEN ,
tmp_sql . length ( ) - SPIDER_SQL_FROM_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_column_values_part (
const key_range * start_key ,
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_key_column_values_part " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_key_column_values ( str , start_key ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_key_column_values (
spider_string * str ,
const key_range * start_key
) {
int error_num ;
const uchar * ptr ;
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
SPIDER_SHARE * share = spider - > share ;
KEY * key_info = result_list - > key_info ;
uint length ;
uint store_length ;
key_part_map full_key_part_map =
make_prev_keypart_map ( spider_user_defined_key_parts ( key_info ) ) ;
key_part_map start_key_part_map ;
KEY_PART_INFO * key_part ;
Field * field ;
DBUG_ENTER ( " spider_oracle_handler::append_key_column_values " ) ;
start_key_part_map = start_key - > keypart_map & full_key_part_map ;
DBUG_PRINT ( " info " , ( " spider spider_user_defined_key_parts=%u " ,
spider_user_defined_key_parts ( key_info ) ) ) ;
DBUG_PRINT ( " info " , ( " spider full_key_part_map=%lu " , full_key_part_map ) ) ;
DBUG_PRINT ( " info " , ( " spider start_key_part_map=%lu " , start_key_part_map ) ) ;
if ( ! start_key_part_map )
DBUG_RETURN ( 0 ) ;
for (
key_part = key_info - > key_part ,
length = 0 ;
start_key_part_map ;
start_key_part_map > > = 1 ,
key_part + + ,
length + = store_length
) {
store_length = key_part - > store_length ;
ptr = start_key - > key + length ;
field = key_part - > field ;
if ( ( error_num = spider_db_append_null_value ( str , key_part , & ptr ) ) )
{
if ( error_num > 0 )
DBUG_RETURN ( error_num ) ;
} else {
if ( spider_db_oracle_utility . append_column_value ( spider , str , field , ptr ,
share - > access_charset ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
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 ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_column_values_with_name_part (
const key_range * start_key ,
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_key_column_values_with_name_part " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_key_column_values_with_name ( str , start_key ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_key_column_values_with_name (
spider_string * str ,
const key_range * start_key
) {
int error_num ;
const uchar * ptr ;
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
SPIDER_SHARE * share = spider - > share ;
KEY * key_info = result_list - > key_info ;
uint length ;
uint key_name_length , key_count ;
uint store_length ;
key_part_map full_key_part_map =
make_prev_keypart_map ( spider_user_defined_key_parts ( key_info ) ) ;
key_part_map start_key_part_map ;
KEY_PART_INFO * key_part ;
Field * field ;
char tmp_buf [ MAX_FIELD_WIDTH ] ;
DBUG_ENTER ( " spider_oracle_handler::append_key_column_values_with_name " ) ;
start_key_part_map = start_key - > keypart_map & full_key_part_map ;
DBUG_PRINT ( " info " , ( " spider spider_user_defined_key_parts=%u " ,
spider_user_defined_key_parts ( key_info ) ) ) ;
DBUG_PRINT ( " info " , ( " spider full_key_part_map=%lu " , full_key_part_map ) ) ;
DBUG_PRINT ( " info " , ( " spider start_key_part_map=%lu " , start_key_part_map ) ) ;
if ( ! start_key_part_map )
DBUG_RETURN ( 0 ) ;
for (
key_part = key_info - > key_part ,
length = 0 ,
key_count = 0 ;
start_key_part_map ;
start_key_part_map > > = 1 ,
key_part + + ,
length + = store_length ,
key_count + +
) {
store_length = key_part - > store_length ;
ptr = start_key - > key + length ;
field = key_part - > field ;
if ( ( error_num = spider_db_append_null_value ( str , key_part , & ptr ) ) )
{
if ( error_num > 0 )
DBUG_RETURN ( error_num ) ;
} else {
if ( spider_db_oracle_utility . append_column_value ( spider , str , field , ptr ,
share - > access_charset ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
key_name_length = my_sprintf ( tmp_buf , ( tmp_buf , " c%u " , key_count ) ) ;
if ( str - > reserve ( SPIDER_SQL_SPACE_LEN + key_name_length +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
str - > q_append ( tmp_buf , key_name_length ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_where_part (
const key_range * start_key ,
const key_range * end_key ,
ulong sql_type
) {
int error_num ;
spider_string * str , * str_part = NULL , * str_part2 = NULL ;
bool set_order ;
DBUG_ENTER ( " spider_oracle_handler::append_key_where_part " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
set_order = FALSE ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
set_order = FALSE ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
set_order = FALSE ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
ha_read_pos = str - > length ( ) ;
str_part = & sql_part ;
str_part2 = & sql_part2 ;
str_part - > length ( 0 ) ;
str_part2 - > length ( 0 ) ;
set_order = TRUE ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_key_where ( str , str_part , str_part2 , start_key , end_key ,
sql_type , set_order ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_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_oracle_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_oracle . dbton_id ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_is_null_part (
ulong sql_type ,
KEY_PART_INFO * key_part ,
const key_range * key ,
const uchar * * ptr ,
bool key_eq
) {
int error_num ;
spider_string * str , * str_part = NULL , * str_part2 = NULL ;
DBUG_ENTER ( " spider_oracle_handler::append_is_null_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
str_part = & sql_part ;
str_part2 = & sql_part2 ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_is_null ( sql_type , str , str_part , str_part2 ,
key_part , key , ptr , key_eq ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_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
) {
DBUG_ENTER ( " spider_oracle_handler::append_is_null " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( key_part - > null_bit )
{
if ( * ( * ptr ) + + )
{
if ( sql_type = = SPIDER_SQL_TYPE_HANDLER )
{
str = str_part ;
if (
key_eq | |
key - > flag = = HA_READ_KEY_EXACT | |
key - > flag = = HA_READ_KEY_OR_NEXT
) {
if ( str - > reserve ( SPIDER_SQL_IS_NULL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_IS_NULL_STR , SPIDER_SQL_IS_NULL_LEN ) ;
} else {
str - > length ( str - > length ( ) - SPIDER_SQL_OPEN_PAREN_LEN ) ;
ha_next_pos = str - > length ( ) ;
if ( str - > reserve ( SPIDER_SQL_FIRST_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_FIRST_STR , SPIDER_SQL_FIRST_LEN ) ;
spider - > result_list . ha_read_kind = 1 ;
}
str = str_part2 ;
}
if (
key_eq | |
key - > flag = = HA_READ_KEY_EXACT | |
key - > flag = = HA_READ_KEY_OR_NEXT
) {
if ( str - > reserve ( SPIDER_SQL_IS_NULL_LEN +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
oracle_share - > column_name_str [ key_part - > field - > field_index ] . length ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , key_part - > field - > field_index ) ;
str - > q_append ( SPIDER_SQL_IS_NULL_STR , SPIDER_SQL_IS_NULL_LEN ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_IS_NOT_NULL_LEN +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
oracle_share - > column_name_str [ key_part - > field - > field_index ] . length ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , key_part - > field - > field_index ) ;
str - > q_append ( SPIDER_SQL_IS_NOT_NULL_STR , SPIDER_SQL_IS_NOT_NULL_LEN ) ;
}
DBUG_RETURN ( - 1 ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_where_terminator_part (
ulong sql_type ,
bool set_order ,
int key_count
) {
int error_num ;
spider_string * str , * str_part = NULL , * str_part2 = NULL ;
DBUG_ENTER ( " spider_oracle_handler::append_where_terminator_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
str_part = & sql_part ;
str_part2 = & sql_part2 ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_where_terminator ( sql_type , str , str_part , str_part2 ,
set_order , key_count ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_where_terminator (
ulong sql_type ,
spider_string * str ,
spider_string * str_part ,
spider_string * str_part2 ,
bool set_order ,
int key_count
) {
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
DBUG_ENTER ( " spider_oracle_handler::append_where_terminator " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql_type ! = SPIDER_SQL_TYPE_HANDLER )
{
str - > length ( str - > length ( ) - SPIDER_SQL_AND_LEN ) ;
if ( ! set_order )
result_list - > key_order = key_count ;
} else {
str_part2 - > length ( str_part2 - > length ( ) - SPIDER_SQL_AND_LEN ) ;
str_part - > length ( str_part - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( ! result_list - > ha_read_kind )
str_part - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR ,
SPIDER_SQL_CLOSE_PAREN_LEN ) ;
if ( str - > append ( * str_part ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
uint clause_length = str - > length ( ) - ha_next_pos ;
if ( clause_length < SPIDER_SQL_NEXT_LEN )
{
int roop_count ;
clause_length = SPIDER_SQL_NEXT_LEN - clause_length ;
if ( str - > reserve ( clause_length ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
for ( roop_count = 0 ; roop_count < ( int ) clause_length ; roop_count + + )
str - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_match_where_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_match_where_part " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
error_num = append_match_where ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_match_where (
spider_string * str
) {
int error_num ;
bool first = TRUE ;
st_spider_ft_info * ft_info = spider - > ft_first ;
DBUG_ENTER ( " spider_oracle_handler::append_match_where " ) ;
if ( spider - > ft_current )
{
while ( TRUE )
{
if ( ft_info - > used_in_where )
{
if ( first )
{
if ( str - > reserve ( SPIDER_SQL_WHERE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_WHERE_STR , SPIDER_SQL_WHERE_LEN ) ;
first = FALSE ;
}
if ( ( error_num = append_match_against ( str , ft_info , NULL , 0 ) ) )
DBUG_RETURN ( error_num ) ;
if ( str - > reserve ( SPIDER_SQL_AND_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
}
if ( ft_info = = spider - > ft_current )
break ;
ft_info = ft_info - > next ;
}
if ( ! first )
str - > length ( str - > length ( ) - SPIDER_SQL_AND_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_update_where (
spider_string * str ,
const TABLE * table ,
my_ptrdiff_t ptr_diff
) {
uint field_name_length ;
Field * * field ;
SPIDER_SHARE * share = spider - > share ;
DBUG_ENTER ( " spider_oracle_handler::append_update_where " ) ;
if ( str - > reserve ( SPIDER_SQL_WHERE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_WHERE_STR , SPIDER_SQL_WHERE_LEN ) ;
for ( field = table - > field ; * field ; field + + )
{
if (
table - > s - > primary_key = = MAX_KEY | |
bitmap_is_set ( table - > read_set , ( * field ) - > field_index )
) {
field_name_length =
oracle_share - > column_name_str [ ( * field ) - > field_index ] . length ( ) ;
if ( ( * field ) - > is_null ( ptr_diff ) )
{
if ( str - > reserve ( field_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , ( * field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_IS_NULL_STR , SPIDER_SQL_IS_NULL_LEN ) ;
} else {
if ( str - > reserve ( field_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_EQUAL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , ( * field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ;
( * field ) - > move_field_offset ( ptr_diff ) ;
if (
spider_db_oracle_utility .
append_column_value ( spider , str , * field , NULL ,
share - > access_charset ) | |
str - > reserve ( SPIDER_SQL_AND_LEN )
)
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
( * field ) - > move_field_offset ( - ptr_diff ) ;
}
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
}
}
/*
str - > length ( str - > length ( ) - SPIDER_SQL_AND_LEN ) ;
*/
if ( str - > reserve ( SPIDER_SQL_LIMIT1_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_LIMIT1_STR , SPIDER_SQL_LIMIT1_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_condition_part (
const char * alias ,
uint alias_length ,
ulong sql_type ,
bool test_flg
) {
int error_num ;
spider_string * str ;
bool start_where = FALSE ;
DBUG_ENTER ( " spider_oracle_handler::append_condition_part " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
DBUG_PRINT ( " info " , ( " spider case1 sql_type=%lu " , sql_type ) ) ;
if ( test_flg )
{
str = NULL ;
} else {
str = & sql ;
start_where = ( ( int ) str - > length ( ) = = where_pos ) ;
}
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
DBUG_PRINT ( " info " , ( " spider case1 sql_type=%lu " , sql_type ) ) ;
if ( test_flg )
{
str = NULL ;
} else {
str = & tmp_sql ;
start_where = ( ( int ) str - > length ( ) = = where_pos ) ;
}
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
DBUG_PRINT ( " info " , ( " spider case2 sql_type=%lu " , sql_type ) ) ;
if ( test_flg )
{
str = NULL ;
} else {
str = & update_sql ;
start_where = ( ( int ) str - > length ( ) = = where_pos ) ;
}
break ;
case SPIDER_SQL_TYPE_HANDLER :
DBUG_PRINT ( " info " , ( " spider case3 sql_type=%lu " , sql_type ) ) ;
if ( test_flg )
{
str = NULL ;
} else {
str = & ha_sql ;
start_where = TRUE ;
if ( spider - > active_index = = MAX_KEY )
{
set_where_pos ( SPIDER_SQL_TYPE_HANDLER ) ;
if ( str - > reserve ( SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_READ_STR , SPIDER_SQL_READ_LEN ) ;
ha_next_pos = str - > length ( ) ;
str - > q_append ( SPIDER_SQL_FIRST_STR , SPIDER_SQL_FIRST_LEN ) ;
sql_part2 . length ( 0 ) ;
}
ha_where_pos = str - > length ( ) ;
if ( sql_part2 . length ( ) )
{
str - > append ( sql_part2 ) ;
start_where = FALSE ;
}
}
break ;
default :
DBUG_PRINT ( " info " , ( " spider default sql_type=%lu " , sql_type ) ) ;
DBUG_RETURN ( 0 ) ;
}
error_num = append_condition ( str , alias , alias_length , start_where ,
sql_type ) ;
DBUG_PRINT ( " info " , ( " spider str=%s " , str ? str - > c_ptr_safe ( ) : " NULL " ) ) ;
DBUG_PRINT ( " info " , ( " spider length=%u " , str ? str - > length ( ) : 0 ) ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_condition (
spider_string * str ,
const char * alias ,
uint alias_length ,
bool start_where ,
ulong sql_type
) {
int error_num , restart_pos = 0 , start_where_pos ;
SPIDER_CONDITION * tmp_cond = spider - > condition ;
DBUG_ENTER ( " spider_oracle_handler::append_condition " ) ;
DBUG_PRINT ( " info " , ( " spider str=%p " , str ) ) ;
DBUG_PRINT ( " info " , ( " spider alias=%p " , alias ) ) ;
DBUG_PRINT ( " info " , ( " spider alias_length=%u " , alias_length ) ) ;
DBUG_PRINT ( " info " , ( " spider start_where=%s " , start_where ? " TRUE " : " FALSE " ) ) ;
DBUG_PRINT ( " info " , ( " spider sql_type=%lu " , sql_type ) ) ;
if ( str & & start_where )
{
start_where_pos = str - > length ( ) ;
} else {
start_where_pos = 0 ;
}
if ( spider - > is_clone & & ! tmp_cond )
{
tmp_cond = spider - > pt_clone_source_handler - > condition ;
}
while ( tmp_cond )
{
if ( str )
{
restart_pos = str - > length ( ) ;
if ( start_where )
{
if ( str - > reserve ( SPIDER_SQL_WHERE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_WHERE_STR , SPIDER_SQL_WHERE_LEN ) ;
start_where = FALSE ;
} else {
if ( str - > reserve ( SPIDER_SQL_AND_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
}
}
if ( ( error_num = spider_db_print_item_type (
( Item * ) tmp_cond - > cond , spider , str , alias , alias_length ,
spider_dbton_oracle . dbton_id ) ) )
{
if ( str & & error_num = = ER_SPIDER_COND_SKIP_NUM )
{
DBUG_PRINT ( " info " , ( " spider COND skip " ) ) ;
str - > length ( restart_pos ) ;
start_where = ( restart_pos = = start_where_pos ) ;
} else
DBUG_RETURN ( error_num ) ;
}
tmp_cond = tmp_cond - > next ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_match_against_part (
ulong sql_type ,
st_spider_ft_info * ft_info ,
const char * alias ,
uint alias_length
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_match_against_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_match_against ( str , ft_info , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_match_against (
spider_string * str ,
st_spider_ft_info * ft_info ,
const char * alias ,
uint alias_length
) {
SPIDER_SHARE * share = spider - > share ;
TABLE * table = spider - > get_table ( ) ;
String * ft_init_key ;
KEY * key_info ;
uint key_name_length ;
int key_count ;
KEY_PART_INFO * key_part ;
Field * field ;
DBUG_ENTER ( " spider_oracle_handler::append_match_against " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
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 ) ;
ft_init_key = ft_info - > key ;
key_info = & table - > key_info [ ft_info - > inx ] ;
DBUG_PRINT ( " info " , ( " spider spider_user_defined_key_parts=%u " ,
spider_user_defined_key_parts ( key_info ) ) ) ;
for (
key_part = key_info - > key_part ,
key_count = 0 ;
key_count < ( int ) spider_user_defined_key_parts ( key_info ) ;
key_part + + ,
key_count + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( alias_length )
{
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
} else {
if ( str - > reserve ( key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( str - > reserve ( SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_AGAINST_STR , SPIDER_SQL_AGAINST_LEN ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
char buf [ MAX_FIELD_WIDTH ] ;
spider_string tmp_str ( buf , MAX_FIELD_WIDTH , share - > access_charset ) ;
tmp_str . init_calc_mem ( 211 ) ;
tmp_str . length ( 0 ) ;
if (
tmp_str . append ( ft_init_key - > ptr ( ) , ft_init_key - > length ( ) ,
ft_init_key - > charset ( ) ) | |
str - > reserve ( tmp_str . length ( ) * 2 ) | |
spider_db_oracle_utility . append_escaped_util ( str , tmp_str . get_str ( ) )
)
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
if ( str - > reserve (
SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
( ( ft_info - > flags & FT_BOOL ) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0 ) +
( ( ft_info - > flags & FT_EXPAND ) ?
SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0 )
) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR , SPIDER_SQL_VALUE_QUOTE_LEN ) ;
if ( ft_info - > flags & FT_BOOL )
str - > q_append ( SPIDER_SQL_IN_BOOLEAN_MODE_STR ,
SPIDER_SQL_IN_BOOLEAN_MODE_LEN ) ;
if ( ft_info - > flags & FT_EXPAND )
str - > q_append ( SPIDER_SQL_WITH_QUERY_EXPANSION_STR ,
SPIDER_SQL_WITH_QUERY_EXPANSION_LEN ) ;
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_match_select_part (
ulong sql_type ,
const char * alias ,
uint alias_length
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_match_select_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_match_select ( str , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_match_select (
spider_string * str ,
const char * alias ,
uint alias_length
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_match_select " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( spider - > ft_current )
{
st_spider_ft_info * ft_info = spider - > ft_first ;
while ( TRUE )
{
if ( ( error_num = append_match_against ( str , ft_info ,
alias , alias_length ) ) )
DBUG_RETURN ( error_num ) ;
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 ( ft_info = = spider - > ft_current )
break ;
ft_info = ft_info - > next ;
}
}
DBUG_RETURN ( 0 ) ;
}
# ifdef HANDLER_HAS_DIRECT_AGGREGATE
int spider_oracle_handler : : append_sum_select_part (
ulong sql_type ,
const char * alias ,
uint alias_length
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_sum_select_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_sum_select ( str , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_sum_select (
spider_string * str ,
const char * alias ,
uint alias_length
) {
int error_num ;
st_select_lex * select_lex ;
DBUG_ENTER ( " spider_oracle_handler::append_sum_select " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
select_lex = spider_get_select_lex ( spider ) ;
JOIN * join = select_lex - > join ;
Item_sum * * item_sum_ptr ;
for ( item_sum_ptr = join - > sum_funcs ; * item_sum_ptr ; + + item_sum_ptr )
{
if ( ( error_num = spider_db_oracle_utility . open_item_sum_func ( * item_sum_ptr ,
spider , str , alias , alias_length ) ) )
{
DBUG_RETURN ( error_num ) ;
}
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 ) ;
}
DBUG_RETURN ( 0 ) ;
}
# endif
void spider_oracle_handler : : set_order_pos (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::set_order_pos " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
order_pos = sql . length ( ) ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
order_pos = update_sql . length ( ) ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
ha_next_pos = ha_sql . length ( ) ;
break ;
default :
DBUG_ASSERT ( 0 ) ;
break ;
}
DBUG_VOID_RETURN ;
}
void spider_oracle_handler : : set_order_to_pos (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::set_order_to_pos " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
sql . length ( order_pos ) ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
update_sql . length ( order_pos ) ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
ha_sql . length ( ha_next_pos ) ;
break ;
default :
DBUG_ASSERT ( 0 ) ;
break ;
}
DBUG_VOID_RETURN ;
}
# ifdef HANDLER_HAS_DIRECT_AGGREGATE
int spider_oracle_handler : : append_group_by (
spider_string * str ,
const char * alias ,
uint alias_length
) {
int error_num ;
st_select_lex * select_lex ;
DBUG_ENTER ( " spider_oracle_handler::append_group_by " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
select_lex = spider_get_select_lex ( spider ) ;
ORDER * group = ( ORDER * ) select_lex - > group_list . first ;
if ( group )
{
if ( str - > reserve ( SPIDER_SQL_GROUP_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_GROUP_STR , SPIDER_SQL_GROUP_LEN ) ;
for ( ; group ; group = group - > next )
{
if ( ( error_num = spider_db_print_item_type ( ( * group - > item ) , spider , str ,
alias , alias_length , spider_dbton_oracle . dbton_id ) ) )
{
DBUG_RETURN ( error_num ) ;
}
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 ) ;
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
# endif
int spider_oracle_handler : : append_key_order_for_merge_with_alias_part (
const char * alias ,
uint alias_length ,
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_key_order_for_merge_with_alias_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
ha_limit_pos = ha_sql . length ( ) ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_key_order_for_merge_with_alias ( str , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_key_order_for_merge_with_alias (
spider_string * str ,
const char * alias ,
uint alias_length
) {
/* sort for index merge */
TABLE * table = spider - > get_table ( ) ;
int length ;
Field * field ;
uint key_name_length ;
DBUG_ENTER ( " spider_oracle_handler::append_key_order_for_merge_with_alias " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
# ifdef HANDLER_HAS_DIRECT_AGGREGATE
if ( spider - > result_list . direct_aggregate )
{
int error_num ;
if ( ( error_num = append_group_by ( str , alias , alias_length ) ) )
DBUG_RETURN ( error_num ) ;
}
# endif
if (
spider - > result_list . direct_order_limit | |
spider - > result_list . internal_limit < 9223372036854775807LL | |
spider - > result_list . split_read < 9223372036854775807LL | |
spider - > result_list . internal_offset
) {
if ( update_rownum_appended | | select_rownum_appended )
{
if ( str - > reserve ( SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
order_pos = str - > length ( ) ;
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
sql_part . length ( 0 ) ;
if ( str = = & update_sql )
{
if ( sql_part . reserve ( str - > length ( ) + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( str - > ptr ( ) , where_pos ) ;
sql_part . q_append ( SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR ,
SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN ) ;
} else {
if ( sql_part . reserve ( str - > length ( ) + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_HEAD_STR ,
SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN ) ;
sql_part . q_append ( str - > ptr ( ) , table_name_pos - SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_HEAD_STR ,
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) ;
}
if ( table - > s - > primary_key < MAX_KEY )
{
/* sort by primary key */
KEY * key_info = & table - > key_info [ table - > s - > primary_key ] ;
KEY_PART_INFO * key_part ;
for (
key_part = key_info - > key_part ,
length = 1 ;
length < = ( int ) spider_user_defined_key_parts ( key_info ) ;
key_part + + ,
length + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( sql_part . reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( & sql_part , field - > field_index ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
} else {
/* sort by all columns */
Field * * fieldp ;
for (
fieldp = table - > field , length = 1 ;
* fieldp ;
fieldp + + , length + +
) {
key_name_length =
oracle_share - > column_name_str [ ( * fieldp ) - > field_index ] . length ( ) ;
if ( sql_part . reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( & sql_part , ( * fieldp ) - > field_index ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
uint pos_diff ;
if ( str = = & update_sql )
{
uint table_name_size = ( update_set_pos ? update_set_pos : where_pos ) -
table_name_pos ;
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - where_pos +
SPIDER_SQL_FROM_LEN + table_name_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_TAIL_LEN ) ;
sql_part . q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( str - > ptr ( ) + table_name_pos , table_name_size ) ;
pos_diff = sql_part . length ( ) - where_pos ;
sql_part . q_append ( str - > ptr ( ) + where_pos , str - > length ( ) - where_pos ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
update_rownum_appended = TRUE ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - table_name_pos +
SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_TAIL_LEN ) ;
pos_diff = sql_part . length ( ) + SPIDER_SQL_FROM_LEN - table_name_pos ;
sql_part . q_append ( str - > ptr ( ) + table_name_pos - SPIDER_SQL_FROM_LEN ,
str - > length ( ) - table_name_pos + SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
select_rownum_appended = TRUE ;
table_name_pos = table_name_pos + pos_diff ;
}
if ( str - > copy ( sql_part ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
where_pos = where_pos + pos_diff ;
order_pos = str - > length ( ) ;
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
if ( table - > s - > primary_key < MAX_KEY )
{
/* sort by primary key */
KEY * key_info = & table - > key_info [ table - > s - > primary_key ] ;
KEY_PART_INFO * key_part ;
for (
key_part = key_info - > key_part ,
length = 1 ;
length < = ( int ) spider_user_defined_key_parts ( key_info ) ;
key_part + + ,
length + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( length = = 1 )
{
if ( str - > reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
}
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
if ( length > 1 )
{
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
}
} else {
/* sort by all columns */
Field * * fieldp ;
for (
fieldp = table - > field , length = 1 ;
* fieldp ;
fieldp + + , length + +
) {
key_name_length =
oracle_share - > column_name_str [ ( * fieldp ) - > field_index ] . length ( ) ;
if ( length = = 1 )
{
if ( str - > reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
}
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , ( * fieldp ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
if ( length > 1 )
{
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
}
}
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_order_for_direct_order_limit_with_alias_part (
const char * alias ,
uint alias_length ,
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_key_order_for_direct_order_limit_with_alias (
str , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_key_order_for_direct_order_limit_with_alias (
spider_string * str ,
const char * alias ,
uint alias_length
) {
int error_num ;
ORDER * order ;
st_select_lex * select_lex ;
longlong select_limit ;
longlong offset_limit ;
DBUG_ENTER ( " spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
# ifdef HANDLER_HAS_DIRECT_AGGREGATE
if ( spider - > result_list . direct_aggregate )
{
if ( ( error_num = append_group_by ( str , alias , alias_length ) ) )
DBUG_RETURN ( error_num ) ;
}
# endif
spider_get_select_limit ( spider , & select_lex , & select_limit ,
& offset_limit ) ;
if (
spider - > result_list . direct_order_limit | |
spider - > result_list . internal_limit < 9223372036854775807LL | |
spider - > result_list . split_read < 9223372036854775807LL | |
spider - > result_list . internal_offset
) {
if ( update_rownum_appended | | select_rownum_appended )
{
if ( str - > reserve ( SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
order_pos = str - > length ( ) ;
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
sql_part . length ( 0 ) ;
if ( str = = & update_sql )
{
if ( sql_part . reserve ( str - > length ( ) + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( str - > ptr ( ) , where_pos ) ;
sql_part . q_append ( SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR ,
SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN ) ;
} else {
if ( sql_part . reserve ( str - > length ( ) + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_HEAD_STR ,
SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN ) ;
sql_part . q_append ( str - > ptr ( ) , table_name_pos - SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_HEAD_STR ,
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) ;
}
bool all_desc = TRUE ;
if ( select_lex - > order_list . first )
{
for ( order = ( ORDER * ) select_lex - > order_list . first ; order ;
order = order - > next )
{
if ( ( error_num =
spider_db_print_item_type ( ( * order - > item ) , spider , & sql_part , alias ,
alias_length , spider_dbton_oracle . dbton_id ) ) )
{
DBUG_PRINT ( " info " , ( " spider error=%d " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
if ( order - > asc )
{
if ( sql_part . reserve ( SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
all_desc = FALSE ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
} else {
all_desc = FALSE ;
}
uint pos_diff ;
if ( str = = & update_sql )
{
uint table_name_size = ( update_set_pos ? update_set_pos : where_pos ) -
table_name_pos ;
if ( all_desc )
{
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - where_pos +
SPIDER_SQL_FROM_LEN + table_name_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN ) ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - where_pos +
SPIDER_SQL_FROM_LEN + table_name_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_TAIL_LEN ) ;
}
sql_part . q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( str - > ptr ( ) + table_name_pos , table_name_size ) ;
pos_diff = sql_part . length ( ) - where_pos ;
sql_part . q_append ( str - > ptr ( ) + where_pos , str - > length ( ) - where_pos ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
update_rownum_appended = TRUE ;
} else {
if ( all_desc )
{
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - table_name_pos +
SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN ) ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - table_name_pos +
SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_TAIL_LEN ) ;
}
pos_diff = sql_part . length ( ) + SPIDER_SQL_FROM_LEN - table_name_pos ;
sql_part . q_append ( str - > ptr ( ) + table_name_pos - SPIDER_SQL_FROM_LEN ,
str - > length ( ) - table_name_pos + SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
select_rownum_appended = TRUE ;
table_name_pos = table_name_pos + pos_diff ;
}
if ( str - > copy ( sql_part ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
where_pos = where_pos + pos_diff ;
order_pos = str - > length ( ) ;
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
if ( select_lex - > order_list . first )
{
if ( str - > reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
for ( order = ( ORDER * ) select_lex - > order_list . first ; order ;
order = order - > next )
{
if ( ( error_num =
spider_db_print_item_type ( ( * order - > item ) , spider , str , alias ,
alias_length , spider_dbton_oracle . dbton_id ) ) )
{
DBUG_PRINT ( " info " , ( " spider error=%d " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
if ( order - > asc )
{
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 ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
}
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_order_with_alias_part (
const char * alias ,
uint alias_length ,
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_key_order_with_alias_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
case SPIDER_SQL_TYPE_TMP_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
error_num = append_key_order_for_handler ( str , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_key_order_with_alias ( str , alias , alias_length ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_key_order_for_handler (
spider_string * str ,
const char * alias ,
uint alias_length
) {
DBUG_ENTER ( " spider_oracle_handler::append_key_order_for_handler " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider ha_next_pos=%d " , ha_next_pos ) ) ;
DBUG_PRINT ( " info " , ( " spider ha_where_pos=%d " , ha_where_pos ) ) ;
str - > q_append ( alias , alias_length ) ;
memset ( ( char * ) str - > ptr ( ) + str - > length ( ) , ' ' ,
ha_where_pos - ha_next_pos - alias_length ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_key_order_with_alias (
spider_string * str ,
const char * alias ,
uint alias_length
) {
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
KEY * key_info = result_list - > key_info ;
int length ;
KEY_PART_INFO * key_part ;
Field * field ;
uint key_name_length ;
DBUG_ENTER ( " spider_oracle_handler::append_key_order_with_alias " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
# ifdef HANDLER_HAS_DIRECT_AGGREGATE
if ( spider - > result_list . direct_aggregate )
{
int error_num ;
if ( ( error_num = append_group_by ( str , alias , alias_length ) ) )
DBUG_RETURN ( error_num ) ;
}
# endif
if (
spider - > result_list . direct_order_limit | |
spider - > result_list . internal_limit < 9223372036854775807LL | |
spider - > result_list . split_read < 9223372036854775807LL | |
spider - > result_list . internal_offset
) {
if ( update_rownum_appended | | select_rownum_appended )
{
if ( str - > reserve ( SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
order_pos = str - > length ( ) ;
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
sql_part . length ( 0 ) ;
if ( str = = & update_sql )
{
if ( sql_part . reserve ( str - > length ( ) + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( str - > ptr ( ) , where_pos ) ;
sql_part . q_append ( SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR ,
SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN ) ;
} else {
if ( sql_part . reserve ( str - > length ( ) + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_HEAD_STR ,
SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN ) ;
sql_part . q_append ( str - > ptr ( ) , table_name_pos - SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_HEAD_STR ,
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) ;
}
if ( result_list - > sorted = = TRUE )
{
if ( result_list - > desc_flg = = TRUE )
{
for (
key_part = key_info - > key_part + result_list - > key_order ,
length = 1 ;
length + result_list - > key_order < =
( int ) spider_user_defined_key_parts ( key_info ) & &
length < = result_list - > max_order ;
key_part + + ,
length + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( sql_part . reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( & sql_part , field - > field_index ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( sql_part . reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( & sql_part , field - > field_index ) ;
sql_part . q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
} else {
for (
key_part = key_info - > key_part + result_list - > key_order ,
length = 1 ;
length + result_list - > key_order < =
( int ) spider_user_defined_key_parts ( key_info ) & &
length < = result_list - > max_order ;
key_part + + ,
length + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( sql_part . reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( & sql_part , field - > field_index ) ;
sql_part . q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( sql_part . reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( & sql_part , field - > field_index ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
}
}
uint pos_diff ;
if ( str = = & update_sql )
{
uint table_name_size = ( update_set_pos ? update_set_pos : where_pos ) -
table_name_pos ;
if ( result_list - > sorted = = TRUE & & result_list - > desc_flg = = TRUE )
{
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - where_pos +
SPIDER_SQL_FROM_LEN + table_name_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN ) ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - where_pos +
SPIDER_SQL_FROM_LEN + table_name_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_TAIL_LEN ) ;
}
sql_part . q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( str - > ptr ( ) + table_name_pos ,
table_name_size ) ;
pos_diff = sql_part . length ( ) - where_pos ;
sql_part . q_append ( str - > ptr ( ) + where_pos , str - > length ( ) - where_pos ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
update_rownum_appended = TRUE ;
} else {
if ( result_list - > sorted = = TRUE & & result_list - > desc_flg = = TRUE )
{
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - table_name_pos +
SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN ) ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str - > length ( ) - table_name_pos +
SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_TAIL_LEN ) ;
}
pos_diff = sql_part . length ( ) + SPIDER_SQL_FROM_LEN - table_name_pos ;
sql_part . q_append ( str - > ptr ( ) + table_name_pos - SPIDER_SQL_FROM_LEN ,
str - > length ( ) - table_name_pos + SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
select_rownum_appended = TRUE ;
table_name_pos = table_name_pos + pos_diff ;
}
if ( str - > copy ( sql_part ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
where_pos = where_pos + pos_diff ;
order_pos = str - > length ( ) ;
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
if ( result_list - > sorted = = TRUE )
{
if ( result_list - > desc_flg = = TRUE )
{
for (
key_part = key_info - > key_part + result_list - > key_order ,
length = 1 ;
length + result_list - > key_order <
( int ) spider_user_defined_key_parts ( key_info ) & &
length < result_list - > max_order ;
key_part + + ,
length + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( length = = 1 )
{
if ( str - > reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
}
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
if (
length + result_list - > key_order < =
( int ) spider_user_defined_key_parts ( key_info ) & &
length < = result_list - > max_order
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( length = = 1 )
{
if ( str - > reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
}
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
} else {
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
}
}
} else {
for (
key_part = key_info - > key_part + result_list - > key_order ,
length = 1 ;
length + result_list - > key_order <
( int ) spider_user_defined_key_parts ( key_info ) & &
length < result_list - > max_order ;
key_part + + ,
length + +
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( length = = 1 )
{
if ( str - > reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
}
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
if (
length + result_list - > key_order < =
( int ) spider_user_defined_key_parts ( key_info ) & &
length < = result_list - > max_order
) {
field = key_part - > field ;
key_name_length =
oracle_share - > column_name_str [ field - > field_index ] . length ( ) ;
if ( length = = 1 )
{
if ( str - > reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
}
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
str - > q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
} else {
if ( str - > reserve ( alias_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( alias , alias_length ) ;
oracle_share - > append_column_name ( str , field - > field_index ) ;
}
}
}
}
limit_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_limit_part (
longlong offset ,
longlong limit ,
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_limit_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
limit_pos = str - > length ( ) ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
limit_pos = str - > length ( ) ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
limit_pos = str - > length ( ) ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
ha_limit_pos = str - > length ( ) ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_limit ( str , offset , limit ) ;
DBUG_PRINT ( " info " , ( " spider str=%s " , str - > c_ptr_safe ( ) ) ) ;
DBUG_PRINT ( " info " , ( " spider length=%u " , str - > length ( ) ) ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : reappend_limit_part (
longlong offset ,
longlong limit ,
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::reappend_limit_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
str - > length ( limit_pos ) ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
str - > length ( limit_pos ) ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
str - > length ( limit_pos ) ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
str - > length ( ha_limit_pos ) ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_limit ( str , offset , limit ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_limit (
spider_string * str ,
longlong offset ,
longlong limit
) {
char buf [ SPIDER_LONGLONG_LEN + 1 ] ;
uint32 length ;
DBUG_ENTER ( " spider_oracle_handler::append_limit " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider offset=%lld " , offset ) ) ;
DBUG_PRINT ( " info " , ( " spider limit=%lld " , limit ) ) ;
if ( offset | | limit < 9223372036854775807LL )
{
if ( ( int ) str - > length ( ) = = where_pos )
{
if ( offset )
{
int error_num ;
if ( ( error_num = append_key_order_for_direct_order_limit_with_alias (
str , NULL , 0 ) ) )
DBUG_RETURN ( error_num ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_WHERE_LEN + SPIDER_SQL_ROWNUM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_WHERE_STR , SPIDER_SQL_WHERE_LEN ) ;
str - > q_append ( SPIDER_SQL_ROWNUM_STR , SPIDER_SQL_ROWNUM_LEN ) ;
}
}
if ( offset )
{
if ( str - > reserve ( SPIDER_SQL_BETWEEN_LEN + SPIDER_SQL_AND_LEN +
( ( SPIDER_LONGLONG_LEN ) * 2 ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_BETWEEN_STR , SPIDER_SQL_BETWEEN_LEN ) ;
length = ( uint32 ) ( my_charset_bin . cset - > longlong10_to_str ) (
& my_charset_bin , buf , SPIDER_LONGLONG_LEN + 1 , - 10 , offset + 1 ) ;
str - > q_append ( buf , length ) ;
str - > q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
length = ( uint32 ) ( my_charset_bin . cset - > longlong10_to_str ) (
& my_charset_bin , buf , SPIDER_LONGLONG_LEN + 1 , - 10 , limit + offset ) ;
str - > q_append ( buf , length ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_HS_LTEQUAL_LEN +
( SPIDER_LONGLONG_LEN ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_HS_LTEQUAL_STR , SPIDER_SQL_HS_LTEQUAL_LEN ) ;
length = ( uint32 ) ( my_charset_bin . cset - > longlong10_to_str ) (
& my_charset_bin , buf , SPIDER_LONGLONG_LEN + 1 , - 10 , limit ) ;
str - > q_append ( buf , length ) ;
}
if ( update_rownum_appended )
{
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 ) ;
}
int spider_oracle_handler : : append_select_lock_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_select_lock_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_select_lock ( str ) ;
DBUG_PRINT ( " info " , ( " spider str=%s " , str - > c_ptr_safe ( ) ) ) ;
DBUG_PRINT ( " info " , ( " spider length=%u " , str - > length ( ) ) ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_select_lock (
spider_string * str
) {
int lock_mode = spider_conn_lock_mode ( spider ) ;
DBUG_ENTER ( " spider_oracle_handler::append_select_lock " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( select_rownum_appended )
{
table_lock_mode = lock_mode ;
} else {
if ( lock_mode = = SPIDER_LOCK_MODE_EXCLUSIVE )
{
if ( str - > reserve ( SPIDER_SQL_FOR_UPDATE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_FOR_UPDATE_STR , SPIDER_SQL_FOR_UPDATE_LEN ) ;
} else if ( lock_mode = = SPIDER_LOCK_MODE_SHARED )
{
if ( str - > reserve ( SPIDER_SQL_FOR_UPDATE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_FOR_UPDATE_STR , SPIDER_SQL_FOR_UPDATE_LEN ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_union_all_start_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_union_all_start_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_union_all_start ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_union_all_start (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_union_all_start " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
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_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_union_all_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_union_all_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_union_all ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_union_all (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_union_all " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_UNION_ALL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_UNION_ALL_STR , SPIDER_SQL_UNION_ALL_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_union_all_end_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_union_all_end_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_union_all_end ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_union_all_end (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_union_all_end " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( str - > length ( ) -
SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_multi_range_cnt_part (
ulong sql_type ,
uint multi_range_cnt ,
bool with_comma
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_multi_range_cnt_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_multi_range_cnt ( str , multi_range_cnt , with_comma ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_multi_range_cnt (
spider_string * str ,
uint multi_range_cnt ,
bool with_comma
) {
int range_cnt_length ;
char range_cnt_str [ SPIDER_SQL_INT_LEN ] ;
DBUG_ENTER ( " spider_oracle_handler::append_multi_range_cnt " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
range_cnt_length = my_sprintf ( range_cnt_str , ( range_cnt_str , " %u " ,
multi_range_cnt ) ) ;
if ( with_comma )
{
if ( str - > reserve ( range_cnt_length + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( range_cnt_str , range_cnt_length ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( str - > reserve ( range_cnt_length ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( range_cnt_str , range_cnt_length ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_multi_range_cnt_with_name_part (
ulong sql_type ,
uint multi_range_cnt
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_multi_range_cnt_with_name_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
str = & sql ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
str = & tmp_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_multi_range_cnt_with_name ( str , multi_range_cnt ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_multi_range_cnt_with_name (
spider_string * str ,
uint multi_range_cnt
) {
int range_cnt_length ;
char range_cnt_str [ SPIDER_SQL_INT_LEN ] ;
DBUG_ENTER ( " spider_oracle_handler::append_multi_range_cnt_with_name " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
range_cnt_length = my_sprintf ( range_cnt_str , ( range_cnt_str , " %u " ,
multi_range_cnt ) ) ;
if ( str - > reserve ( range_cnt_length + SPIDER_SQL_SPACE_LEN +
SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( range_cnt_str , range_cnt_length ) ;
str - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
str - > q_append ( SPIDER_SQL_ID_STR , SPIDER_SQL_ID_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_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_oracle_handler::append_open_handler_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_open_handler ( str , handler_id , conn , link_idx ) ;
exec_ha_sql = str ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_open_handler (
spider_string * str ,
uint handler_id ,
SPIDER_CONN * conn ,
int link_idx
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_open_handler " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider link_idx=%d " , link_idx ) ) ;
DBUG_PRINT ( " info " , ( " spider m_handler_cid=%s " ,
spider - > m_handler_cid [ link_idx ] ) ) ;
if ( str - > reserve ( SPIDER_SQL_HANDLER_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_HANDLER_STR , SPIDER_SQL_HANDLER_LEN ) ;
if ( ( error_num = oracle_share - > append_table_name ( str ,
spider - > conn_link_idx [ link_idx ] ) ) )
DBUG_RETURN ( error_num ) ;
if ( str - > reserve ( SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
SPIDER_SQL_HANDLER_CID_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_OPEN_STR , SPIDER_SQL_OPEN_LEN ) ;
str - > q_append ( SPIDER_SQL_AS_STR , SPIDER_SQL_AS_LEN ) ;
str - > q_append ( spider - > m_handler_cid [ link_idx ] , SPIDER_SQL_HANDLER_CID_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_close_handler_part (
ulong sql_type ,
int link_idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_close_handler_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_close_handler ( str , link_idx ) ;
exec_ha_sql = str ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_close_handler (
spider_string * str ,
int link_idx
) {
DBUG_ENTER ( " spider_oracle_handler::append_close_handler " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
SPIDER_SQL_HANDLER_CID_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_HANDLER_STR , SPIDER_SQL_HANDLER_LEN ) ;
str - > q_append ( spider - > m_handler_cid [ link_idx ] ,
SPIDER_SQL_HANDLER_CID_LEN ) ;
str - > q_append ( SPIDER_SQL_CLOSE_STR , SPIDER_SQL_CLOSE_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_insert_terminator_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_insert_terminator_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_INSERT_SQL :
str = & insert_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_insert_terminator ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_insert_terminator (
spider_string * str
) {
DBUG_ENTER ( " spider_oracle_handler::append_insert_terminator " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( spider - > result_list . insert_dup_update_pushdown )
{
DBUG_PRINT ( " info " , ( " spider add duplicate key update " ) ) ;
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( str - > reserve ( SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
dup_update_sql . length ( ) ) )
{
str - > length ( 0 ) ;
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR ,
SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN ) ;
if ( str - > append ( dup_update_sql ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
} else {
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_insert_values_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_insert_values_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_INSERT_SQL :
str = & insert_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_insert_values ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_insert_values (
spider_string * str
) {
SPIDER_SHARE * share = spider - > share ;
TABLE * table = spider - > get_table ( ) ;
Field * * field ;
bool add_value = FALSE ;
DBUG_ENTER ( " spider_oracle_handler::append_insert_values " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
nextval_pos = 0 ;
if ( str - > reserve ( SPIDER_SQL_OPEN_PAREN_LEN ) )
{
str - > length ( 0 ) ;
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
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
add_value = TRUE ;
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 (
table - > next_number_field = = * field & &
! table - > auto_increment_field_not_null & &
! spider - > force_auto_increment
) {
nextval_pos = str - > length ( ) ;
if ( str - > reserve ( oracle_share - > nextval_max_length +
SPIDER_SQL_COMMA_LEN ) )
{
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
str - > length ( 0 ) ;
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > length ( str - > length ( ) + oracle_share - > nextval_max_length ) ;
} else if ( ( * field ) - > is_null ( ) )
{
if ( str - > reserve ( SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN ) )
{
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
str - > length ( 0 ) ;
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_NULL_STR , SPIDER_SQL_NULL_LEN ) ;
} else {
if (
spider_db_oracle_utility .
append_column_value ( spider , str , * field , NULL ,
share - > access_charset ) | |
str - > reserve ( SPIDER_SQL_COMMA_LEN )
) {
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
str - > length ( 0 ) ;
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
}
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
# ifndef DBUG_OFF
dbug_tmp_restore_column_map ( table - > read_set , tmp_map ) ;
# endif
}
}
if ( add_value )
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( str - > reserve ( SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN ) )
{
str - > length ( 0 ) ;
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_into_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_into_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_INSERT_SQL :
str = & insert_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_into ( str ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_into (
spider_string * str
) {
const TABLE * table = spider - > get_table ( ) ;
Field * * field ;
uint field_name_length = 0 ;
DBUG_ENTER ( " spider_oracle_handler::append_into " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_INTO_LEN + oracle_share - > db_nm_max_length +
SPIDER_SQL_DOT_LEN + oracle_share - > table_nm_max_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_INTO_STR , SPIDER_SQL_INTO_LEN ) ;
insert_table_name_pos = str - > length ( ) ;
append_table_name_with_adjusting ( str , first_link_idx ,
SPIDER_SQL_TYPE_INSERT_SQL ) ;
str - > q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
for ( field = table - > field ; * field ; field + + )
{
if (
bitmap_is_set ( table - > write_set , ( * field ) - > field_index ) | |
bitmap_is_set ( table - > read_set , ( * field ) - > field_index )
) {
field_name_length =
oracle_share - > column_name_str [ ( * field ) - > field_index ] . length ( ) ;
if ( str - > reserve ( field_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
oracle_share - > append_column_name ( str , ( * field ) - > field_index ) ;
str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
if ( field_name_length )
str - > length ( str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( str - > reserve ( SPIDER_SQL_VALUES_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_VALUES_STR , SPIDER_SQL_VALUES_LEN ) ;
insert_pos = str - > length ( ) ;
DBUG_RETURN ( 0 ) ;
}
void spider_oracle_handler : : set_insert_to_pos (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::set_insert_to_pos " ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_INSERT_SQL :
insert_sql . length ( insert_pos ) ;
break ;
default :
DBUG_ASSERT ( 0 ) ;
break ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_handler : : append_from_part (
ulong sql_type ,
int link_idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_from_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_HANDLER :
str = & ha_sql ;
break ;
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
str = & update_sql ;
break ;
default :
str = & sql ;
break ;
}
error_num = append_from ( str , sql_type , link_idx ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_from (
spider_string * str ,
ulong sql_type ,
int link_idx
) {
DBUG_ENTER ( " spider_oracle_handler::append_from " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider link_idx=%d " , link_idx ) ) ;
if ( sql_type = = SPIDER_SQL_TYPE_HANDLER )
{
ha_table_name_pos = str - > length ( ) ;
DBUG_PRINT ( " info " , ( " spider ha_table_name_pos=%u " , ha_table_name_pos ) ) ;
ha_sql_handler_id = spider - > m_handler_id [ link_idx ] ;
DBUG_PRINT ( " info " , ( " spider ha_sql_handler_id=%u " , ha_sql_handler_id ) ) ;
if ( str - > reserve ( SPIDER_SQL_HANDLER_CID_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( spider - > m_handler_cid [ link_idx ] , SPIDER_SQL_HANDLER_CID_LEN ) ;
DBUG_PRINT ( " info " , ( " spider m_handler_cid=%s " ,
spider - > m_handler_cid [ link_idx ] ) ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_FROM_LEN + oracle_share - > db_nm_max_length +
SPIDER_SQL_DOT_LEN + oracle_share - > table_nm_max_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
table_name_pos = str - > length ( ) ;
append_table_name_with_adjusting ( str , link_idx , sql_type ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_flush_tables_part (
ulong sql_type ,
int link_idx ,
bool lock
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_flush_tables_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_flush_tables ( str , link_idx , lock ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_flush_tables (
spider_string * str ,
int link_idx ,
bool lock
) {
DBUG_ENTER ( " spider_oracle_handler::append_flush_tables " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( lock )
{
if ( str - > reserve ( SPIDER_SQL_FLUSH_TABLES_LEN +
SPIDER_SQL_WITH_READ_LOCK_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_FLUSH_TABLES_STR , SPIDER_SQL_FLUSH_TABLES_LEN ) ;
str - > q_append ( SPIDER_SQL_WITH_READ_LOCK_STR ,
SPIDER_SQL_WITH_READ_LOCK_LEN ) ;
} else {
if ( str - > reserve ( SPIDER_SQL_FLUSH_TABLES_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_FLUSH_TABLES_STR , SPIDER_SQL_FLUSH_TABLES_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_optimize_table_part (
ulong sql_type ,
int link_idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_optimize_table_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_optimize_table ( str , link_idx ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_optimize_table (
spider_string * str ,
int link_idx
) {
SPIDER_SHARE * share = spider - > share ;
int conn_link_idx = spider - > conn_link_idx [ link_idx ] ;
int local_length = spider_param_internal_optimize_local ( spider - > trx - > thd ,
share - > internal_optimize_local ) * SPIDER_SQL_SQL_LOCAL_LEN ;
DBUG_ENTER ( " spider_oracle_handler::append_optimize_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
local_length +
oracle_share - > db_names_str [ conn_link_idx ] . length ( ) +
SPIDER_SQL_DOT_LEN +
oracle_share - > table_names_str [ conn_link_idx ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_OPTIMIZE_STR , SPIDER_SQL_SQL_OPTIMIZE_LEN ) ;
if ( local_length )
str - > q_append ( SPIDER_SQL_SQL_LOCAL_STR , SPIDER_SQL_SQL_LOCAL_LEN ) ;
str - > q_append ( SPIDER_SQL_SQL_TABLE_STR , SPIDER_SQL_SQL_TABLE_LEN ) ;
oracle_share - > append_table_name ( str , conn_link_idx ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_analyze_table_part (
ulong sql_type ,
int link_idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_analyze_table_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_analyze_table ( str , link_idx ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_analyze_table (
spider_string * str ,
int link_idx
) {
SPIDER_SHARE * share = spider - > share ;
int conn_link_idx = spider - > conn_link_idx [ link_idx ] ;
int local_length = spider_param_internal_optimize_local ( spider - > trx - > thd ,
share - > internal_optimize_local ) * SPIDER_SQL_SQL_LOCAL_LEN ;
DBUG_ENTER ( " spider_oracle_handler::append_analyze_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
local_length +
oracle_share - > db_names_str [ conn_link_idx ] . length ( ) +
SPIDER_SQL_DOT_LEN +
oracle_share - > table_names_str [ conn_link_idx ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_ANALYZE_STR , SPIDER_SQL_SQL_ANALYZE_LEN ) ;
if ( local_length )
str - > q_append ( SPIDER_SQL_SQL_LOCAL_STR , SPIDER_SQL_SQL_LOCAL_LEN ) ;
str - > q_append ( SPIDER_SQL_SQL_TABLE_STR , SPIDER_SQL_SQL_TABLE_LEN ) ;
oracle_share - > append_table_name ( str , conn_link_idx ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_repair_table_part (
ulong sql_type ,
int link_idx ,
HA_CHECK_OPT * check_opt
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_repair_table_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_repair_table ( str , link_idx , check_opt ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_repair_table (
spider_string * str ,
int link_idx ,
HA_CHECK_OPT * check_opt
) {
SPIDER_SHARE * share = spider - > share ;
int conn_link_idx = spider - > conn_link_idx [ link_idx ] ;
int local_length = spider_param_internal_optimize_local ( spider - > trx - > thd ,
share - > internal_optimize_local ) * SPIDER_SQL_SQL_LOCAL_LEN ;
DBUG_ENTER ( " spider_oracle_handler::append_repair_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
local_length +
oracle_share - > db_names_str [ conn_link_idx ] . length ( ) +
SPIDER_SQL_DOT_LEN +
oracle_share - > table_names_str [ conn_link_idx ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_REPAIR_STR , SPIDER_SQL_SQL_REPAIR_LEN ) ;
if ( local_length )
str - > q_append ( SPIDER_SQL_SQL_LOCAL_STR , SPIDER_SQL_SQL_LOCAL_LEN ) ;
str - > q_append ( SPIDER_SQL_SQL_TABLE_STR , SPIDER_SQL_SQL_TABLE_LEN ) ;
oracle_share - > append_table_name ( str , conn_link_idx ) ;
if ( check_opt - > flags & T_QUICK )
{
if ( str - > reserve ( SPIDER_SQL_SQL_QUICK_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_QUICK_STR , SPIDER_SQL_SQL_QUICK_LEN ) ;
}
if ( check_opt - > flags & T_EXTEND )
{
if ( str - > reserve ( SPIDER_SQL_SQL_EXTENDED_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_EXTENDED_STR , SPIDER_SQL_SQL_EXTENDED_LEN ) ;
}
if ( check_opt - > sql_flags & TT_USEFRM )
{
if ( str - > reserve ( SPIDER_SQL_SQL_USE_FRM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_USE_FRM_STR , SPIDER_SQL_SQL_USE_FRM_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_check_table_part (
ulong sql_type ,
int link_idx ,
HA_CHECK_OPT * check_opt
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_check_table_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_check_table ( str , link_idx , check_opt ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_check_table (
spider_string * str ,
int link_idx ,
HA_CHECK_OPT * check_opt
) {
int conn_link_idx = spider - > conn_link_idx [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::append_check_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SQL_CHECK_TABLE_LEN +
oracle_share - > db_names_str [ conn_link_idx ] . length ( ) +
SPIDER_SQL_DOT_LEN +
oracle_share - > table_names_str [ conn_link_idx ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_CHECK_TABLE_STR ,
SPIDER_SQL_SQL_CHECK_TABLE_LEN ) ;
oracle_share - > append_table_name ( str , conn_link_idx ) ;
if ( check_opt - > flags & T_QUICK )
{
if ( str - > reserve ( SPIDER_SQL_SQL_QUICK_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_QUICK_STR , SPIDER_SQL_SQL_QUICK_LEN ) ;
}
if ( check_opt - > flags & T_FAST )
{
if ( str - > reserve ( SPIDER_SQL_SQL_FAST_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_FAST_STR , SPIDER_SQL_SQL_FAST_LEN ) ;
}
if ( check_opt - > flags & T_MEDIUM )
{
if ( str - > reserve ( SPIDER_SQL_SQL_MEDIUM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_MEDIUM_STR , SPIDER_SQL_SQL_MEDIUM_LEN ) ;
}
if ( check_opt - > flags & T_EXTEND )
{
if ( str - > reserve ( SPIDER_SQL_SQL_EXTENDED_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_EXTENDED_STR , SPIDER_SQL_SQL_EXTENDED_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_enable_keys_part (
ulong sql_type ,
int link_idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_enable_keys_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_enable_keys ( str , link_idx ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_enable_keys (
spider_string * str ,
int link_idx
) {
int conn_link_idx = spider - > conn_link_idx [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::append_enable_keys " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SQL_ALTER_TABLE_LEN +
oracle_share - > db_names_str [ conn_link_idx ] . length ( ) +
SPIDER_SQL_DOT_LEN +
oracle_share - > table_names_str [ conn_link_idx ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_ALTER_TABLE_STR ,
SPIDER_SQL_SQL_ALTER_TABLE_LEN ) ;
oracle_share - > append_table_name ( str , conn_link_idx ) ;
str - > q_append ( SPIDER_SQL_SQL_ENABLE_KEYS_STR ,
SPIDER_SQL_SQL_ENABLE_KEYS_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_disable_keys_part (
ulong sql_type ,
int link_idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_disable_keys_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_disable_keys ( str , link_idx ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_disable_keys (
spider_string * str ,
int link_idx
) {
int conn_link_idx = spider - > conn_link_idx [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::append_disable_keys " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_SQL_ALTER_TABLE_LEN +
oracle_share - > db_names_str [ conn_link_idx ] . length ( ) +
SPIDER_SQL_DOT_LEN +
oracle_share - > table_names_str [ conn_link_idx ] . length ( ) +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_SQL_ALTER_TABLE_STR ,
SPIDER_SQL_SQL_ALTER_TABLE_LEN ) ;
oracle_share - > append_table_name ( str , conn_link_idx ) ;
str - > q_append ( SPIDER_SQL_SQL_DISABLE_KEYS_STR ,
SPIDER_SQL_SQL_DISABLE_KEYS_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_delete_all_rows_part (
ulong sql_type
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_delete_all_rows_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_DELETE_SQL :
str = & update_sql ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num = append_delete_all_rows ( str , sql_type ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_delete_all_rows (
spider_string * str ,
ulong sql_type
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_delete_all_rows " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( spider - > sql_command = = SQLCOM_TRUNCATE )
{
if ( ( error_num = append_truncate ( str , sql_type , first_link_idx ) ) )
DBUG_RETURN ( error_num ) ;
} else {
if (
( error_num = append_delete ( str ) ) | |
( error_num = append_from ( str , sql_type , first_link_idx ) )
)
DBUG_RETURN ( error_num ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_truncate (
spider_string * str ,
ulong sql_type ,
int link_idx
) {
DBUG_ENTER ( " spider_oracle_handler::append_truncate " ) ;
if ( str - > reserve ( SPIDER_SQL_TRUNCATE_TABLE_LEN +
oracle_share - > db_nm_max_length +
SPIDER_SQL_DOT_LEN + oracle_share - > table_nm_max_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_TRUNCATE_TABLE_STR , SPIDER_SQL_TRUNCATE_TABLE_LEN ) ;
table_name_pos = str - > length ( ) ;
append_table_name_with_adjusting ( str , link_idx , sql_type ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_explain_select_part (
key_range * start_key ,
key_range * end_key ,
ulong sql_type ,
int link_idx
) {
int error_num ;
spider_string * str ;
DBUG_ENTER ( " spider_oracle_handler::append_explain_select_part " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_OTHER_SQL :
str = & spider - > result_list . sqls [ link_idx ] ;
break ;
default :
DBUG_RETURN ( 0 ) ;
}
error_num =
append_explain_select ( str , start_key , end_key , sql_type , link_idx ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : append_explain_select (
spider_string * str ,
key_range * start_key ,
key_range * end_key ,
ulong sql_type ,
int link_idx
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::append_explain_select " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( str - > reserve ( SPIDER_SQL_EXPLAIN_SELECT_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
str - > q_append ( SPIDER_SQL_EXPLAIN_SELECT_STR , SPIDER_SQL_EXPLAIN_SELECT_LEN ) ;
if (
( error_num = append_from ( str , sql_type , link_idx ) ) | |
( error_num = append_key_where ( str , NULL , NULL , start_key , end_key ,
sql_type , FALSE ) )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
DBUG_RETURN ( 0 ) ;
}
bool spider_oracle_handler : : is_bulk_insert_exec_period (
bool bulk_end
) {
DBUG_ENTER ( " spider_oracle_handler::is_bulk_insert_exec_period " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_PRINT ( " info " , ( " spider insert_sql.length=%u " , insert_sql . length ( ) ) ) ;
DBUG_PRINT ( " info " , ( " spider insert_pos=%d " , insert_pos ) ) ;
DBUG_PRINT ( " info " , ( " spider insert_sql=%s " , insert_sql . c_ptr_safe ( ) ) ) ;
if (
/*
( bulk_end | | ( int ) insert_sql . length ( ) > = spider - > bulk_size ) & &
*/
( int ) insert_sql . length ( ) > insert_pos
) {
DBUG_RETURN ( TRUE ) ;
}
DBUG_RETURN ( FALSE ) ;
}
bool spider_oracle_handler : : sql_is_filled_up (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::sql_is_filled_up " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( filled_up ) ;
}
bool spider_oracle_handler : : sql_is_empty (
ulong sql_type
) {
bool is_empty ;
DBUG_ENTER ( " spider_oracle_handler::sql_is_empty " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
is_empty = ( sql . length ( ) = = 0 ) ;
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
is_empty = ( insert_sql . length ( ) = = 0 ) ;
break ;
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
is_empty = ( update_sql . length ( ) = = 0 ) ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
is_empty = ( tmp_sql . length ( ) = = 0 ) ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
is_empty = ( ha_sql . length ( ) = = 0 ) ;
break ;
default :
is_empty = TRUE ;
break ;
}
DBUG_RETURN ( is_empty ) ;
}
bool spider_oracle_handler : : support_multi_split_read ( )
{
DBUG_ENTER ( " spider_oracle_handler::support_multi_split_read " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
bool spider_oracle_handler : : support_bulk_update ( )
{
DBUG_ENTER ( " spider_oracle_handler::support_bulk_update " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_oracle_handler : : bulk_tmp_table_insert ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::bulk_tmp_table_insert " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = store_sql_to_bulk_tmp_table ( & update_sql , upd_tmp_tbl ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : bulk_tmp_table_insert (
int link_idx
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::bulk_tmp_table_insert " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = store_sql_to_bulk_tmp_table (
& spider - > result_list . update_sqls [ link_idx ] ,
spider - > result_list . upd_tmp_tbls [ link_idx ] ) ;
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : bulk_tmp_table_end_bulk_insert ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::bulk_tmp_table_end_bulk_insert " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ( error_num = upd_tmp_tbl - > file - > ha_end_bulk_insert ( ) ) )
{
DBUG_RETURN ( error_num ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : bulk_tmp_table_rnd_init ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::bulk_tmp_table_rnd_init " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
upd_tmp_tbl - > file - > extra ( HA_EXTRA_CACHE ) ;
if ( ( error_num = upd_tmp_tbl - > file - > ha_rnd_init ( TRUE ) ) )
{
DBUG_RETURN ( error_num ) ;
}
reading_from_bulk_tmp_table = TRUE ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : bulk_tmp_table_rnd_next ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::bulk_tmp_table_rnd_next " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
# if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
error_num = upd_tmp_tbl - > file - > ha_rnd_next ( upd_tmp_tbl - > record [ 0 ] ) ;
# else
error_num = upd_tmp_tbl - > file - > rnd_next ( upd_tmp_tbl - > record [ 0 ] ) ;
# endif
if ( ! error_num )
{
error_num = restore_sql_from_bulk_tmp_table ( & insert_sql , upd_tmp_tbl ) ;
}
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_handler : : bulk_tmp_table_rnd_end ( )
{
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::bulk_tmp_table_rnd_end " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
reading_from_bulk_tmp_table = FALSE ;
if ( ( error_num = upd_tmp_tbl - > file - > ha_rnd_end ( ) ) )
{
DBUG_RETURN ( error_num ) ;
}
DBUG_RETURN ( 0 ) ;
}
bool spider_oracle_handler : : need_copy_for_update (
int link_idx
) {
int all_link_idx = spider - > conn_link_idx [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::need_copy_for_update " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( ! oracle_share - > same_db_table_name | |
spider - > share - > link_statuses [ all_link_idx ] = = SPIDER_LINK_STATUS_RECOVERY ) ;
}
bool spider_oracle_handler : : bulk_tmp_table_created ( )
{
DBUG_ENTER ( " spider_oracle_handler::bulk_tmp_table_created " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( upd_tmp_tbl ) ;
}
int spider_oracle_handler : : mk_bulk_tmp_table_and_bulk_start ( )
{
THD * thd = spider - > trx - > thd ;
TABLE * table = spider - > get_table ( ) ;
DBUG_ENTER ( " spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! upd_tmp_tbl )
{
if ( ! ( upd_tmp_tbl = spider_mk_sys_tmp_table (
thd , table , & upd_tmp_tbl_prm , " a " , update_sql . charset ( ) ) ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
upd_tmp_tbl - > file - > extra ( HA_EXTRA_WRITE_CACHE ) ;
upd_tmp_tbl - > file - > ha_start_bulk_insert ( ( ha_rows ) 0 ) ;
}
DBUG_RETURN ( 0 ) ;
}
void spider_oracle_handler : : rm_bulk_tmp_table ( )
{
DBUG_ENTER ( " spider_oracle_handler::rm_bulk_tmp_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( upd_tmp_tbl )
{
spider_rm_sys_tmp_table ( spider - > trx - > thd , upd_tmp_tbl , & upd_tmp_tbl_prm ) ;
upd_tmp_tbl = NULL ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_handler : : store_sql_to_bulk_tmp_table (
spider_string * str ,
TABLE * tmp_table
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::store_sql_to_bulk_tmp_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
tmp_table - > field [ 0 ] - > set_notnull ( ) ;
tmp_table - > field [ 0 ] - > store ( str - > ptr ( ) , str - > length ( ) , str - > charset ( ) ) ;
if ( ( error_num = tmp_table - > file - > ha_write_row ( tmp_table - > record [ 0 ] ) ) )
DBUG_RETURN ( error_num ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : restore_sql_from_bulk_tmp_table (
spider_string * str ,
TABLE * tmp_table
) {
DBUG_ENTER ( " spider_oracle_handler::restore_sql_from_bulk_tmp_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
tmp_table - > field [ 0 ] - > val_str ( str - > get_str ( ) ) ;
str - > mem_calc ( ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : insert_lock_tables_list (
SPIDER_CONN * conn ,
int link_idx
) {
spider_db_oracle * db_conn = ( spider_db_oracle * ) conn - > db_conn ;
SPIDER_LINK_FOR_HASH * tmp_link_for_hash2 = & link_for_hash [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::insert_lock_tables_list " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
uint old_elements =
db_conn - > lock_table_hash . array . max_element ;
# ifdef HASH_UPDATE_WITH_HASH_VALUE
if ( my_hash_insert_with_hash_value (
& db_conn - > lock_table_hash ,
tmp_link_for_hash2 - > db_table_str_hash_value ,
( uchar * ) tmp_link_for_hash2 ) )
# else
if ( my_hash_insert ( & db_conn - > lock_table_hash ,
( uchar * ) tmp_link_for_hash2 ) )
# endif
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
if ( db_conn - > lock_table_hash . array . max_element > old_elements )
{
spider_alloc_calc_mem ( spider_current_trx ,
db_conn - > lock_table_hash ,
( db_conn - > lock_table_hash . array . max_element - old_elements ) *
db_conn - > lock_table_hash . array . size_of_element ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : append_lock_tables_list (
SPIDER_CONN * conn ,
int link_idx ,
int * appended
) {
int error_num ;
SPIDER_LINK_FOR_HASH * tmp_link_for_hash , * tmp_link_for_hash2 ;
int conn_link_idx = spider - > conn_link_idx [ link_idx ] ;
spider_db_oracle * db_conn = ( spider_db_oracle * ) conn - > db_conn ;
DBUG_ENTER ( " spider_oracle_handler::append_lock_tables_list " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
tmp_link_for_hash2 = & link_for_hash [ link_idx ] ;
tmp_link_for_hash2 - > db_table_str =
& oracle_share - > db_table_str [ conn_link_idx ] ;
# ifdef SPIDER_HAS_HASH_VALUE_TYPE
tmp_link_for_hash2 - > db_table_str_hash_value =
oracle_share - > db_table_str_hash_value [ conn_link_idx ] ;
if ( ! ( tmp_link_for_hash = ( SPIDER_LINK_FOR_HASH * )
my_hash_search_using_hash_value (
& db_conn - > lock_table_hash ,
tmp_link_for_hash2 - > db_table_str_hash_value ,
( uchar * ) tmp_link_for_hash2 - > db_table_str - > ptr ( ) ,
tmp_link_for_hash2 - > db_table_str - > length ( ) ) ) )
# else
if ( ! ( tmp_link_for_hash = ( SPIDER_LINK_FOR_HASH * ) my_hash_search (
& db_conn - > lock_table_hash ,
( uchar * ) tmp_link_for_hash2 - > db_table_str - > ptr ( ) ,
tmp_link_for_hash2 - > db_table_str - > length ( ) ) ) )
# endif
{
if ( ( error_num = insert_lock_tables_list ( conn , link_idx ) ) )
DBUG_RETURN ( error_num ) ;
* appended = 1 ;
} else {
if ( tmp_link_for_hash - > spider - > lock_type < spider - > lock_type )
{
# ifdef HASH_UPDATE_WITH_HASH_VALUE
my_hash_delete_with_hash_value (
& db_conn - > lock_table_hash ,
tmp_link_for_hash - > db_table_str_hash_value ,
( uchar * ) tmp_link_for_hash ) ;
# else
my_hash_delete ( & db_conn - > lock_table_hash ,
( uchar * ) tmp_link_for_hash ) ;
# endif
uint old_elements =
db_conn - > lock_table_hash . array . max_element ;
# ifdef HASH_UPDATE_WITH_HASH_VALUE
if ( my_hash_insert_with_hash_value (
& db_conn - > lock_table_hash ,
tmp_link_for_hash2 - > db_table_str_hash_value ,
( uchar * ) tmp_link_for_hash2 ) )
# else
if ( my_hash_insert ( & db_conn - > lock_table_hash ,
( uchar * ) tmp_link_for_hash2 ) )
# endif
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
if ( db_conn - > lock_table_hash . array . max_element > old_elements )
{
spider_alloc_calc_mem ( spider_current_trx ,
db_conn - > lock_table_hash ,
( db_conn - > lock_table_hash . array . max_element - old_elements ) *
db_conn - > lock_table_hash . array . size_of_element ) ;
}
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_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_oracle_handler::realloc_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ( int ) sql . alloced_length ( ) > init_sql_alloc_size * 2 )
{
sql . free ( ) ;
if ( sql . real_alloc ( init_sql_alloc_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
* realloced | = SPIDER_SQL_TYPE_SELECT_SQL ;
}
if ( ( int ) ha_sql . alloced_length ( ) > init_sql_alloc_size * 2 )
{
ha_sql . free ( ) ;
if ( ha_sql . real_alloc ( init_sql_alloc_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
* realloced | = SPIDER_SQL_TYPE_SELECT_SQL ;
}
if ( ( int ) dup_update_sql . alloced_length ( ) > init_sql_alloc_size * 2 )
{
dup_update_sql . free ( ) ;
if ( dup_update_sql . real_alloc ( init_sql_alloc_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
if ( ( int ) insert_sql . alloced_length ( ) > init_sql_alloc_size * 2 )
{
insert_sql . free ( ) ;
if ( insert_sql . real_alloc ( init_sql_alloc_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
* realloced | = SPIDER_SQL_TYPE_INSERT_SQL ;
}
if ( ( int ) update_sql . alloced_length ( ) > init_sql_alloc_size * 2 )
{
update_sql . free ( ) ;
if ( update_sql . real_alloc ( init_sql_alloc_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
* realloced | = ( SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL ) ;
}
update_sql . length ( 0 ) ;
if ( ( int ) tmp_sql . alloced_length ( ) > init_sql_alloc_size * 2 )
{
tmp_sql . free ( ) ;
if ( tmp_sql . real_alloc ( init_sql_alloc_size ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
* realloced | = SPIDER_SQL_TYPE_TMP_SQL ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : reset_sql (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::reset_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql_type & SPIDER_SQL_TYPE_SELECT_SQL )
{
table_lock_mode = 0 ;
select_rownum_appended = FALSE ;
sql . length ( 0 ) ;
}
if ( sql_type & SPIDER_SQL_TYPE_INSERT_SQL )
{
insert_sql . length ( 0 ) ;
}
if ( sql_type & ( SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
SPIDER_SQL_TYPE_BULK_UPDATE_SQL ) )
{
update_rownum_appended = FALSE ;
update_set_pos = 0 ;
update_sql . length ( 0 ) ;
}
if ( sql_type & SPIDER_SQL_TYPE_TMP_SQL )
{
tmp_sql . length ( 0 ) ;
}
if ( sql_type & SPIDER_SQL_TYPE_HANDLER )
{
ha_sql . length ( 0 ) ;
}
DBUG_RETURN ( 0 ) ;
}
# if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
int spider_oracle_handler : : reset_keys (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::reset_keys " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : reset_upds (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::reset_upds " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
hs_upds . clear ( ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : reset_strs (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::reset_strs " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : reset_strs_pos (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::reset_strs_pos " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_ASSERT ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : push_back_upds (
SPIDER_HS_STRING_REF & info
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_handler::push_back_upds " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
error_num = hs_upds . push_back ( info ) ;
DBUG_RETURN ( error_num ) ;
}
# endif
bool spider_oracle_handler : : need_lock_before_set_sql_for_exec (
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::need_lock_before_set_sql_for_exec " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
int spider_oracle_handler : : set_sql_for_exec (
ulong sql_type ,
int link_idx
) {
int error_num ;
uint tmp_pos ;
SPIDER_SHARE * share = spider - > share ;
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
int all_link_idx = spider - > conn_link_idx [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::set_sql_for_exec " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql_type & ( SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL ) )
{
if ( table_lock_mode )
{
spider_string * str = & result_list - > insert_sqls [ link_idx ] ;
str - > length ( 0 ) ;
if ( str - > reserve ( SPIDER_SQL_LOCK_TABLE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_LOCK_TABLE_STR , SPIDER_SQL_LOCK_TABLE_LEN ) ;
if ( ( error_num = oracle_share - > append_table_name ( str , all_link_idx ) ) )
DBUG_RETURN ( error_num ) ;
if ( table_lock_mode = = SPIDER_LOCK_MODE_EXCLUSIVE )
{
if ( str - > reserve ( SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR ,
SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN ) ;
} else if ( table_lock_mode = = SPIDER_LOCK_MODE_SHARED )
{
if ( str - > reserve ( SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
str - > q_append ( SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR ,
SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN ) ;
}
exec_lock_sql = str ;
}
if ( oracle_share - > same_db_table_name | | link_idx = = first_link_idx )
{
if ( sql_type & SPIDER_SQL_TYPE_SELECT_SQL )
exec_sql = & sql ;
if ( sql_type & SPIDER_SQL_TYPE_TMP_SQL )
exec_tmp_sql = & tmp_sql ;
} else {
char tmp_table_name [ MAX_FIELD_WIDTH * 2 ] ,
tgt_table_name [ MAX_FIELD_WIDTH * 2 ] ;
int tmp_table_name_length ;
spider_string tgt_table_name_str ( tgt_table_name ,
MAX_FIELD_WIDTH * 2 ,
oracle_share - > db_names_str [ link_idx ] . charset ( ) ) ;
const char * table_names [ 2 ] , * table_aliases [ 2 ] ;
uint table_name_lengths [ 2 ] , table_alias_lengths [ 2 ] ;
tgt_table_name_str . init_calc_mem ( 212 ) ;
tgt_table_name_str . length ( 0 ) ;
if ( result_list - > tmp_table_join & & spider - > bka_mode ! = 2 )
{
create_tmp_bka_table_name ( tmp_table_name , & tmp_table_name_length ,
link_idx ) ;
append_table_name_with_adjusting ( & tgt_table_name_str , link_idx ,
SPIDER_SQL_TYPE_TMP_SQL ) ;
table_names [ 0 ] = tmp_table_name ;
table_names [ 1 ] = tgt_table_name_str . ptr ( ) ;
table_name_lengths [ 0 ] = tmp_table_name_length ;
table_name_lengths [ 1 ] = tgt_table_name_str . length ( ) ;
table_aliases [ 0 ] = SPIDER_SQL_A_STR ;
table_aliases [ 1 ] = SPIDER_SQL_B_STR ;
table_alias_lengths [ 0 ] = SPIDER_SQL_A_LEN ;
table_alias_lengths [ 1 ] = SPIDER_SQL_B_LEN ;
}
if ( sql_type & SPIDER_SQL_TYPE_SELECT_SQL )
{
exec_sql = & result_list - > sqls [ link_idx ] ;
if ( exec_sql - > copy ( sql ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
else if ( result_list - > use_union )
{
if ( ( error_num = reset_union_table_name ( exec_sql , link_idx ,
SPIDER_SQL_TYPE_SELECT_SQL ) ) )
DBUG_RETURN ( error_num ) ;
} else {
tmp_pos = exec_sql - > length ( ) ;
exec_sql - > length ( table_name_pos ) ;
if ( result_list - > tmp_table_join & & spider - > bka_mode ! = 2 )
{
if ( ( error_num = spider_db_oracle_utility . append_from_with_alias (
exec_sql , table_names , table_name_lengths ,
table_aliases , table_alias_lengths , 2 ,
& table_name_pos , TRUE ) )
)
DBUG_RETURN ( error_num ) ;
exec_sql - > q_append ( SPIDER_SQL_SPACE_STR , SPIDER_SQL_SPACE_LEN ) ;
} else {
append_table_name_with_adjusting ( exec_sql , link_idx ,
SPIDER_SQL_TYPE_SELECT_SQL ) ;
}
exec_sql - > length ( tmp_pos ) ;
}
}
if ( sql_type & SPIDER_SQL_TYPE_TMP_SQL )
{
exec_tmp_sql = & result_list - > tmp_sqls [ link_idx ] ;
if ( result_list - > tmp_table_join & & spider - > bka_mode ! = 2 )
{
if ( exec_tmp_sql - > copy ( tmp_sql ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
else {
tmp_pos = exec_tmp_sql - > length ( ) ;
exec_tmp_sql - > length ( tmp_sql_pos1 ) ;
exec_tmp_sql - > q_append ( tmp_table_name , tmp_table_name_length ) ;
exec_tmp_sql - > length ( tmp_sql_pos2 ) ;
exec_tmp_sql - > q_append ( tmp_table_name , tmp_table_name_length ) ;
exec_tmp_sql - > length ( tmp_sql_pos3 ) ;
exec_tmp_sql - > q_append ( tmp_table_name , tmp_table_name_length ) ;
exec_tmp_sql - > length ( tmp_pos ) ;
}
}
}
}
}
if ( sql_type & SPIDER_SQL_TYPE_INSERT_SQL )
{
if ( oracle_share - > same_db_table_name | | link_idx = = first_link_idx )
exec_insert_sql = & insert_sql ;
else {
exec_insert_sql = & result_list - > insert_sqls [ link_idx ] ;
if ( exec_insert_sql - > copy ( insert_sql ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
DBUG_PRINT ( " info " , ( " spider exec_insert_sql=%s " ,
exec_insert_sql - > c_ptr_safe ( ) ) ) ;
tmp_pos = exec_insert_sql - > length ( ) ;
exec_insert_sql - > length ( insert_table_name_pos ) ;
append_table_name_with_adjusting ( exec_insert_sql , link_idx ,
sql_type ) ;
exec_insert_sql - > length ( tmp_pos ) ;
DBUG_PRINT ( " info " , ( " spider exec_insert_sql->length=%u " ,
exec_insert_sql - > length ( ) ) ) ;
DBUG_PRINT ( " info " , ( " spider exec_insert_sql=%s " ,
exec_insert_sql - > c_ptr_safe ( ) ) ) ;
}
if ( nextval_pos )
{
memcpy ( ( uchar * ) exec_insert_sql - > ptr ( ) + nextval_pos ,
oracle_share - > nextval_str [ all_link_idx ] . ptr ( ) ,
oracle_share - > nextval_max_length ) ;
}
}
if ( sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL )
{
if ( reading_from_bulk_tmp_table )
{
if (
oracle_share - > same_db_table_name & &
share - > link_statuses [ all_link_idx ] ! = SPIDER_LINK_STATUS_RECOVERY
) {
exec_update_sql = & insert_sql ;
} else if ( ! spider - > result_list . upd_tmp_tbls [ link_idx ] )
{
DBUG_RETURN ( ER_SPIDER_COND_SKIP_NUM ) ;
} else {
exec_update_sql = & spider - > result_list . insert_sqls [ link_idx ] ;
if ( ( error_num = restore_sql_from_bulk_tmp_table ( exec_update_sql ,
spider - > result_list . upd_tmp_tbls [ link_idx ] ) ) )
{
DBUG_RETURN ( error_num ) ;
}
}
} else {
if (
oracle_share - > same_db_table_name & &
share - > link_statuses [ all_link_idx ] ! = SPIDER_LINK_STATUS_RECOVERY
) {
exec_update_sql = & update_sql ;
} else {
exec_update_sql = & spider - > result_list . update_sqls [ link_idx ] ;
}
}
DBUG_PRINT ( " info " , ( " spider exec_update_sql=%s " ,
exec_update_sql - > c_ptr_safe ( ) ) ) ;
} else if ( sql_type &
( SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL ) )
{
if ( oracle_share - > same_db_table_name | | link_idx = = first_link_idx )
exec_update_sql = & update_sql ;
else {
exec_update_sql = & spider - > result_list . update_sqls [ link_idx ] ;
if ( exec_update_sql - > copy ( update_sql ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
tmp_pos = exec_update_sql - > length ( ) ;
exec_update_sql - > length ( table_name_pos ) ;
append_table_name_with_adjusting ( exec_update_sql , link_idx ,
sql_type ) ;
exec_update_sql - > length ( tmp_pos ) ;
}
DBUG_PRINT ( " info " , ( " spider exec_update_sql=%s " ,
exec_update_sql - > c_ptr_safe ( ) ) ) ;
}
if ( sql_type & SPIDER_SQL_TYPE_HANDLER )
{
if ( spider - > m_handler_id [ link_idx ] = = ha_sql_handler_id )
exec_ha_sql = & ha_sql ;
else {
exec_ha_sql = & result_list - > sqls [ link_idx ] ;
if ( exec_ha_sql - > copy ( ha_sql ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
else {
tmp_pos = exec_ha_sql - > length ( ) ;
exec_ha_sql - > length ( ha_table_name_pos ) ;
append_table_name_with_adjusting ( exec_ha_sql , link_idx ,
SPIDER_SQL_TYPE_HANDLER ) ;
exec_ha_sql - > length ( tmp_pos ) ;
}
}
DBUG_PRINT ( " info " , ( " spider exec_ha_sql=%s " ,
exec_ha_sql - > c_ptr_safe ( ) ) ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : set_sql_for_exec (
spider_db_copy_table * tgt_ct ,
ulong sql_type
) {
spider_oracle_copy_table * oracle_ct = ( spider_oracle_copy_table * ) tgt_ct ;
DBUG_ENTER ( " spider_oracle_handler::set_sql_for_exec " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_INSERT_SQL :
exec_insert_sql = & oracle_ct - > sql ;
break ;
default :
DBUG_ASSERT ( 0 ) ;
break ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : execute_sql (
ulong sql_type ,
SPIDER_CONN * conn ,
int quick_mode ,
int * need_mon
) {
spider_string * tgt_sql ;
uint tgt_length ;
DBUG_ENTER ( " spider_oracle_handler::execute_sql " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
switch ( sql_type )
{
case SPIDER_SQL_TYPE_SELECT_SQL :
DBUG_PRINT ( " info " , ( " spider SPIDER_SQL_TYPE_SELECT_SQL " ) ) ;
tgt_sql = exec_sql ;
tgt_length = tgt_sql - > length ( ) ;
if ( table_lock_mode )
{
DBUG_PRINT ( " info " , ( " spider table_lock_mode=%d " , table_lock_mode ) ) ;
spider_db_oracle * db_conn = ( spider_db_oracle * ) conn - > db_conn ;
db_conn - > table_lock_mode = table_lock_mode ;
db_conn - > exec_lock_sql = exec_lock_sql ;
table_lock_mode = 0 ;
}
break ;
case SPIDER_SQL_TYPE_INSERT_SQL :
DBUG_PRINT ( " info " , ( " spider SPIDER_SQL_TYPE_SELECT_SQL " ) ) ;
tgt_sql = exec_insert_sql ;
tgt_length = tgt_sql - > length ( ) ;
break ;
case SPIDER_SQL_TYPE_UPDATE_SQL :
case SPIDER_SQL_TYPE_DELETE_SQL :
case SPIDER_SQL_TYPE_BULK_UPDATE_SQL :
DBUG_PRINT ( " info " , ( " spider %s " ,
sql_type = = SPIDER_SQL_TYPE_UPDATE_SQL ? " SPIDER_SQL_TYPE_UPDATE_SQL " :
sql_type = = SPIDER_SQL_TYPE_DELETE_SQL ? " SPIDER_SQL_TYPE_DELETE_SQL " :
" SPIDER_SQL_TYPE_BULK_UPDATE_SQL "
) ) ;
tgt_sql = exec_update_sql ;
tgt_length = tgt_sql - > length ( ) ;
break ;
case SPIDER_SQL_TYPE_TMP_SQL :
DBUG_PRINT ( " info " , ( " spider SPIDER_SQL_TYPE_TMP_SQL " ) ) ;
tgt_sql = exec_tmp_sql ;
tgt_length = tgt_sql - > length ( ) ;
break ;
case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL :
DBUG_PRINT ( " info " , ( " spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL " ) ) ;
tgt_sql = exec_tmp_sql ;
tgt_length = tmp_sql_pos5 ;
break ;
case SPIDER_SQL_TYPE_HANDLER :
DBUG_PRINT ( " info " , ( " spider SPIDER_SQL_TYPE_HANDLER " ) ) ;
tgt_sql = exec_ha_sql ;
tgt_length = tgt_sql - > length ( ) ;
break ;
default :
/* nothing to do */
DBUG_PRINT ( " info " , ( " spider default " ) ) ;
DBUG_RETURN ( 0 ) ;
}
DBUG_RETURN ( spider_db_query (
conn ,
tgt_sql - > ptr ( ) ,
tgt_length ,
quick_mode ,
need_mon
) ) ;
}
int spider_oracle_handler : : reset ( )
{
DBUG_ENTER ( " spider_oracle_handler::reset " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
update_sql . length ( 0 ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : sts_mode_exchange (
int sts_mode
) {
DBUG_ENTER ( " spider_oracle_handler::sts_mode_exchange " ) ;
DBUG_PRINT ( " info " , ( " spider sts_mode=%d " , sts_mode ) ) ;
DBUG_RETURN ( 1 ) ;
}
int spider_oracle_handler : : show_table_status (
int link_idx ,
int sts_mode ,
uint flag
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
SPIDER_DB_RESULT * res ;
SPIDER_SHARE * share = spider - > share ;
uint pos = ( 2 * spider - > conn_link_idx [ link_idx ] ) ;
DBUG_ENTER ( " spider_oracle_handler::show_table_status " ) ;
DBUG_PRINT ( " info " , ( " spider sts_mode=%d " , sts_mode ) ) ;
if (
( flag & HA_STATUS_AUTO ) & &
( error_num = show_autoinc ( link_idx ) )
) {
DBUG_RETURN ( error_num ) ;
}
if ( sts_mode = = 1 )
{
/*
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
spider_conn_queue_connect_rewrite ( share , conn , link_idx ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if (
( error_num = spider_db_set_names ( spider , conn , link_idx ) ) | |
(
spider_db_query (
conn ,
oracle_share - > show_table_status [ 0 + pos ] . ptr ( ) ,
oracle_share - > show_table_status [ 0 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
)
) {
if (
error_num = = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM & &
! conn - > disable_reconnect
) {
*/
/* retry */
/*
if ( ( error_num = spider_db_ping ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
oracle_share - > show_table_status [ 0 + pos ] . ptr ( ) ,
oracle_share - > show_table_status [ 0 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
}
} else {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
DBUG_RETURN ( error_num ) ;
else {
my_printf_error ( ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM ,
ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR , MYF ( 0 ) ,
oracle_share - > db_names_str [ spider - > conn_link_idx [ link_idx ] ] . ptr ( ) ,
oracle_share - > table_names_str [ spider - > conn_link_idx [
link_idx ] ] . ptr ( ) ) ;
DBUG_RETURN ( ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM ) ;
}
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
error_num = res - > fetch_table_status (
sts_mode ,
share - > records ,
share - > mean_rec_length ,
share - > data_file_length ,
share - > max_data_file_length ,
share - > index_file_length ,
share - > auto_increment_value ,
share - > create_time ,
share - > update_time ,
share - > check_time
) ;
res - > free_result ( ) ;
delete res ;
if ( error_num )
DBUG_RETURN ( error_num ) ;
*/
if ( ! share - > records )
share - > records = 10000 ;
share - > mean_rec_length = 65535 ;
share - > data_file_length = 65535 ;
share - > max_data_file_length = 65535 ;
share - > index_file_length = 65535 ;
/*
share - > auto_increment_value = 0 ;
*/
share - > create_time = ( time_t ) 0 ;
share - > update_time = ( time_t ) 0 ;
share - > check_time = ( time_t ) 0 ;
} else {
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
spider_conn_queue_connect_rewrite ( share , conn , link_idx ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if (
( error_num = spider_db_set_names ( spider , conn , link_idx ) ) | |
(
spider_db_query (
conn ,
oracle_share - > show_table_status [ 1 + pos ] . ptr ( ) ,
oracle_share - > show_table_status [ 1 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
)
) {
if (
error_num = = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM & &
! conn - > disable_reconnect
) {
/* retry */
if ( ( error_num = spider_db_ping ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
oracle_share - > show_table_status [ 1 + pos ] . ptr ( ) ,
oracle_share - > show_table_status [ 1 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
}
} else {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
DBUG_RETURN ( error_num ) ;
else
DBUG_RETURN ( ER_QUERY_ON_FOREIGN_DATA_SOURCE ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
error_num = res - > fetch_table_status (
sts_mode ,
share - > records ,
share - > mean_rec_length ,
share - > data_file_length ,
share - > max_data_file_length ,
share - > index_file_length ,
share - > auto_increment_value ,
share - > create_time ,
share - > update_time ,
share - > check_time
) ;
res - > free_result ( ) ;
delete res ;
if ( error_num )
DBUG_RETURN ( error_num ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : crd_mode_exchange (
int crd_mode
) {
DBUG_ENTER ( " spider_oracle_handler::crd_mode_exchange " ) ;
DBUG_PRINT ( " info " , ( " spider crd_mode=%d " , crd_mode ) ) ;
DBUG_RETURN ( 1 ) ;
}
int spider_oracle_handler : : show_index (
int link_idx ,
int crd_mode
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
SPIDER_SHARE * share = spider - > share ;
TABLE * table = spider - > get_table ( ) ;
SPIDER_DB_RESULT * res ;
int roop_count ;
longlong * tmp_cardinality ;
uint pos = ( 2 * spider - > conn_link_idx [ link_idx ] ) ;
DBUG_ENTER ( " spider_oracle_handler::show_index " ) ;
DBUG_PRINT ( " info " , ( " spider crd_mode=%d " , crd_mode ) ) ;
if ( crd_mode = = 1 )
{
/*
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
spider_conn_queue_connect_rewrite ( share , conn , link_idx ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if (
( error_num = spider_db_set_names ( spider , conn , link_idx ) ) | |
(
spider_db_query (
conn ,
oracle_share - > show_index [ 0 + pos ] . ptr ( ) ,
oracle_share - > show_index [ 0 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
)
) {
if (
error_num = = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM & &
! conn - > disable_reconnect
) {
*/
/* retry */
/*
if ( ( error_num = spider_db_ping ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
oracle_share - > show_index [ 0 + pos ] . ptr ( ) ,
oracle_share - > show_index [ 0 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
}
} else {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
*/
/* no record is ok */
/*
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
if ( res )
{
error_num = res - > fetch_table_cardinality (
crd_mode ,
table ,
share - > cardinality ,
share - > cardinality_upd ,
share - > bitmap_size
) ;
}
*/
for ( roop_count = 0 , tmp_cardinality = share - > cardinality ;
roop_count < ( int ) table - > s - > fields ;
roop_count + + , tmp_cardinality + + )
{
if ( ! spider_bit_is_set ( share - > cardinality_upd , roop_count ) )
{
DBUG_PRINT ( " info " ,
( " spider init column cardinality id=%d " , roop_count ) ) ;
* tmp_cardinality = 1 ;
}
}
/*
if ( res )
{
res - > free_result ( ) ;
delete res ;
}
if ( error_num )
DBUG_RETURN ( error_num ) ;
*/
} else {
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
spider_conn_queue_connect_rewrite ( share , conn , link_idx ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if (
( error_num = spider_db_set_names ( spider , conn , link_idx ) ) | |
(
spider_db_query (
conn ,
oracle_share - > show_index [ 1 + pos ] . ptr ( ) ,
oracle_share - > show_index [ 1 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
)
) {
if (
error_num = = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM & &
! conn - > disable_reconnect
) {
/* retry */
if ( ( error_num = spider_db_ping ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
oracle_share - > show_index [ 1 + pos ] . ptr ( ) ,
oracle_share - > show_index [ 1 + pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
}
} else {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
/* no record is ok */
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
if ( res )
{
error_num = res - > fetch_table_cardinality (
crd_mode ,
table ,
share - > cardinality ,
share - > cardinality_upd ,
share - > bitmap_size
) ;
}
for ( roop_count = 0 , tmp_cardinality = share - > cardinality ;
roop_count < ( int ) table - > s - > fields ;
roop_count + + , tmp_cardinality + + )
{
if ( ! spider_bit_is_set ( share - > cardinality_upd , roop_count ) )
{
DBUG_PRINT ( " info " ,
( " spider init column cardinality id=%d " , roop_count ) ) ;
* tmp_cardinality = 1 ;
}
}
if ( res )
{
res - > free_result ( ) ;
delete res ;
}
if ( error_num )
DBUG_RETURN ( error_num ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : show_records (
int link_idx
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
SPIDER_DB_RESULT * res ;
SPIDER_SHARE * share = spider - > share ;
uint pos = spider - > conn_link_idx [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::show_records " ) ;
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
spider_conn_queue_connect_rewrite ( share , conn , link_idx ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if (
( error_num = spider_db_set_names ( spider , conn , link_idx ) ) | |
(
spider_db_query (
conn ,
oracle_share - > show_records [ pos ] . ptr ( ) ,
oracle_share - > show_records [ pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
)
) {
if (
error_num = = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM & &
! conn - > disable_reconnect
) {
/* retry */
if ( ( error_num = spider_db_ping ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 1 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 2 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
oracle_share - > show_records [ pos ] . ptr ( ) ,
oracle_share - > show_records [ pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 3 " , error_num ) ) ;
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
}
} else {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 4 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
{
DBUG_PRINT ( " info " , ( " spider error_num=%d 5 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
} else {
DBUG_PRINT ( " info " , ( " spider error_num=%d 6 " ,
ER_QUERY_ON_FOREIGN_DATA_SOURCE ) ) ;
DBUG_RETURN ( ER_QUERY_ON_FOREIGN_DATA_SOURCE ) ;
}
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
error_num = res - > fetch_table_records (
1 ,
share - > records
) ;
res - > free_result ( ) ;
delete res ;
if ( error_num )
{
DBUG_PRINT ( " info " , ( " spider error_num=%d 7 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
spider - > trx - > direct_aggregate_count + + ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : show_autoinc (
int link_idx
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
SPIDER_DB_RESULT * res ;
SPIDER_SHARE * share = spider - > share ;
uint pos = spider - > conn_link_idx [ link_idx ] ;
ulonglong auto_increment_value ;
DBUG_ENTER ( " spider_oracle_handler::show_autoinc " ) ;
if ( ! oracle_share - > show_autoinc )
DBUG_RETURN ( 0 ) ;
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
spider_conn_queue_connect_rewrite ( share , conn , link_idx ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if (
( error_num = spider_db_set_names ( spider , conn , link_idx ) ) | |
(
spider_db_query (
conn ,
oracle_share - > show_autoinc [ pos ] . ptr ( ) ,
oracle_share - > show_autoinc [ pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
)
) {
if (
error_num = = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM & &
! conn - > disable_reconnect
) {
/* retry */
if ( ( error_num = spider_db_ping ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 1 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 2 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
oracle_share - > show_records [ pos ] . ptr ( ) ,
oracle_share - > show_records [ pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 3 " , error_num ) ) ;
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
}
} else {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_PRINT ( " info " , ( " spider error_num=%d 4 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
{
DBUG_PRINT ( " info " , ( " spider error_num=%d 5 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
} else {
DBUG_PRINT ( " info " , ( " spider error_num=%d 6 " ,
ER_QUERY_ON_FOREIGN_DATA_SOURCE ) ) ;
DBUG_RETURN ( ER_QUERY_ON_FOREIGN_DATA_SOURCE ) ;
}
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
error_num = res - > fetch_table_records (
1 ,
auto_increment_value
) ;
res - > free_result ( ) ;
delete res ;
if ( error_num )
{
DBUG_PRINT ( " info " , ( " spider error_num=%d 7 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
if ( auto_increment_value > = share - > auto_increment_value )
{
share - > auto_increment_value = auto_increment_value + 1 ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : show_last_insert_id (
int link_idx ,
ulonglong & last_insert_id
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
SPIDER_DB_RESULT * res ;
uint pos = spider - > conn_link_idx [ link_idx ] ;
spider_db_oracle * db_oracle = ( spider_db_oracle * ) conn - > db_conn ;
DBUG_ENTER ( " spider_oracle_handler::show_last_insert_id " ) ;
if ( ! oracle_share - > show_last_insert_id )
{
DBUG_ASSERT ( 0 ) ;
last_insert_id = 0 ;
db_oracle - > stored_last_insert_id = 0 ;
DBUG_RETURN ( 0 ) ;
}
if (
spider_db_query (
conn ,
oracle_share - > show_last_insert_id [ pos ] . ptr ( ) ,
oracle_share - > show_last_insert_id [ pos ] . length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
) {
DBUG_PRINT ( " info " , ( " spider error_num=%d 4 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
{
DBUG_PRINT ( " info " , ( " spider error_num=%d 5 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
} else {
DBUG_PRINT ( " info " , ( " spider error_num=%d 6 " ,
ER_QUERY_ON_FOREIGN_DATA_SOURCE ) ) ;
DBUG_RETURN ( ER_QUERY_ON_FOREIGN_DATA_SOURCE ) ;
}
}
error_num = res - > fetch_table_records (
1 ,
last_insert_id
) ;
res - > free_result ( ) ;
delete res ;
if ( error_num )
{
DBUG_PRINT ( " info " , ( " spider error_num=%d 7 " , error_num ) ) ;
DBUG_RETURN ( error_num ) ;
}
db_oracle - > stored_last_insert_id = last_insert_id ;
DBUG_RETURN ( 0 ) ;
}
ha_rows spider_oracle_handler : : explain_select (
key_range * start_key ,
key_range * end_key ,
int link_idx
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
SPIDER_RESULT_LIST * result_list = & spider - > result_list ;
spider_string * str = & result_list - > sqls [ link_idx ] ;
SPIDER_DB_RESULT * res ;
ha_rows rows ;
spider_db_handler * dbton_hdl = spider - > dbton_handler [ conn - > dbton_id ] ;
DBUG_ENTER ( " spider_oracle_handler::explain_select " ) ;
if ( ( error_num = dbton_hdl - > append_explain_select_part (
start_key , end_key , SPIDER_SQL_TYPE_OTHER_SQL , link_idx ) ) )
{
my_errno = error_num ;
DBUG_RETURN ( HA_POS_ERROR ) ;
}
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
spider_conn_queue_connect_rewrite ( spider - > share , conn , link_idx ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
spider - > share ) ;
if (
( error_num = spider_db_set_names ( spider , conn , link_idx ) ) | |
(
spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] ) & &
( error_num = spider_db_errorno ( conn ) )
)
) {
if (
error_num = = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM & &
! conn - > disable_reconnect
) {
/* retry */
if ( ( error_num = spider_db_ping ( spider , conn , link_idx ) ) )
{
if ( spider - > check_error_mode ( error_num ) )
my_errno = error_num ;
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( HA_POS_ERROR ) ;
}
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
if ( spider - > check_error_mode ( error_num ) )
my_errno = error_num ;
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( HA_POS_ERROR ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
spider - > share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
error_num = spider_db_errorno ( conn ) ;
if ( spider - > check_error_mode ( error_num ) )
my_errno = error_num ;
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( HA_POS_ERROR ) ;
}
} else {
if ( spider - > check_error_mode ( error_num ) )
my_errno = error_num ;
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( HA_POS_ERROR ) ;
}
}
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 = 1 ;
request_key . next = NULL ;
if ( ! ( res = conn - > db_conn - > store_result ( NULL , & request_key , & error_num ) ) )
{
if ( error_num | | ( error_num = spider_db_errorno ( conn ) ) )
{
if ( spider - > check_error_mode ( error_num ) )
my_errno = error_num ;
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( HA_POS_ERROR ) ;
} else {
my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE ;
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( HA_POS_ERROR ) ;
}
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
error_num = res - > fetch_table_records (
2 ,
rows
) ;
res - > free_result ( ) ;
delete res ;
if ( error_num )
{
my_errno = error_num ;
DBUG_RETURN ( HA_POS_ERROR ) ;
}
DBUG_RETURN ( rows ) ;
}
int spider_oracle_handler : : lock_tables (
int link_idx
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
spider_string * str = & sql ;
DBUG_ENTER ( " spider_oracle_handler::lock_tables " ) ;
do {
str - > length ( 0 ) ;
if ( ( error_num = conn - > db_conn - > append_lock_tables ( str ) ) )
{
DBUG_RETURN ( error_num ) ;
}
if ( str - > length ( ) )
{
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
spider - > share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
DBUG_RETURN ( spider_db_errorno ( conn ) ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
}
if ( ! conn - > table_locked )
{
conn - > table_locked = TRUE ;
spider - > trx - > locked_connections + + ;
}
} while ( str - > length ( ) ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : unlock_tables (
int link_idx
) {
int error_num ;
SPIDER_CONN * conn = spider - > conns [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::unlock_tables " ) ;
if ( conn - > table_locked )
{
if ( ( error_num = conn - > db_conn - > commit ( & spider - > need_mons [ link_idx ] ) ) )
{
DBUG_RETURN ( error_num ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : disable_keys (
SPIDER_CONN * conn ,
int link_idx
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::disable_keys " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
if ( ( error_num = append_disable_keys_part ( SPIDER_SQL_TYPE_OTHER_HS ,
link_idx ) ) )
{
DBUG_RETURN ( error_num ) ;
}
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : enable_keys (
SPIDER_CONN * conn ,
int link_idx
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::enable_keys " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
if ( ( error_num = append_enable_keys_part ( SPIDER_SQL_TYPE_OTHER_HS ,
link_idx ) ) )
{
DBUG_RETURN ( error_num ) ;
}
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : check_table (
SPIDER_CONN * conn ,
int link_idx ,
HA_CHECK_OPT * check_opt
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::check_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
if ( ( error_num = append_check_table_part ( SPIDER_SQL_TYPE_OTHER_HS ,
link_idx , check_opt ) ) )
{
DBUG_RETURN ( error_num ) ;
}
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : repair_table (
SPIDER_CONN * conn ,
int link_idx ,
HA_CHECK_OPT * check_opt
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::repair_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
if ( ( error_num = append_repair_table_part ( SPIDER_SQL_TYPE_OTHER_HS ,
link_idx , check_opt ) ) )
{
DBUG_RETURN ( error_num ) ;
}
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : analyze_table (
SPIDER_CONN * conn ,
int link_idx
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::analyze_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
if ( ( error_num = append_analyze_table_part ( SPIDER_SQL_TYPE_OTHER_HS ,
link_idx ) ) )
{
DBUG_RETURN ( error_num ) ;
}
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : optimize_table (
SPIDER_CONN * conn ,
int link_idx
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::optimize_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
if ( ( error_num = append_optimize_table_part ( SPIDER_SQL_TYPE_OTHER_HS ,
link_idx ) ) )
{
DBUG_RETURN ( error_num ) ;
}
pthread_mutex_lock ( & conn - > mta_conn_mutex ) ;
SPIDER_SET_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
conn - > need_mon = & spider - > need_mons [ link_idx ] ;
conn - > mta_conn_mutex_lock_already = TRUE ;
conn - > mta_conn_mutex_unlock_later = TRUE ;
if ( ( error_num = spider_db_set_names ( spider , conn , link_idx ) ) )
{
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
conn - > mta_conn_mutex_lock_already = FALSE ;
conn - > mta_conn_mutex_unlock_later = FALSE ;
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : flush_tables (
SPIDER_CONN * conn ,
int link_idx ,
bool lock
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
spider_string * str = & spider - > result_list . sqls [ link_idx ] ;
DBUG_ENTER ( " spider_oracle_handler::flush_tables " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
str - > length ( 0 ) ;
if ( ( error_num = append_flush_tables_part ( SPIDER_SQL_TYPE_OTHER_HS ,
link_idx , lock ) ) )
{
DBUG_RETURN ( error_num ) ;
}
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
str - > ptr ( ) ,
str - > length ( ) ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : flush_logs (
SPIDER_CONN * conn ,
int link_idx
) {
int error_num ;
SPIDER_SHARE * share = spider - > share ;
DBUG_ENTER ( " spider_oracle_handler::flush_logs " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
spider_conn_set_timeout_from_share ( conn , link_idx , spider - > trx - > thd ,
share ) ;
if ( spider_db_query (
conn ,
SPIDER_SQL_FLUSH_LOGS_STR ,
SPIDER_SQL_FLUSH_LOGS_LEN ,
- 1 ,
& spider - > need_mons [ link_idx ] )
) {
error_num = spider_db_errorno ( conn ) ;
DBUG_RETURN ( error_num ) ;
}
SPIDER_CLEAR_FILE_POS ( & conn - > mta_conn_mutex_file_pos ) ;
pthread_mutex_unlock ( & conn - > mta_conn_mutex ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : insert_opened_handler (
SPIDER_CONN * conn ,
int link_idx
) {
spider_db_oracle * db_conn = ( spider_db_oracle * ) 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_oracle_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_oracle_handler : : delete_opened_handler (
SPIDER_CONN * conn ,
int link_idx
) {
spider_db_oracle * db_conn = ( spider_db_oracle * ) conn - > db_conn ;
uint roop_count , elements = db_conn - > handler_open_array . elements ;
SPIDER_LINK_FOR_HASH * tmp_link_for_hash ;
DBUG_ENTER ( " spider_oracle_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_oracle_handler : : sync_from_clone_source (
spider_db_handler * dbton_hdl
) {
DBUG_ENTER ( " spider_oracle_handler::sync_from_clone_source " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( 0 ) ;
}
bool spider_oracle_handler : : support_use_handler (
int use_handler
) {
DBUG_ENTER ( " spider_oracle_handler::support_use_handler " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( FALSE ) ;
}
bool spider_oracle_handler : : minimum_select_bit_is_set (
uint field_index
) {
TABLE * table = spider - > get_table ( ) ;
DBUG_ENTER ( " spider_oracle_handler::minimum_select_bit_is_set " ) ;
DBUG_RETURN (
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 )
) ;
}
void spider_oracle_handler : : copy_minimum_select_bitmap (
uchar * bitmap
) {
int roop_count ;
TABLE * table = spider - > get_table ( ) ;
DBUG_ENTER ( " spider_oracle_handler::copy_minimum_select_bitmap " ) ;
for ( roop_count = 0 ;
roop_count < ( int ) ( ( table - > s - > fields + 7 ) / 8 ) ;
roop_count + + )
{
bitmap [ roop_count ] =
spider - > searched_bitmap [ roop_count ] |
( ( uchar * ) table - > read_set - > bitmap ) [ roop_count ] |
( ( uchar * ) table - > write_set - > bitmap ) [ roop_count ] ;
DBUG_PRINT ( " info " , ( " spider roop_count=%d " , roop_count ) ) ;
DBUG_PRINT ( " info " , ( " spider bitmap=%d " ,
bitmap [ roop_count ] ) ) ;
DBUG_PRINT ( " info " , ( " spider searched_bitmap=%d " ,
spider - > searched_bitmap [ roop_count ] ) ) ;
DBUG_PRINT ( " info " , ( " spider read_set=%d " ,
( ( uchar * ) table - > read_set - > bitmap ) [ roop_count ] ) ) ;
DBUG_PRINT ( " info " , ( " spider write_set=%d " ,
( ( uchar * ) table - > write_set - > bitmap ) [ roop_count ] ) ) ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_handler : : init_union_table_name_pos ( )
{
DBUG_ENTER ( " spider_oracle_handler::init_union_table_name_pos " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! union_table_name_pos_first )
{
if ( ! spider_bulk_malloc ( spider_current_trx , 238 , MYF ( MY_WME ) ,
& union_table_name_pos_first , sizeof ( SPIDER_INT_HLD ) ,
NullS )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
union_table_name_pos_first - > next = NULL ;
}
union_table_name_pos_current = union_table_name_pos_first ;
union_table_name_pos_current - > tgt_num = 0 ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : set_union_table_name_pos ( )
{
DBUG_ENTER ( " spider_oracle_handler::set_union_table_name_pos " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( union_table_name_pos_current - > tgt_num > = SPIDER_INT_HLD_TGT_SIZE )
{
if ( ! union_table_name_pos_current - > next )
{
if ( ! spider_bulk_malloc ( spider_current_trx , 239 , MYF ( MY_WME ) ,
& union_table_name_pos_current - > next , sizeof ( SPIDER_INT_HLD ) ,
NullS )
) {
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
union_table_name_pos_current - > next - > next = NULL ;
}
union_table_name_pos_current = union_table_name_pos_current - > next ;
union_table_name_pos_current - > tgt_num = 0 ;
}
union_table_name_pos_current - > tgt [ union_table_name_pos_current - > tgt_num ] =
table_name_pos ;
+ + union_table_name_pos_current - > tgt_num ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_handler : : reset_union_table_name (
spider_string * str ,
int link_idx ,
ulong sql_type
) {
DBUG_ENTER ( " spider_oracle_handler::reset_union_table_name " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! union_table_name_pos_current )
DBUG_RETURN ( 0 ) ;
SPIDER_INT_HLD * tmp_pos = union_table_name_pos_first ;
uint cur_num , pos_backup = str - > length ( ) ;
while ( TRUE )
{
for ( cur_num = 0 ; cur_num < tmp_pos - > tgt_num ; + + cur_num )
{
str - > length ( tmp_pos - > tgt [ cur_num ] ) ;
append_table_name_with_adjusting ( str , link_idx , sql_type ) ;
}
if ( tmp_pos = = union_table_name_pos_current )
break ;
tmp_pos = tmp_pos - > next ;
}
str - > length ( pos_backup ) ;
DBUG_RETURN ( 0 ) ;
}
spider_oracle_copy_table : : spider_oracle_copy_table (
spider_oracle_share * db_share
) : spider_db_copy_table (
db_share
) ,
oracle_share ( db_share ) ,
pos ( 0 ) ,
table_name_pos ( 0 ) ,
pos_diff ( 0 ) ,
table_lock_mode ( 0 ) ,
select_rownum_appended ( FALSE ) ,
first_str ( NULL ) ,
current_str ( NULL )
{
DBUG_ENTER ( " spider_oracle_copy_table::spider_oracle_copy_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_VOID_RETURN ;
}
spider_oracle_copy_table : : ~ spider_oracle_copy_table ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::~spider_oracle_copy_table " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
while ( first_str )
{
current_str = first_str ;
first_str = first_str - > next ;
delete [ ] current_str ;
}
DBUG_VOID_RETURN ;
}
int spider_oracle_copy_table : : init ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::init " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
sql . init_calc_mem ( 213 ) ;
sql_part . init_calc_mem ( 215 ) ;
DBUG_RETURN ( 0 ) ;
}
void spider_oracle_copy_table : : set_sql_charset (
CHARSET_INFO * cs
) {
DBUG_ENTER ( " spider_oracle_copy_table::set_sql_charset " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
sql . set_charset ( cs ) ;
DBUG_VOID_RETURN ;
}
int spider_oracle_copy_table : : append_select_str ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::append_select_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_SELECT_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_SELECT_STR , SPIDER_SQL_SELECT_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_insert_str (
int insert_flg
) {
DBUG_ENTER ( " spider_oracle_copy_table::append_insert_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_INSERT_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_INSERT_STR , SPIDER_SQL_INSERT_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_table_columns (
TABLE_SHARE * table_share
) {
int error_num ;
Field * * field ;
DBUG_ENTER ( " spider_oracle_copy_table::append_table_columns " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
for ( field = table_share - > field ; * field ; field + + )
{
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
if ( ( error_num = spider_db_append_name_with_quote_str ( & sql ,
( char * ) ( * field ) - > field_name , spider_dbton_oracle . dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
sql . length ( sql . length ( ) - SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_from_str ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::append_from_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_FROM_STR , SPIDER_SQL_FROM_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_table_name (
int link_idx
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_copy_table::append_table_name " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
table_name_pos = sql . length ( ) ;
error_num = oracle_share - > append_table_name ( & sql , link_idx ) ;
store_link_idx = link_idx ;
DBUG_RETURN ( error_num ) ;
}
void spider_oracle_copy_table : : set_sql_pos ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::set_sql_pos " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
pos = sql . length ( ) ;
DBUG_VOID_RETURN ;
}
void spider_oracle_copy_table : : set_sql_to_pos ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::set_sql_to_pos " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
sql . length ( pos ) ;
DBUG_VOID_RETURN ;
}
int spider_oracle_copy_table : : append_copy_where (
spider_db_copy_table * source_ct ,
KEY * key_info ,
ulong * last_row_pos ,
ulong * last_lengths
) {
int error_num , roop_count , roop_count2 ;
DBUG_ENTER ( " spider_oracle_copy_table::append_copy_where " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
sql . q_append ( SPIDER_SQL_WHERE_STR , SPIDER_SQL_WHERE_LEN ) ;
sql . q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
Field * field ;
KEY_PART_INFO * key_part = key_info - > key_part ;
for ( roop_count = spider_user_defined_key_parts ( key_info ) - 1 ;
roop_count > = 0 ; roop_count - - )
{
for ( roop_count2 = 0 ; roop_count2 < roop_count ; roop_count2 + + )
{
field = key_part [ roop_count2 ] . field ;
if ( ( error_num = copy_key_row ( source_ct ,
field , & last_row_pos [ field - > field_index ] ,
& last_lengths [ field - > field_index ] ,
SPIDER_SQL_EQUAL_STR , SPIDER_SQL_EQUAL_LEN ) ) )
{
DBUG_RETURN ( error_num ) ;
}
}
field = key_part [ roop_count2 ] . field ;
if ( ( error_num = copy_key_row ( source_ct ,
field , & last_row_pos [ field - > field_index ] ,
& last_lengths [ field - > field_index ] ,
SPIDER_SQL_GT_STR , SPIDER_SQL_GT_LEN ) ) )
{
DBUG_RETURN ( error_num ) ;
}
sql . length ( sql . length ( ) - SPIDER_SQL_AND_LEN ) ;
if ( sql . reserve ( SPIDER_SQL_CLOSE_PAREN_LEN +
SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
sql . q_append ( SPIDER_SQL_CLOSE_PAREN_STR , SPIDER_SQL_CLOSE_PAREN_LEN ) ;
sql . q_append ( SPIDER_SQL_OR_STR , SPIDER_SQL_OR_LEN ) ;
sql . q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
}
sql . length ( sql . length ( ) - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_key_order_str (
KEY * key_info ,
int start_pos ,
bool desc_flg
) {
int length , error_num ;
KEY_PART_INFO * key_part ;
Field * field ;
DBUG_ENTER ( " spider_oracle_copy_table::append_key_order_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( select_rownum_appended )
{
if ( sql . reserve ( SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
sql_part . length ( 0 ) ;
if ( sql_part . reserve ( sql . length ( ) + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_HEAD_STR ,
SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN ) ;
sql_part . q_append ( sql . ptr ( ) , table_name_pos - SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_HEAD_STR ,
SPIDER_SQL_ROW_NUMBER_HEAD_LEN ) ;
if ( ( int ) spider_user_defined_key_parts ( key_info ) > start_pos )
{
if ( desc_flg = = TRUE )
{
for (
key_part = key_info - > key_part + start_pos ,
length = 0 ;
length + start_pos < ( int ) spider_user_defined_key_parts ( key_info ) ;
key_part + + ,
length + +
) {
field = key_part - > field ;
if ( sql_part . reserve ( SPIDER_SQL_NAME_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
if ( ( error_num = spider_db_append_name_with_quote_str ( & sql_part ,
( char * ) field - > field_name , spider_dbton_oracle . dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( sql_part . reserve ( SPIDER_SQL_NAME_QUOTE_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_NAME_QUOTE_LEN +
SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql_part . q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
} else {
for (
key_part = key_info - > key_part + start_pos ,
length = 0 ;
length + start_pos < ( int ) spider_user_defined_key_parts ( key_info ) ;
key_part + + ,
length + +
) {
field = key_part - > field ;
if ( sql_part . reserve ( SPIDER_SQL_NAME_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
if ( ( error_num = spider_db_append_name_with_quote_str ( & sql_part ,
( char * ) field - > field_name , spider_dbton_oracle . dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( sql_part . reserve ( SPIDER_SQL_NAME_QUOTE_LEN +
SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql_part . q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_NAME_QUOTE_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql_part . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
}
}
if ( desc_flg = = TRUE )
{
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + sql . length ( ) - table_name_pos +
SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN ) ;
} else {
if ( sql_part . reserve ( SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + sql . length ( ) - table_name_pos +
SPIDER_SQL_FROM_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_ROW_NUMBER_TAIL_STR ,
SPIDER_SQL_ROW_NUMBER_TAIL_LEN ) ;
}
pos_diff = sql_part . length ( ) + SPIDER_SQL_FROM_LEN - table_name_pos ;
sql_part . q_append ( sql . ptr ( ) + table_name_pos - SPIDER_SQL_FROM_LEN ,
sql . length ( ) - table_name_pos + SPIDER_SQL_FROM_LEN ) ;
sql_part . q_append ( SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ,
SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN ) ;
if ( ( int ) spider_user_defined_key_parts ( key_info ) > start_pos )
{
if ( sql . reserve ( SPIDER_SQL_ORDER_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_ORDER_STR , SPIDER_SQL_ORDER_LEN ) ;
if ( desc_flg = = TRUE )
{
for (
key_part = key_info - > key_part + start_pos ,
length = 0 ;
length + start_pos < ( int ) spider_user_defined_key_parts ( key_info ) ;
key_part + + ,
length + +
) {
field = key_part - > field ;
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
if ( ( error_num = spider_db_append_name_with_quote_str ( & sql ,
( char * ) field - > field_name , spider_dbton_oracle . dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql . q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
sql . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
} else {
for (
key_part = key_info - > key_part + start_pos ,
length = 0 ;
length + start_pos < ( int ) spider_user_defined_key_parts ( key_info ) ;
key_part + + ,
length + +
) {
field = key_part - > field ;
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
if ( ( error_num = spider_db_append_name_with_quote_str ( & sql ,
( char * ) field - > field_name , spider_dbton_oracle . dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( key_part - > key_part_flag & HA_REVERSE_SORT )
{
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql . q_append ( SPIDER_SQL_DESC_STR , SPIDER_SQL_DESC_LEN ) ;
sql . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
} else {
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR ,
SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql . q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
}
}
}
sql . length ( sql . length ( ) - SPIDER_SQL_COMMA_LEN ) ;
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_limit (
longlong offset ,
longlong limit
) {
char buf [ SPIDER_LONGLONG_LEN + 1 ] ;
uint32 length ;
DBUG_ENTER ( " spider_oracle_copy_table::append_limit " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( offset | | limit < 9223372036854775807LL )
{
if ( ! select_rownum_appended )
{
select_rownum_appended = TRUE ;
table_name_pos = table_name_pos + pos_diff ;
if ( sql . copy ( sql_part ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
pos = pos + pos_diff ;
}
if ( offset )
{
if ( sql . reserve ( SPIDER_SQL_BETWEEN_LEN + SPIDER_SQL_AND_LEN +
( ( SPIDER_LONGLONG_LEN ) * 2 ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_BETWEEN_STR , SPIDER_SQL_BETWEEN_LEN ) ;
length = ( uint32 ) ( my_charset_bin . cset - > longlong10_to_str ) (
& my_charset_bin , buf , SPIDER_LONGLONG_LEN + 1 , - 10 , offset ) ;
sql . q_append ( buf , length ) ;
sql . q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
length = ( uint32 ) ( my_charset_bin . cset - > longlong10_to_str ) (
& my_charset_bin , buf , SPIDER_LONGLONG_LEN + 1 , - 10 , limit ) ;
sql . q_append ( buf , length ) ;
} else {
if ( sql . reserve ( SPIDER_SQL_HS_LTEQUAL_LEN +
( SPIDER_LONGLONG_LEN ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_HS_LTEQUAL_STR , SPIDER_SQL_HS_LTEQUAL_LEN ) ;
length = ( uint32 ) ( my_charset_bin . cset - > longlong10_to_str ) (
& my_charset_bin , buf , SPIDER_LONGLONG_LEN + 1 , - 10 , limit ) ;
sql . q_append ( buf , length ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_into_str ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::append_into_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_INTO_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_INTO_STR , SPIDER_SQL_INTO_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_open_paren_str ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::append_open_paren_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_values_str ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::append_values_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_VALUES_STR , SPIDER_SQL_VALUES_LEN ) ;
sql . q_append ( SPIDER_SQL_OPEN_PAREN_STR , SPIDER_SQL_OPEN_PAREN_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_select_lock_str (
int lock_mode
) {
DBUG_ENTER ( " spider_oracle_copy_table::append_select_lock_str " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( select_rownum_appended )
{
int error_num ;
table_lock_mode = lock_mode ;
sql_part . length ( 0 ) ;
if ( sql_part . reserve ( SPIDER_SQL_LOCK_TABLE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_LOCK_TABLE_STR , SPIDER_SQL_LOCK_TABLE_LEN ) ;
if ( ( error_num = oracle_share - > append_table_name ( & sql_part ,
store_link_idx ) ) )
DBUG_RETURN ( error_num ) ;
if ( lock_mode = = SPIDER_LOCK_MODE_EXCLUSIVE )
{
if ( sql_part . reserve ( SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR ,
SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN ) ;
} else if ( lock_mode = = SPIDER_LOCK_MODE_SHARED )
{
if ( sql_part . reserve ( SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql_part . q_append ( SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR ,
SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN ) ;
}
} else {
if ( lock_mode = = SPIDER_LOCK_MODE_EXCLUSIVE )
{
if ( sql . reserve ( SPIDER_SQL_FOR_UPDATE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_FOR_UPDATE_STR , SPIDER_SQL_FOR_UPDATE_LEN ) ;
} else if ( lock_mode = = SPIDER_LOCK_MODE_SHARED )
{
if ( sql . reserve ( SPIDER_SQL_FOR_UPDATE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_FOR_UPDATE_STR , SPIDER_SQL_FOR_UPDATE_LEN ) ;
}
}
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : exec_query (
SPIDER_CONN * conn ,
int quick_mode ,
int * need_mon
) {
int error_num = 0 ;
DBUG_ENTER ( " spider_oracle_copy_table::exec_query " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( current_str )
{
spider_string * tmp_str = first_str ;
while ( tmp_str & & tmp_str ! = current_str )
{
if (
( error_num = spider_db_query ( conn , tmp_str - > ptr ( ) , tmp_str - > length ( ) ,
quick_mode , need_mon ) ) & &
error_num ! = HA_ERR_FOUND_DUPP_KEY
) {
break ;
}
tmp_str = tmp_str - > next ;
}
if ( tmp_str = = current_str )
{
error_num = spider_db_query ( conn , tmp_str - > ptr ( ) , tmp_str - > length ( ) ,
quick_mode , need_mon ) ;
}
if ( error_num = = HA_ERR_FOUND_DUPP_KEY )
error_num = 0 ;
current_str = NULL ;
} else {
if ( table_lock_mode )
{
DBUG_PRINT ( " info " , ( " spider table_lock_mode=%d " , table_lock_mode ) ) ;
spider_db_oracle * db_conn = ( spider_db_oracle * ) conn - > db_conn ;
db_conn - > table_lock_mode = table_lock_mode ;
db_conn - > exec_lock_sql = & sql_part ;
table_lock_mode = 0 ;
}
error_num = spider_db_query ( conn , sql . ptr ( ) , sql . length ( ) , quick_mode ,
need_mon ) ;
}
DBUG_RETURN ( error_num ) ;
}
int spider_oracle_copy_table : : copy_key_row (
spider_db_copy_table * source_ct ,
Field * field ,
ulong * row_pos ,
ulong * length ,
const char * joint_str ,
const int joint_length
) {
int error_num ;
spider_string * source_str = & ( ( spider_oracle_copy_table * ) source_ct ) - > sql ;
DBUG_ENTER ( " spider_oracle_copy_table::copy_key_row " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
if ( ( error_num = spider_db_append_name_with_quote_str ( & sql ,
( char * ) field - > field_name , spider_dbton_oracle . dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( sql . reserve ( SPIDER_SQL_NAME_QUOTE_LEN + joint_length + * length +
SPIDER_SQL_AND_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
sql . q_append ( SPIDER_SQL_NAME_QUOTE_STR , SPIDER_SQL_NAME_QUOTE_LEN ) ;
sql . q_append ( joint_str , joint_length ) ;
sql . q_append ( source_str - > ptr ( ) + * row_pos , * length ) ;
sql . q_append ( SPIDER_SQL_AND_STR , SPIDER_SQL_AND_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : copy_row (
Field * field ,
SPIDER_DB_ROW * row
) {
int error_num ;
DBUG_ENTER ( " spider_oracle_copy_table::copy_row " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( row - > is_null ( ) )
{
DBUG_PRINT ( " info " , ( " spider column is null " ) ) ;
if ( current_str - > reserve ( SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
current_str - > q_append ( SPIDER_SQL_NULL_STR , SPIDER_SQL_NULL_LEN ) ;
} else if ( field - > str_needs_quotes ( ) )
{
DBUG_PRINT ( " info " , ( " spider str_needs_quotes " ) ) ;
if ( current_str - > reserve ( SPIDER_SQL_VALUE_QUOTE_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
current_str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR ,
SPIDER_SQL_VALUE_QUOTE_LEN ) ;
if ( ( error_num = row - > append_escaped_to_str ( current_str ,
spider_dbton_oracle . dbton_id ) ) )
DBUG_RETURN ( error_num ) ;
if ( current_str - > reserve ( SPIDER_SQL_VALUE_QUOTE_LEN +
SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
current_str - > q_append ( SPIDER_SQL_VALUE_QUOTE_STR ,
SPIDER_SQL_VALUE_QUOTE_LEN ) ;
} else {
DBUG_PRINT ( " info " , ( " spider without_quotes " ) ) ;
if ( ( error_num = row - > append_to_str ( current_str ) ) )
DBUG_RETURN ( error_num ) ;
if ( current_str - > reserve ( SPIDER_SQL_COMMA_LEN ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
current_str - > q_append ( SPIDER_SQL_COMMA_STR , SPIDER_SQL_COMMA_LEN ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : copy_rows (
TABLE * table ,
SPIDER_DB_ROW * row ,
ulong * * last_row_pos ,
ulong * * last_lengths
) {
int error_num ;
Field * * field ;
ulong * lengths2 , * row_pos2 ;
DBUG_ENTER ( " spider_oracle_copy_table::copy_rows " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! current_str )
{
if ( ! first_str )
{
if ( ! ( first_str = new spider_string [ 1 ] ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
first_str - > init_calc_mem ( 216 ) ;
first_str - > set_charset ( sql . charset ( ) ) ;
if ( first_str - > reserve ( sql . length ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
first_str - > q_append ( sql . ptr ( ) , sql . length ( ) ) ;
} else {
first_str - > length ( sql . length ( ) ) ;
}
current_str = first_str ;
} else {
if ( ! current_str - > next )
{
if ( ! ( current_str - > next = new spider_string [ 1 ] ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
current_str - > next - > init_calc_mem ( 217 ) ;
current_str - > next - > set_charset ( sql . charset ( ) ) ;
if ( current_str - > next - > reserve ( sql . length ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
current_str - > next - > q_append ( sql . ptr ( ) , sql . length ( ) ) ;
} else {
current_str - > next - > length ( sql . length ( ) ) ;
}
current_str = current_str - > next ;
}
row_pos2 = * last_row_pos ;
lengths2 = * last_lengths ;
for (
field = table - > field ;
* field ;
field + + ,
lengths2 + +
) {
* row_pos2 = current_str - > length ( ) ;
if ( ( error_num =
copy_row ( * field , row ) ) )
DBUG_RETURN ( error_num ) ;
* lengths2 = current_str - > length ( ) - * row_pos2 - SPIDER_SQL_COMMA_LEN ;
row - > next ( ) ;
row_pos2 + + ;
}
current_str - > length ( current_str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( current_str - > reserve ( SPIDER_SQL_CLOSE_PAREN_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
current_str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR ,
SPIDER_SQL_CLOSE_PAREN_LEN ) ;
DBUG_PRINT ( " info " , ( " spider current_str=%s " , current_str - > c_ptr_safe ( ) ) ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : copy_rows (
TABLE * table ,
SPIDER_DB_ROW * row
) {
int error_num ;
Field * * field ;
DBUG_ENTER ( " spider_oracle_copy_table::copy_rows " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( ! current_str )
{
if ( ! first_str )
{
if ( ! ( first_str = new spider_string [ 1 ] ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
first_str - > init_calc_mem ( 218 ) ;
first_str - > set_charset ( sql . charset ( ) ) ;
if ( first_str - > reserve ( sql . length ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
first_str - > q_append ( sql . ptr ( ) , sql . length ( ) ) ;
} else {
first_str - > length ( sql . length ( ) ) ;
}
current_str = first_str ;
} else {
if ( ! current_str - > next )
{
if ( ! ( current_str - > next = new spider_string [ 1 ] ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
current_str - > next - > init_calc_mem ( 219 ) ;
current_str - > next - > set_charset ( sql . charset ( ) ) ;
if ( current_str - > next - > reserve ( sql . length ( ) ) )
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
current_str - > next - > q_append ( sql . ptr ( ) , sql . length ( ) ) ;
} else {
current_str - > next - > length ( sql . length ( ) ) ;
}
current_str = current_str - > next ;
}
for (
field = table - > field ;
* field ;
field + +
) {
if ( ( error_num =
copy_row ( * field , row ) ) )
DBUG_RETURN ( error_num ) ;
row - > next ( ) ;
}
current_str - > length ( current_str - > length ( ) - SPIDER_SQL_COMMA_LEN ) ;
if ( current_str - > reserve ( SPIDER_SQL_CLOSE_PAREN_LEN ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
current_str - > q_append ( SPIDER_SQL_CLOSE_PAREN_STR ,
SPIDER_SQL_CLOSE_PAREN_LEN ) ;
DBUG_PRINT ( " info " , ( " spider current_str=%s " , current_str - > c_ptr_safe ( ) ) ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : append_insert_terminator ( )
{
DBUG_ENTER ( " spider_oracle_copy_table::append_insert_terminator " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
DBUG_RETURN ( 0 ) ;
}
int spider_oracle_copy_table : : copy_insert_values (
spider_db_copy_table * source_ct
) {
spider_oracle_copy_table * tmp_ct = ( spider_oracle_copy_table * ) source_ct ;
spider_string * source_str = & tmp_ct - > sql ;
int values_length = source_str - > length ( ) - tmp_ct - > pos ;
const char * values_ptr = source_str - > ptr ( ) + tmp_ct - > pos ;
DBUG_ENTER ( " spider_oracle_copy_table::copy_insert_values " ) ;
DBUG_PRINT ( " info " , ( " spider this=%p " , this ) ) ;
if ( sql . reserve ( values_length ) )
{
DBUG_RETURN ( HA_ERR_OUT_OF_MEM ) ;
}
sql . q_append ( values_ptr , values_length ) ;
DBUG_RETURN ( 0 ) ;
}
# endif