23
23
/* This file is originally from the mysql distribution. Coded by monty */
27
#define NOT_FIXED_DEC (uint8_t)31
25
30
#include <drizzled/common.h>
32
#include <drizzled/visibility.h>
35
#define NOT_FIXED_DEC (uint8_t)31
43
extern DRIZZLED_API String my_empty_string;
37
extern String my_empty_string;
44
38
extern const String my_null_string;
45
namespace memory { class Root; }
39
namespace drizzled { namespace memory { class Root; } }
46
40
typedef struct charset_info_st CHARSET_INFO;
48
DRIZZLED_API std::string String_to_std_string(String const& s);
49
DRIZZLED_API String* set_String_from_std_string(String* s, std::string const& cs);
51
int sortcmp(const String *a,const String *b, const CHARSET_INFO * const cs);
52
int stringcmp(const String *a,const String *b);
53
String *copy_if_not_alloced(String *a,String *b,size_t arg_length);
54
size_t well_formed_copy_nchars(const CHARSET_INFO * const to_cs,
55
char *to, size_t to_length,
56
const CHARSET_INFO * const from_cs,
57
const char *from, size_t from_length,
59
const char **well_formed_error_pos,
60
const char **cannot_convert_error_pos,
61
const char **from_end_pos);
64
class DRIZZLED_API String
42
#if defined(__cplusplus)
46
int sortcmp(const String *a,const String *b, const CHARSET_INFO * const cs);
47
int stringcmp(const String *a,const String *b);
48
String *copy_if_not_alloced(String *a,String *b,uint32_t arg_length);
49
uint32_t well_formed_copy_nchars(const CHARSET_INFO * const to_cs,
50
char *to, uint32_t to_length,
51
const CHARSET_INFO * const from_cs,
52
const char *from, uint32_t from_length,
54
const char **well_formed_error_pos,
55
const char **cannot_convert_error_pos,
56
const char **from_end_pos);
58
#if defined(__cplusplus)
67
size_t str_length,Alloced_length;
65
uint32_t str_length,Alloced_length;
69
67
const CHARSET_INFO *str_charset;
73
String(size_t length_arg);
71
String(uint32_t length_arg);
74
72
String(const char *str, const CHARSET_INFO * const cs);
75
String(const char *str, size_t len, const CHARSET_INFO * const cs);
76
String(char *str, size_t len, const CHARSET_INFO * const cs);
73
String(const char *str, uint32_t len, const CHARSET_INFO * const cs);
74
String(char *str, uint32_t len, const CHARSET_INFO * const cs);
77
75
String(const String &str);
79
static void *operator new(size_t size, memory::Root *mem_root);
77
static void *operator new(size_t size, drizzled::memory::Root *mem_root);
80
78
static void operator delete(void *, size_t)
82
static void operator delete(void *, memory::Root *)
80
static void operator delete(void *, drizzled::memory::Root *)
86
84
inline void set_charset(const CHARSET_INFO * const charset_arg)
87
85
{ str_charset= charset_arg; }
88
86
inline const CHARSET_INFO *charset() const { return str_charset; }
89
inline size_t length() const { return str_length;}
90
inline size_t alloced_length() const { return Alloced_length;}
91
inline char& operator [] (size_t i) const { return Ptr[i]; }
92
inline void length(size_t len) { str_length=len ; }
87
inline uint32_t length() const { return str_length;}
88
inline uint32_t alloced_length() const { return Alloced_length;}
89
inline char& operator [] (uint32_t i) const { return Ptr[i]; }
90
inline void length(uint32_t len) { str_length=len ; }
93
91
inline bool is_empty() { return (str_length == 0); }
94
92
inline void mark_as_const() { Alloced_length= 0;}
95
93
inline char *ptr() { return Ptr; }
138
128
Alloced_length=0;
139
129
str_charset=str.str_charset;
141
inline void set(char *str,size_t arg_length, const CHARSET_INFO * const cs)
131
inline void set(char *str,uint32_t arg_length, const CHARSET_INFO * const cs)
144
134
Ptr= str; str_length=Alloced_length=arg_length ; alloced=0;
147
inline void set(const char *str,size_t arg_length, const CHARSET_INFO * const cs)
137
inline void set(const char *str,uint32_t arg_length, const CHARSET_INFO * const cs)
150
140
Ptr= const_cast<char*>(str);
151
141
str_length=arg_length; Alloced_length=0 ; alloced=0;
154
bool set_ascii(const char *str, size_t arg_length);
155
inline void set_quick(char *str,size_t arg_length, const CHARSET_INFO * const cs)
144
bool set_ascii(const char *str, uint32_t arg_length);
145
inline void set_quick(char *str,uint32_t arg_length, const CHARSET_INFO * const cs)
205
195
str_length=0; /* Safety */
208
inline bool alloc(size_t arg_length)
198
inline bool alloc(uint32_t arg_length)
210
200
if (arg_length < Alloced_length)
212
202
return real_alloc(arg_length);
214
bool real_alloc(size_t arg_length); // Empties old string
215
bool realloc(size_t arg_length);
216
inline void shrink(size_t arg_length) // Shrink buffer
204
bool real_alloc(uint32_t arg_length); // Empties old string
205
bool realloc(uint32_t arg_length);
206
inline void shrink(uint32_t arg_length) // Shrink buffer
218
208
if (arg_length < Alloced_length)
221
211
if (!(new_ptr= reinterpret_cast<char*>(::realloc(Ptr,arg_length))))
224
real_alloc(arg_length);
214
real_alloc(arg_length);
229
Alloced_length=arg_length;
219
Alloced_length=arg_length;
250
240
bool copy(); // Alloc string if not alloced
251
241
bool copy(const String &s); // Allocate new string
252
bool copy(const std::string&, const CHARSET_INFO * const cs); // Allocate new string
253
bool copy(const char *s,size_t arg_length, const CHARSET_INFO * const cs); // Allocate new string
254
static bool needs_conversion(size_t arg_length,
242
bool copy(const char *s,uint32_t arg_length, const CHARSET_INFO * const cs); // Allocate new string
243
static bool needs_conversion(uint32_t arg_length,
255
244
const CHARSET_INFO * const cs_from, const CHARSET_INFO * const cs_to,
257
bool set_or_copy_aligned(const char *s, size_t arg_length, const CHARSET_INFO * const cs);
258
bool copy(const char*s,size_t arg_length, const CHARSET_INFO * const csfrom,
259
const CHARSET_INFO * const csto, size_t *errors);
246
bool set_or_copy_aligned(const char *s, uint32_t arg_length, const CHARSET_INFO * const cs);
247
bool copy(const char*s,uint32_t arg_length, const CHARSET_INFO * const csfrom,
248
const CHARSET_INFO * const csto, uint32_t *errors);
260
249
bool append(const String &s);
261
250
bool append(const char *s);
262
bool append(const char *s,size_t arg_length);
263
bool append(const char *s,size_t arg_length, const CHARSET_INFO * const cs);
264
bool append_with_prefill(const char *s, size_t arg_length,
265
size_t full_length, char fill_char);
266
int strstr(const String &search,size_t offset=0); // Returns offset to substring or -1
267
int strrstr(const String &search,size_t offset=0); // Returns offset to substring or -1
268
bool replace(size_t offset,size_t arg_length,const char *to,size_t length);
269
bool replace(size_t offset,size_t arg_length,const String &to);
251
bool append(const char *s,uint32_t arg_length);
252
bool append(const char *s,uint32_t arg_length, const CHARSET_INFO * const cs);
253
bool append_with_prefill(const char *s, uint32_t arg_length,
254
uint32_t full_length, char fill_char);
255
int strstr(const String &search,uint32_t offset=0); // Returns offset to substring or -1
256
int strrstr(const String &search,uint32_t offset=0); // Returns offset to substring or -1
257
bool replace(uint32_t offset,uint32_t arg_length,const char *to,uint32_t length);
258
bool replace(uint32_t offset,uint32_t arg_length,const String &to);
270
259
inline bool append(char chr)
272
261
if (str_length < Alloced_length)
278
267
if (realloc(str_length+1))
280
269
Ptr[str_length++]=chr;
284
273
friend int sortcmp(const String *a,const String *b, const CHARSET_INFO * const cs);
285
274
friend int stringcmp(const String *a,const String *b);
286
friend String *copy_if_not_alloced(String *a,String *b,size_t arg_length);
288
int charpos(int i,size_t offset=0);
275
friend String *copy_if_not_alloced(String *a,String *b,uint32_t arg_length);
277
int charpos(int i,uint32_t offset=0);
290
int reserve(size_t space_needed)
279
int reserve(uint32_t space_needed)
292
281
return realloc(str_length + space_needed);
294
int reserve(size_t space_needed, size_t grow_by);
283
int reserve(uint32_t space_needed, uint32_t grow_by);
297
286
The following append operations do NOT check alloced memory
298
287
q_*** methods writes values of parameters itself
299
288
qs_*** methods writes string representation of value
301
void q_append(const char c);
302
void q_append(const size_t n);
303
void q_append(double d);
304
void q_append(double *d);
305
void q_append(const char *data, size_t data_len);
306
void write_at_position(int position, size_t value);
290
void q_append(const char c)
292
Ptr[str_length++] = c;
294
void q_append(const uint32_t n)
296
int4store(Ptr + str_length, n);
299
void q_append(double d)
301
float8store(Ptr + str_length, d);
304
void q_append(double *d)
306
float8store(Ptr + str_length, *d);
309
void q_append(const char *data, uint32_t data_len)
311
memcpy(Ptr + str_length, data, data_len);
312
str_length += data_len;
315
void write_at_position(int position, uint32_t value)
317
int4store(Ptr + position,value);
308
320
/* Inline (general) functions used by the protocol functions */
310
inline char *prep_append(size_t arg_length, size_t step_alloc)
322
inline char *prep_append(uint32_t arg_length, uint32_t step_alloc)
312
size_t new_length= arg_length + str_length;
324
uint32_t new_length= arg_length + str_length;
313
325
if (new_length > Alloced_length)
315
327
if (realloc(new_length + step_alloc))
318
size_t old_length= str_length;
330
uint32_t old_length= str_length;
319
331
str_length+= arg_length;
320
332
return Ptr+ old_length; /* Area to use */
323
inline bool append(const char *s, size_t arg_length, size_t step_alloc)
335
inline bool append(const char *s, uint32_t arg_length, uint32_t step_alloc)
325
size_t new_length= arg_length + str_length;
337
uint32_t new_length= arg_length + str_length;
326
338
if (new_length > Alloced_length && realloc(new_length + step_alloc))
328
340
memcpy(Ptr+str_length, s, arg_length);