mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Merge with alias as String
This commit is contained in:
@ -53,23 +53,24 @@ uint convert_to_printable(char *to, size_t to_len,
|
||||
class String
|
||||
{
|
||||
char *Ptr;
|
||||
uint32 str_length,Alloced_length;
|
||||
uint32 str_length,Alloced_length, extra_alloc;
|
||||
bool alloced;
|
||||
CHARSET_INFO *str_charset;
|
||||
public:
|
||||
String()
|
||||
{
|
||||
Ptr=0; str_length=Alloced_length=0; alloced=0;
|
||||
Ptr=0; str_length=Alloced_length=extra_alloc=0; alloced=0;
|
||||
str_charset= &my_charset_bin;
|
||||
}
|
||||
String(uint32 length_arg)
|
||||
{
|
||||
alloced=0; Alloced_length=0; (void) real_alloc(length_arg);
|
||||
alloced=0; Alloced_length= extra_alloc= 0; (void) real_alloc(length_arg);
|
||||
str_charset= &my_charset_bin;
|
||||
}
|
||||
String(const char *str, CHARSET_INFO *cs)
|
||||
{
|
||||
Ptr=(char*) str; str_length=(uint) strlen(str); Alloced_length=0; alloced=0;
|
||||
Ptr=(char*) str; str_length= (uint32) strlen(str);
|
||||
Alloced_length= extra_alloc= 0; alloced=0;
|
||||
str_charset=cs;
|
||||
}
|
||||
/*
|
||||
@ -79,18 +80,18 @@ public:
|
||||
*/
|
||||
String(const char *str,uint32 len, CHARSET_INFO *cs)
|
||||
{
|
||||
Ptr=(char*) str; str_length=len; Alloced_length=0; alloced=0;
|
||||
Ptr=(char*) str; str_length=len; Alloced_length= extra_alloc=0; alloced=0;
|
||||
str_charset=cs;
|
||||
}
|
||||
String(char *str,uint32 len, CHARSET_INFO *cs)
|
||||
{
|
||||
Ptr=(char*) str; Alloced_length=str_length=len; alloced=0;
|
||||
Ptr=(char*) str; Alloced_length=str_length=len; extra_alloc= 0; alloced=0;
|
||||
str_charset=cs;
|
||||
}
|
||||
String(const String &str)
|
||||
{
|
||||
Ptr=str.Ptr ; str_length=str.str_length ;
|
||||
Alloced_length=str.Alloced_length; alloced=0;
|
||||
Alloced_length=str.Alloced_length; extra_alloc= 0; alloced=0;
|
||||
str_charset=str.str_charset;
|
||||
}
|
||||
static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
|
||||
@ -110,8 +111,10 @@ public:
|
||||
inline CHARSET_INFO *charset() const { return str_charset; }
|
||||
inline uint32 length() const { return str_length;}
|
||||
inline uint32 alloced_length() const { return Alloced_length;}
|
||||
inline uint32 extra_allocation() const { return extra_alloc;}
|
||||
inline char& operator [] (uint32 i) const { return Ptr[i]; }
|
||||
inline void length(uint32 len) { str_length=len ; }
|
||||
inline void extra_allocation(uint32 len) { extra_alloc= len; }
|
||||
inline bool is_empty() const { return (str_length == 0); }
|
||||
inline void mark_as_const() { Alloced_length= 0;}
|
||||
inline const char *ptr() const { return Ptr; }
|
||||
@ -140,23 +143,21 @@ public:
|
||||
{
|
||||
DBUG_ASSERT(&str != this);
|
||||
free();
|
||||
Ptr=(char*) str.ptr()+offset; str_length=arg_length; alloced=0;
|
||||
Ptr=(char*) str.ptr()+offset; str_length=arg_length;
|
||||
if (str.Alloced_length)
|
||||
Alloced_length=str.Alloced_length-offset;
|
||||
else
|
||||
Alloced_length=0;
|
||||
str_charset=str.str_charset;
|
||||
}
|
||||
inline void set(char *str,uint32 arg_length, CHARSET_INFO *cs)
|
||||
{
|
||||
free();
|
||||
Ptr=(char*) str; str_length=Alloced_length=arg_length ; alloced=0;
|
||||
Ptr=(char*) str; str_length=Alloced_length=arg_length;
|
||||
str_charset=cs;
|
||||
}
|
||||
inline void set(const char *str,uint32 arg_length, CHARSET_INFO *cs)
|
||||
{
|
||||
free();
|
||||
Ptr=(char*) str; str_length=arg_length; Alloced_length=0 ; alloced=0;
|
||||
Ptr=(char*) str; str_length=arg_length;
|
||||
str_charset=cs;
|
||||
}
|
||||
bool set_ascii(const char *str, uint32 arg_length);
|
||||
@ -207,11 +208,11 @@ public:
|
||||
if (alloced)
|
||||
{
|
||||
alloced=0;
|
||||
Alloced_length=0;
|
||||
my_free(Ptr,MYF(0));
|
||||
Ptr=0;
|
||||
str_length=0; /* Safety */
|
||||
}
|
||||
Alloced_length= extra_alloc= 0;
|
||||
Ptr=0;
|
||||
str_length=0; /* Safety */
|
||||
}
|
||||
inline bool alloc(uint32 arg_length)
|
||||
{
|
||||
@ -221,9 +222,21 @@ public:
|
||||
}
|
||||
bool real_alloc(uint32 arg_length); // Empties old string
|
||||
bool realloc(uint32 arg_length);
|
||||
inline void shrink(uint32 arg_length) // Shrink buffer
|
||||
bool realloc_with_extra(uint32 arg_length)
|
||||
{
|
||||
if (extra_alloc < 4096)
|
||||
extra_alloc= extra_alloc*2+128;
|
||||
return realloc(arg_length + extra_alloc);
|
||||
}
|
||||
bool realloc_with_extra_if_needed(uint32 arg_length)
|
||||
{
|
||||
if (arg_length < Alloced_length)
|
||||
return 0;
|
||||
return realloc_with_extra(arg_length);
|
||||
}
|
||||
inline void shrink(uint32 arg_length) // Shrink buffer
|
||||
{
|
||||
if (ALIGN_SIZE(arg_length+1) < Alloced_length)
|
||||
{
|
||||
char *new_ptr;
|
||||
if (!(new_ptr=(char*) my_realloc(Ptr,arg_length,MYF(0))))
|
||||
@ -250,7 +263,6 @@ public:
|
||||
DBUG_ASSERT(!s.uses_buffer_owned_by(this));
|
||||
free();
|
||||
Ptr=s.Ptr ; str_length=s.str_length ; Alloced_length=s.Alloced_length;
|
||||
alloced=0;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@ -266,6 +278,14 @@ public:
|
||||
bool set_or_copy_aligned(const char *s, uint32 arg_length, CHARSET_INFO *cs);
|
||||
bool copy(const char*s,uint32 arg_length, CHARSET_INFO *csfrom,
|
||||
CHARSET_INFO *csto, uint *errors);
|
||||
void move(String &s)
|
||||
{
|
||||
free();
|
||||
Ptr=s.Ptr ; str_length=s.str_length ; Alloced_length=s.Alloced_length;
|
||||
extra_alloc= s.extra_alloc;
|
||||
alloced= s.alloced;
|
||||
s.alloced= 0;
|
||||
}
|
||||
bool append(const String &s);
|
||||
bool append(const char *s);
|
||||
bool append(const char *s,uint32 arg_length);
|
||||
@ -285,7 +305,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
if (realloc(str_length+1))
|
||||
if (realloc_with_extra(str_length + 1))
|
||||
return 1;
|
||||
Ptr[str_length++]=chr;
|
||||
}
|
||||
@ -296,6 +316,7 @@ public:
|
||||
friend int sortcmp(const String *a,const String *b, CHARSET_INFO *cs);
|
||||
friend int stringcmp(const String *a,const String *b);
|
||||
friend String *copy_if_not_alloced(String *a,String *b,uint32 arg_length);
|
||||
friend class Field;
|
||||
uint32 numchars();
|
||||
int charpos(int i,uint32 offset=0);
|
||||
|
||||
|
Reference in New Issue
Block a user