/* Copyright (C) 2012-2019 Kentoku Shiba
Copyright ( C ) 2019 MariaDB corp
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; version 2 of the License .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
#include <my_global.h>
#include "mysql_version.h"
#include "sql_priv.h"
#include "probes_mysql.h"
#include "sql_class.h"
#include "sql_analyse.h"
#include "spd_db_include.h"
#include "spd_include.h"
#include "spd_malloc.h"
extern handlerton *spider_hton_ptr;
pthread_mutex_t spider_mem_calc_mutex;
const char *spider_alloc_func_name[SPIDER_MEM_CALC_LIST_NUM];
const char *spider_alloc_file_name[SPIDER_MEM_CALC_LIST_NUM];
ulong spider_alloc_line_no[SPIDER_MEM_CALC_LIST_NUM];
ulonglong spider_total_alloc_mem[SPIDER_MEM_CALC_LIST_NUM];
longlong spider_current_alloc_mem[SPIDER_MEM_CALC_LIST_NUM];
ulonglong spider_alloc_mem_count[SPIDER_MEM_CALC_LIST_NUM];
ulonglong spider_free_mem_count[SPIDER_MEM_CALC_LIST_NUM];
void spider_merge_mem_calc(
SPIDER_TRX *trx,
bool force
) {
uint roop_count;
time_t tmp_time;
DBUG_ENTER("spider_merge_mem_calc" );
if (force)
{
pthread_mutex_lock(&spider_mem_calc_mutex);
tmp_time = (time_t) time((time_t*) 0 );
} else {
tmp_time = (time_t) time((time_t*) 0 );
if (
difftime(tmp_time, trx->mem_calc_merge_time) < 2 ||
pthread_mutex_trylock(&spider_mem_calc_mutex)
)
DBUG_VOID_RETURN;
}
for (roop_count = 0 ; roop_count < SPIDER_MEM_CALC_LIST_NUM; roop_count++)
{
DBUG_ASSERT(!spider_alloc_func_name[roop_count] ||
!trx->alloc_func_name[roop_count] ||
spider_alloc_func_name[roop_count] == trx->alloc_func_name[roop_count]);
DBUG_ASSERT(!spider_alloc_file_name[roop_count] ||
!trx->alloc_file_name[roop_count] ||
spider_alloc_file_name[roop_count] == trx->alloc_file_name[roop_count]);
DBUG_ASSERT(!spider_alloc_line_no[roop_count] ||
!trx->alloc_line_no[roop_count] ||
spider_alloc_line_no[roop_count] == trx->alloc_line_no[roop_count]);
if (trx->alloc_func_name[roop_count])
{
spider_alloc_func_name[roop_count] = trx->alloc_func_name[roop_count];
spider_alloc_file_name[roop_count] = trx->alloc_file_name[roop_count];
spider_alloc_line_no[roop_count] = trx->alloc_line_no[roop_count];
spider_total_alloc_mem[roop_count] +=
trx->total_alloc_mem_buffer[roop_count];
trx->total_alloc_mem_buffer[roop_count] = 0 ;
spider_alloc_mem_count[roop_count] +=
trx->alloc_mem_count_buffer[roop_count];
trx->alloc_mem_count_buffer[roop_count] = 0 ;
}
spider_current_alloc_mem[roop_count] +=
trx->current_alloc_mem_buffer[roop_count];
trx->current_alloc_mem_buffer[roop_count] = 0 ;
spider_free_mem_count[roop_count] +=
trx->free_mem_count_buffer[roop_count];
trx->free_mem_count_buffer[roop_count] = 0 ;
}
pthread_mutex_unlock(&spider_mem_calc_mutex);
trx->mem_calc_merge_time = tmp_time;
DBUG_VOID_RETURN;
}
void spider_free_mem_calc(
SPIDER_TRX *trx,
uint id,
size_t size
) {
DBUG_ENTER("spider_free_mem_calc" );
DBUG_ASSERT(id < SPIDER_MEM_CALC_LIST_NUM);
DBUG_PRINT("info" ,("spider trx=%p id=%u size=%llu" ,
trx, id, (ulonglong) size));
if (trx)
{
DBUG_PRINT("info" ,("spider calc into trx" ));
trx->current_alloc_mem[id] -= size;
trx->current_alloc_mem_buffer[id] -= size;
trx->free_mem_count[id] += 1 ;
trx->free_mem_count_buffer[id] += 1 ;
} else {
DBUG_PRINT("info" ,("spider calc into global" ));
pthread_mutex_lock(&spider_mem_calc_mutex);
spider_current_alloc_mem[id] -= size;
spider_free_mem_count[id] += 1 ;
pthread_mutex_unlock(&spider_mem_calc_mutex);
}
DBUG_VOID_RETURN;
}
void spider_alloc_mem_calc(
SPIDER_TRX *trx,
uint id,
const char *func_name,
const char *file_name,
ulong line_no,
size_t size
) {
DBUG_ENTER("spider_alloc_mem_calc" );
DBUG_ASSERT(id < SPIDER_MEM_CALC_LIST_NUM);
DBUG_PRINT("info" ,("spider trx=%p id=%u size=%llu" ,
trx, id, (ulonglong) size));
if (trx)
{
DBUG_PRINT("info" ,("spider calc into trx" ));
DBUG_ASSERT(!trx->alloc_func_name[id] ||
trx->alloc_func_name[id] == func_name);
DBUG_ASSERT(!trx->alloc_file_name[id] ||
trx->alloc_file_name[id] == file_name);
DBUG_ASSERT(!trx->alloc_line_no[id] ||
trx->alloc_line_no[id] == line_no);
trx->alloc_func_name[id] = func_name;
trx->alloc_file_name[id] = file_name;
trx->alloc_line_no[id] = line_no;
trx->total_alloc_mem[id] += size;
trx->total_alloc_mem_buffer[id] += size;
trx->current_alloc_mem[id] += size;
trx->current_alloc_mem_buffer[id] += size;
trx->alloc_mem_count[id] += 1 ;
trx->alloc_mem_count_buffer[id] += 1 ;
} else {
DBUG_PRINT("info" ,("spider calc into global" ));
pthread_mutex_lock(&spider_mem_calc_mutex);
DBUG_ASSERT(!spider_alloc_func_name[id] ||
spider_alloc_func_name[id] == func_name);
DBUG_ASSERT(!spider_alloc_file_name[id] ||
spider_alloc_file_name[id] == file_name);
DBUG_ASSERT(!spider_alloc_line_no[id] ||
spider_alloc_line_no[id] == line_no);
spider_alloc_func_name[id] = func_name;
spider_alloc_file_name[id] = file_name;
spider_alloc_line_no[id] = line_no;
spider_total_alloc_mem[id] += size;
spider_current_alloc_mem[id] += size;
spider_alloc_mem_count[id] += 1 ;
pthread_mutex_unlock(&spider_mem_calc_mutex);
}
DBUG_VOID_RETURN;
}
void spider_free_mem(
SPIDER_TRX *trx,
void *ptr,
myf my_flags
) {
uint id, size;
uchar *tmp_ptr = (uchar *) ptr;
DBUG_ENTER("spider_free_mem" );
tmp_ptr -= ALIGN_SIZE(sizeof (uint));
size = *((uint *) tmp_ptr);
tmp_ptr -= ALIGN_SIZE(sizeof (uint));
id = *((uint *) tmp_ptr);
spider_my_free(tmp_ptr, my_flags);
spider_free_mem_calc(trx, id, size);
DBUG_VOID_RETURN;
}
void *spider_alloc_mem(
SPIDER_TRX *trx,
uint id,
const char *func_name,
const char *file_name,
ulong line_no,
size_t size,
myf my_flags
) {
uchar *ptr;
DBUG_ENTER("spider_alloc_mem" );
size += ALIGN_SIZE(sizeof (uint)) + ALIGN_SIZE(sizeof (uint));
if (!(ptr = (uchar *) my_malloc(PSI_INSTRUMENT_ME, size, my_flags)))
DBUG_RETURN(NULL);
spider_alloc_mem_calc(trx, id, func_name, file_name, line_no, size);
*((uint *) ptr) = id;
ptr += ALIGN_SIZE(sizeof (uint));
*((uint *) ptr) = size;
ptr += ALIGN_SIZE(sizeof (uint));
DBUG_RETURN(ptr);
}
void *spider_bulk_alloc_mem(
SPIDER_TRX *trx,
uint id,
const char *func_name,
const char *file_name,
ulong line_no,
myf my_flags,
...
) {
uchar **tmp_ptr, *top_ptr, *current_ptr;
uint total_size;
va_list args;
DBUG_ENTER("spider_bulk_alloc_mem" );
total_size = ALIGN_SIZE(sizeof (uint)) + ALIGN_SIZE(sizeof (uint));
va_start(args, my_flags);
while (va_arg(args, char **))
total_size += ALIGN_SIZE(va_arg(args, uint));
va_end(args);
if (!(top_ptr = (uchar *) my_malloc(PSI_INSTRUMENT_ME, total_size, my_flags)))
DBUG_RETURN(NULL);
spider_alloc_mem_calc(trx, id, func_name, file_name, line_no, total_size);
*((uint *) top_ptr) = id;
top_ptr += ALIGN_SIZE(sizeof (uint));
*((uint *) top_ptr) = total_size;
top_ptr += ALIGN_SIZE(sizeof (uint));
current_ptr = top_ptr;
va_start(args, my_flags);
while ((tmp_ptr = (uchar **) va_arg(args, char **)))
{
*tmp_ptr = current_ptr;
current_ptr += ALIGN_SIZE(va_arg(args, uint));
}
va_end(args);
DBUG_RETURN((void *) top_ptr);
}
#define SPIDER_STRING_CALC_MEM \
if (mem_calc_inited) \
{ \
uint32 new_alloc_mem = \
(this ->str.is_alloced() ? this ->str.alloced_length() : 0 ); \
if (new_alloc_mem != current_alloc_mem) \
{ \
if (new_alloc_mem > current_alloc_mem) \
spider_alloc_mem_calc(spider_current_trx, id, func_name, file_name, \
line_no, new_alloc_mem - current_alloc_mem); \
else \
spider_free_mem_calc(spider_current_trx, id, \
current_alloc_mem - new_alloc_mem); \
current_alloc_mem = new_alloc_mem; \
} \
}
spider_string::spider_string(
) : str(), next(NULL)
{
DBUG_ENTER("spider_string::spider_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
mem_calc_inited = FALSE ;
DBUG_VOID_RETURN;
}
spider_string::spider_string(
uint32 length_arg
) : str(length_arg), next(NULL)
{
DBUG_ENTER("spider_string::spider_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
mem_calc_inited = FALSE ;
DBUG_VOID_RETURN;
}
spider_string::spider_string(
const char *str,
CHARSET_INFO *cs
) : str(str, strlen(str), cs), next(NULL)
{
DBUG_ENTER("spider_string::spider_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
mem_calc_inited = FALSE ;
DBUG_VOID_RETURN;
}
spider_string::spider_string(
const char *str,
uint32 len,
CHARSET_INFO *cs
) : str(str, len, cs), next(NULL)
{
DBUG_ENTER("spider_string::spider_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
mem_calc_inited = FALSE ;
DBUG_VOID_RETURN;
}
spider_string::spider_string(
char *str,
uint32 len,
CHARSET_INFO *cs
) : str(str, len, cs), next(NULL)
{
DBUG_ENTER("spider_string::spider_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
mem_calc_inited = FALSE ;
DBUG_VOID_RETURN;
}
spider_string::spider_string(
const String &str
) : str(str), next(NULL)
{
DBUG_ENTER("spider_string::spider_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
mem_calc_inited = FALSE ;
DBUG_VOID_RETURN;
}
spider_string::~spider_string()
{
DBUG_ENTER("spider_string::~spider_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
if (mem_calc_inited)
free();
DBUG_VOID_RETURN;
}
void spider_string::init_mem_calc(
uint id,
const char *func_name,
const char *file_name,
ulong line_no
) {
DBUG_ENTER("spider_string::init_mem_calc" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(!mem_calc_inited);
this ->id = id;
this ->func_name = func_name;
this ->file_name = file_name;
this ->line_no = line_no;
if (str.is_alloced())
{
current_alloc_mem = str.alloced_length();
spider_alloc_mem_calc(spider_current_trx, id, func_name, file_name,
line_no, current_alloc_mem);
} else
current_alloc_mem = 0 ;
mem_calc_inited = TRUE ;
DBUG_VOID_RETURN;
}
void spider_string::mem_calc()
{
DBUG_ENTER("spider_string::mem_calc" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
SPIDER_STRING_CALC_MEM;
DBUG_VOID_RETURN;
}
String *spider_string::get_str()
{
DBUG_ENTER("spider_string::get_str" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(&str);
}
void spider_string::set_charset(
CHARSET_INFO *charset_arg
) {
DBUG_ENTER("spider_string::set_charset" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.set_charset(charset_arg);
DBUG_VOID_RETURN;
}
CHARSET_INFO *spider_string::charset() const
{
DBUG_ENTER("spider_string::charset" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.charset());
}
uint32 spider_string::length() const
{
DBUG_ENTER("spider_string::length" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.length());
}
uint32 spider_string::alloced_length() const
{
DBUG_ENTER("spider_string::alloced_length" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.alloced_length());
}
char &spider_string::operator [] (uint32 i) const
{
DBUG_ENTER("spider_string::operator []" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str[i]);
}
void spider_string::length(
uint32 len
) {
DBUG_ENTER("spider_string::length" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.length(len);
DBUG_VOID_RETURN;
}
bool spider_string::is_empty() const
{
DBUG_ENTER("spider_string::is_empty" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.is_empty());
}
const char *spider_string::ptr() const
{
DBUG_ENTER("spider_string::ptr" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.ptr());
}
char *spider_string::c_ptr()
{
DBUG_ENTER("spider_string::c_ptr" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
char *res = str.c_ptr();
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
char *spider_string::c_ptr_quick()
{
DBUG_ENTER("spider_string::c_ptr_quick" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.c_ptr_quick());
}
char *spider_string::c_ptr_safe()
{
DBUG_ENTER("spider_string::c_ptr_safe" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
char *res = str.c_ptr_safe();
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
LEX_STRING spider_string::lex_string() const
{
LEX_STRING res= { (char *) str.ptr(), str.length() };
DBUG_ENTER("spider_string::lex_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(res);
}
void spider_string::set(
String &str,
uint32 offset,
uint32 arg_length
) {
DBUG_ENTER("spider_string::set" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str.set(str, offset, arg_length);
SPIDER_STRING_CALC_MEM;
DBUG_VOID_RETURN;
}
void spider_string::set(
char *str,
uint32 arg_length,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::set" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !this ->str.is_alloced()) ||
current_alloc_mem == this ->str.alloced_length());
this ->str.set(str, arg_length, cs);
SPIDER_STRING_CALC_MEM;
DBUG_VOID_RETURN;
}
void spider_string::set(
const char *str,
uint32 arg_length,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::set" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !this ->str.is_alloced()) ||
current_alloc_mem == this ->str.alloced_length());
this ->str.set(str, arg_length, cs);
SPIDER_STRING_CALC_MEM;
DBUG_VOID_RETURN;
}
bool spider_string::set_ascii(
const char *str,
uint32 arg_length
) {
DBUG_ENTER("spider_string::set_ascii" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !this ->str.is_alloced()) ||
current_alloc_mem == this ->str.alloced_length());
bool res = this ->str.set_ascii(str, arg_length);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::set_int(
longlong num,
bool unsigned_flag,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::set_int" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.set_int(num, unsigned_flag, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::set(
longlong num,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::set" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.set(num, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::set(
ulonglong num,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::set" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.set(num, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::set_real(
double num,
uint decimals,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::set_real" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.set_real(num, decimals, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
void spider_string::chop()
{
DBUG_ENTER("spider_string::chop" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.chop();
DBUG_VOID_RETURN;
}
void spider_string::free()
{
DBUG_ENTER("spider_string::free" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str.free();
if (mem_calc_inited && current_alloc_mem)
{
spider_free_mem_calc(spider_current_trx, id, current_alloc_mem);
current_alloc_mem = 0 ;
}
DBUG_VOID_RETURN;
}
bool spider_string::alloc(uint32 arg_length)
{
bool res;
DBUG_ENTER("spider_string::alloc" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
res = str.alloc(arg_length);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::real_alloc(uint32 arg_length)
{
bool res;
DBUG_ENTER("spider_string::real_alloc" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
res = str.real_alloc(arg_length);
/*
if ( mem_calc_inited & & ! res & & arg_length )
*/
if (mem_calc_inited && !res)
{
DBUG_ASSERT(!current_alloc_mem);
spider_alloc_mem_calc(spider_current_trx, id, func_name, file_name,
line_no, str.alloced_length());
current_alloc_mem = str.alloced_length();
}
DBUG_RETURN(res);
}
bool spider_string::realloc(uint32 arg_length)
{
bool res;
DBUG_ENTER("spider_string::realloc" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
res = str.realloc(arg_length);
if (mem_calc_inited && !res && current_alloc_mem < str.alloced_length())
{
spider_alloc_mem_calc(spider_current_trx, id, func_name, file_name,
line_no, str.alloced_length() - current_alloc_mem);
current_alloc_mem = str.alloced_length();
}
DBUG_RETURN(res);
}
void spider_string::shrink(
uint32 arg_length
) {
DBUG_ENTER("spider_string::shrink" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str.shrink(arg_length);
SPIDER_STRING_CALC_MEM;
DBUG_VOID_RETURN;
}
bool spider_string::is_alloced()
{
DBUG_ENTER("spider_string::is_alloced" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.is_alloced());
}
spider_string &spider_string::operator = (
const String &s
) {
DBUG_ENTER("spider_string::operator =" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str = s;
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(*this );
}
bool spider_string::copy()
{
DBUG_ENTER("spider_string::copy" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.copy();
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::copy(
const spider_string &s
) {
DBUG_ENTER("spider_string::copy" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.copy(s.str);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::copy(
const String &s
) {
DBUG_ENTER("spider_string::copy" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.copy(s);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::copy(
const char *s,
uint32 arg_length,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::copy" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.copy(s, arg_length, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::needs_conversion(
uint32 arg_length,
CHARSET_INFO *cs_from,
CHARSET_INFO *cs_to,
uint32 *offset
) {
DBUG_ENTER("spider_string::needs_conversion" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.needs_conversion(arg_length, cs_from, cs_to, offset));
}
bool spider_string::copy_aligned(
const char *s,
uint32 arg_length,
uint32 offset,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::copy_aligned" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.copy_aligned(s, arg_length, offset, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::set_or_copy_aligned(
const char *s,
uint32 arg_length,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::set_or_copy_aligned" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.set_or_copy_aligned(s, arg_length, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::copy(
const char *s,
uint32 arg_length,
CHARSET_INFO *csfrom,
CHARSET_INFO *csto,
uint *errors
) {
DBUG_ENTER("spider_string::copy" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.copy(s, arg_length, csfrom, csto, errors);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
const spider_string &s
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(s.str);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
const String &s
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(s);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
const char *s
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(s, strlen(s));
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
LEX_STRING *ls
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(*ls);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
const char *s,
uint32 arg_length
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(s, arg_length);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
const char *s,
uint32 arg_length,
CHARSET_INFO *cs
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(s, arg_length, cs);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append_ulonglong(
ulonglong val
) {
DBUG_ENTER("spider_string::append_ulonglong" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append_ulonglong(val);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
IO_CACHE *file,
uint32 arg_length
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(file, arg_length);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
int spider_string::strstr(
const String &search,
uint32 offset
) {
DBUG_ENTER("spider_string::strstr" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.strstr(search, offset));
}
int spider_string::strrstr(
const String &search,
uint32 offset
) {
DBUG_ENTER("spider_string::strrstr" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.strrstr(search, offset));
}
bool spider_string::replace(
uint32 offset,
uint32 arg_length,
const char *to,
uint32 length
) {
DBUG_ENTER("spider_string::replace" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.replace(offset, arg_length, to, length);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::replace(
uint32 offset,
uint32 arg_length,
const String &to
) {
DBUG_ENTER("spider_string::replace" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.replace(offset, arg_length, to);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
char chr
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(chr);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::fill(
uint32 max_length,
char fill
) {
DBUG_ENTER("spider_string::fill" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.fill(max_length, fill);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
void spider_string::strip_sp()
{
DBUG_ENTER("spider_string::strip_sp" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.strip_sp();
DBUG_VOID_RETURN;
}
uint32 spider_string::numchars()
{
DBUG_ENTER("spider_string::numchars" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.numchars());
}
int spider_string::charpos(
int i,
uint32 offset
) {
DBUG_ENTER("spider_string::charpos" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.charpos(i, offset));
}
int spider_string::reserve(
uint32 space_needed
) {
DBUG_ENTER("spider_string::reserve" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
int res = str.reserve(space_needed);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
int spider_string::reserve(
uint32 space_needed,
uint32 grow_by
) {
DBUG_ENTER("spider_string::reserve" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
int res = str.reserve(space_needed, grow_by);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
void spider_string::q_append(
const char c
) {
DBUG_ENTER("spider_string::q_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.q_append(c);
DBUG_VOID_RETURN;
}
void spider_string::q_append(
const uint32 n
) {
DBUG_ENTER("spider_string::q_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.q_append(n);
DBUG_VOID_RETURN;
}
void spider_string::q_append(
double d
) {
DBUG_ENTER("spider_string::q_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.q_append(d);
DBUG_VOID_RETURN;
}
void spider_string::q_append(
double *d
) {
DBUG_ENTER("spider_string::q_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.q_append(d);
DBUG_VOID_RETURN;
}
void spider_string::q_append(
const char *data,
uint32 data_len
) {
DBUG_ENTER("spider_string::q_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(str.alloced_length() >= str.length() + data_len);
str.q_append(data, data_len);
DBUG_VOID_RETURN;
}
void spider_string::write_at_position(
int position,
uint32 value
) {
DBUG_ENTER("spider_string::write_at_position" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.write_at_position(position, value);
DBUG_VOID_RETURN;
}
void spider_string::qs_append(
const char *str,
uint32 len
) {
DBUG_ENTER("spider_string::qs_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
this ->str.qs_append(str, len);
DBUG_VOID_RETURN;
}
void spider_string::qs_append(
double d
) {
DBUG_ENTER("spider_string::qs_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.qs_append(d);
DBUG_VOID_RETURN;
}
void spider_string::qs_append(
double *d
) {
DBUG_ENTER("spider_string::qs_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.qs_append(d);
DBUG_VOID_RETURN;
}
void spider_string::qs_append(
const char c
) {
DBUG_ENTER("spider_string::qs_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.qs_append(c);
DBUG_VOID_RETURN;
}
void spider_string::qs_append(
int i
) {
DBUG_ENTER("spider_string::qs_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.qs_append(i);
DBUG_VOID_RETURN;
}
void spider_string::qs_append(
uint i
) {
DBUG_ENTER("spider_string::qs_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
str.qs_append(i);
DBUG_VOID_RETURN;
}
char *spider_string::prep_append(
uint32 arg_length,
uint32 step_alloc
) {
DBUG_ENTER("spider_string::prep_append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
char *res = str.prep_append(arg_length, step_alloc);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append(
const char *s,
uint32 arg_length,
uint32 step_alloc
) {
DBUG_ENTER("spider_string::append" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
bool res = str.append(s, arg_length, step_alloc);
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
void spider_string::append_escape_string(
const char *st,
uint len
) {
my_bool overflow;
DBUG_ENTER("spider_string::append_escape_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str.length(str.length() + escape_string_for_mysql(
str.charset(), (char *) str.ptr() + str.length(), 0 , st, len,
&overflow));
DBUG_VOID_RETURN;
}
void spider_string::append_escape_string(
const char *st,
uint len,
CHARSET_INFO *cs
) {
my_bool overflow;
DBUG_ENTER("spider_string::append_escape_string" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str.length(str.length() + escape_string_for_mysql(
cs, (char *) str.ptr() + str.length(), 0 , st, len, &overflow));
DBUG_VOID_RETURN;
}
bool spider_string::append_for_single_quote(
const char *st,
uint len
) {
DBUG_ENTER("spider_string::append_for_single_quote" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
#ifdef SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
bool res = str.append_for_single_quote(st, len);
#else
String ststr(st, len, str.charset());
bool res = append_escaped(&str, &ststr);
#endif
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append_for_single_quote(
const String *s
) {
DBUG_ENTER("spider_string::append_for_single_quote" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
#ifdef SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
bool res = str.append_for_single_quote(s);
#else
bool res = append_escaped(&str, (String *) s);
#endif
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
bool spider_string::append_for_single_quote(
const char *st
) {
DBUG_ENTER("spider_string::append_for_single_quote" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
#ifdef SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
bool res = str.append_for_single_quote(st, strlen(st));
#else
String ststr(st, str.charset());
bool res = append_escaped(&str, &ststr);
#endif
SPIDER_STRING_CALC_MEM;
DBUG_RETURN(res);
}
void spider_string::swap(
spider_string &s
) {
DBUG_ENTER("spider_string::swap" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str.swap(s.str);
SPIDER_STRING_CALC_MEM;
DBUG_VOID_RETURN;
}
bool spider_string::uses_buffer_owned_by(
const String *s
) const
{
DBUG_ENTER("spider_string::uses_buffer_owned_by" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.uses_buffer_owned_by(s));
}
bool spider_string::is_ascii() const
{
DBUG_ENTER("spider_string::is_ascii" );
DBUG_PRINT("info" ,("spider this=%p" , this ));
DBUG_RETURN(str.is_ascii());
}
Messung V0.5 in Prozent C=100 H=99 G=99
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.8Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-08)
¤
*Bot Zugriff