forked from StoneAtom/StoneDB
173 lines
5.7 KiB
C++
173 lines
5.7 KiB
C++
/* Copyright (c) 2012, 2021, Oracle and/or its affiliates.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License, version 2.0,
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is also distributed with certain software (including
|
|
but not limited to OpenSSL) that is licensed under separate terms,
|
|
as designated in a particular file or component or in included license
|
|
documentation. The authors of MySQL hereby grant you an additional
|
|
permission to link the program and your derivative works with the
|
|
separately licensed software that they have included with MySQL.
|
|
|
|
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, version 2.0, 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 St, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
|
|
|
|
/*
|
|
This file provide mysql_string service to plugins.
|
|
operations on mysql_string can be performed by plugins via these service
|
|
functions.
|
|
*/
|
|
|
|
#include <my_sys.h>
|
|
#include "string_service.h"
|
|
#include "mysql/service_mysql_string.h"
|
|
/* key_memory_string_iterator */
|
|
#include "mysqld.h"
|
|
PSI_memory_key key_memory_string_iterator;
|
|
|
|
/*
|
|
This service function converts the mysql_string to the character set
|
|
specified by charset_name parameter.
|
|
*/
|
|
extern "C"
|
|
int mysql_string_convert_to_char_ptr(mysql_string_handle string_handle,
|
|
const char *charset_name,
|
|
char *buffer,
|
|
unsigned int buffer_size,
|
|
int *error)
|
|
{
|
|
String *str= (String *) string_handle;
|
|
int len= (int)my_convert(buffer, buffer_size - 1, &my_charset_utf8_general_ci,
|
|
str->ptr(), str->length(), str->charset(),
|
|
(uint*) error);
|
|
buffer[len]= '\0';
|
|
return (len);
|
|
}
|
|
|
|
/*
|
|
This service function deallocates the mysql_string_handle allocated on
|
|
server and used in plugins.
|
|
*/
|
|
extern "C"
|
|
void mysql_string_free(mysql_string_handle string_handle)
|
|
{
|
|
String *str= (String *) string_handle;
|
|
str->mem_free();
|
|
delete [] str;
|
|
}
|
|
|
|
/*
|
|
This service function deallocates the mysql_string_iterator_handle
|
|
allocated on server and used in plugins.
|
|
*/
|
|
extern "C"
|
|
void mysql_string_iterator_free(mysql_string_iterator_handle iterator_handle)
|
|
{
|
|
my_free((string_iterator *) iterator_handle);
|
|
}
|
|
|
|
/* This service function allocate mysql_string_iterator_handle and return it */
|
|
extern "C"
|
|
mysql_string_iterator_handle mysql_string_get_iterator(mysql_string_handle
|
|
string_handle)
|
|
{
|
|
String *str= (String *) string_handle;
|
|
string_iterator *iterator= (string_iterator *) my_malloc(key_memory_string_iterator,
|
|
sizeof
|
|
(struct st_string_iterator), MYF(0));
|
|
iterator->iterator_str= str;
|
|
iterator->iterator_ptr= str->ptr();
|
|
iterator->ctype= 0;
|
|
return (iterator);
|
|
}
|
|
|
|
/* Provide service which returns the next mysql_string_iterator_handle */
|
|
extern "C"
|
|
int mysql_string_iterator_next(mysql_string_iterator_handle iterator_handle)
|
|
{
|
|
int char_len, char_type, tmp_len;
|
|
string_iterator *iterator= (string_iterator *) iterator_handle;
|
|
String *str= iterator->iterator_str;
|
|
const CHARSET_INFO *cs= str->charset();
|
|
char *end= (char*) str->ptr() + str->length();
|
|
if (iterator->iterator_ptr >= (const char*) end)
|
|
return (0);
|
|
char_len= (cs->cset->ctype(cs, &char_type, (uchar*) iterator->iterator_ptr,
|
|
(uchar*) end));
|
|
iterator->ctype= char_type;
|
|
tmp_len= (char_len > 0 ? char_len : (char_len < 0 ? -char_len : 1));
|
|
if(iterator->iterator_ptr+tmp_len > end)
|
|
return (0);
|
|
else
|
|
iterator->iterator_ptr+= tmp_len;
|
|
return (1);
|
|
}
|
|
|
|
/*
|
|
Provide service which calculate weather the current iterator_ptr points to
|
|
upper case character or not
|
|
*/
|
|
extern "C"
|
|
int mysql_string_iterator_isupper(mysql_string_iterator_handle iterator_handle)
|
|
{
|
|
string_iterator *iterator= (string_iterator *) iterator_handle;
|
|
return (iterator->ctype & _MY_U);
|
|
}
|
|
|
|
/*
|
|
Provide service which calculate weather the current iterator_ptr points to
|
|
lower case character or not
|
|
*/
|
|
extern "C"
|
|
int mysql_string_iterator_islower(mysql_string_iterator_handle iterator_handle)
|
|
{
|
|
string_iterator *iterator= (string_iterator *) iterator_handle;
|
|
return (iterator->ctype & _MY_L);
|
|
}
|
|
|
|
/*
|
|
Provide service which calculate weather the current iterator_ptr points to
|
|
digit or not
|
|
*/
|
|
extern "C"
|
|
int mysql_string_iterator_isdigit(mysql_string_iterator_handle iterator_handle)
|
|
{
|
|
string_iterator *iterator= (string_iterator *) iterator_handle;
|
|
return (iterator->ctype & _MY_NMR);
|
|
}
|
|
|
|
/*
|
|
This function provide plugin service to convert a String pointed by handle to
|
|
lower case. Conversion depends on the client character set info
|
|
*/
|
|
extern "C"
|
|
mysql_string_handle mysql_string_to_lowercase(mysql_string_handle string_handle)
|
|
{
|
|
String *str= (String *) string_handle;
|
|
String *res= new String[1];
|
|
const CHARSET_INFO *cs= str->charset();
|
|
if (cs->casedn_multiply == 1)
|
|
{
|
|
res->copy(*str);
|
|
my_casedn_str(cs, res->c_ptr_quick());
|
|
}
|
|
else
|
|
{
|
|
size_t len= str->length() * cs->casedn_multiply;
|
|
res->set_charset(cs);
|
|
res->alloc(len);
|
|
len= cs->cset->casedn(cs, (char*) str->ptr(), str->length(), (char *) res->ptr(), len);
|
|
res->length(len);
|
|
}
|
|
return (res);
|
|
}
|