~drizzle-trunk/drizzle/development

390.1.2 by Monty Taylor
Fixed copyright headers in drizzled/
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; version 2 of the License.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License
16
 *  along with this program; if not, write to the Free Software
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 */
1 by brian
clean slate
19
1122.2.10 by Monty Taylor
Fixed all of the include guards.
20
#ifndef DRIZZLED_SQL_STRING_H
21
#define DRIZZLED_SQL_STRING_H
243.1.5 by Jay Pipes
* Pulled the remainder of the log and parse stuff out into
22
1 by brian
clean slate
23
/* This file is originally from the mysql distribution. Coded by monty */
24
543 by Monty Taylor
Renamed drizzle_common again. Removed sql_common. (empty)
25
#include <drizzled/common.h>
1241.9.51 by Monty Taylor
More mysys stuff out of headers.
26
#include <cassert>
27
#include <cstdlib>
28
#include <cstring>
1271.2.4 by Tim Penhey
Add some standard converstion functions.
29
#include <string>
390.1.6 by Monty Taylor
Oh dear god the changes. The changes. I'd tell you what they are, but I'd just be making stuff up. Suffice it to day it's mostly all around splitting files in libdrizzle into different files and removing interdepends. And whatever else I happened to see...
30
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
31
#ifndef NOT_FIXED_DEC
32
#define NOT_FIXED_DEC			(uint8_t)31
33
#endif
34
35
namespace drizzled
36
{
37
1 by brian
clean slate
38
class String;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
39
1241.9.12 by Monty Taylor
Trims more out of server_includes.h.
40
extern String my_empty_string;
41
extern const String my_null_string;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
42
namespace memory { class Root; }
1241.9.51 by Monty Taylor
More mysys stuff out of headers.
43
typedef struct charset_info_st CHARSET_INFO;
1241.9.12 by Monty Taylor
Trims more out of server_includes.h.
44
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
45
std::string String_to_std_string(String const& s);
46
String* set_String_from_std_string(String* s, std::string const& cs);
47
48
int sortcmp(const String *a,const String *b, const CHARSET_INFO * const cs);
49
int stringcmp(const String *a,const String *b);
50
String *copy_if_not_alloced(String *a,String *b,uint32_t arg_length);
51
uint32_t well_formed_copy_nchars(const CHARSET_INFO * const to_cs,
52
                                 char *to, uint32_t to_length,
53
                                 const CHARSET_INFO * const from_cs,
54
                                 const char *from, uint32_t from_length,
55
                                 uint32_t nchars,
56
                                 const char **well_formed_error_pos,
57
                                 const char **cannot_convert_error_pos,
58
                                 const char **from_end_pos);
59
1 by brian
clean slate
60
61
class String
62
{
511.2.4 by Monty Taylor
Fixed warnings before we got to sql_yacc.
63
  char *Ptr;
205 by Brian Aker
uint32 -> uin32_t
64
  uint32_t str_length,Alloced_length;
1 by brian
clean slate
65
  bool alloced;
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
66
  const CHARSET_INFO *str_charset;
794 by Brian Aker
Refactor append_identifier and remove dead OPTION_QUOTE_SHOW_CREATE option
67
1 by brian
clean slate
68
public:
1241.16.2 by Monty Taylor
Cleaned effc++ warnings from sql_string.
69
  String();
70
  String(uint32_t length_arg);
71
  String(const char *str, const CHARSET_INFO * const cs);
1241.9.51 by Monty Taylor
More mysys stuff out of headers.
72
  String(const char *str, uint32_t len, const CHARSET_INFO * const cs);
73
  String(char *str, uint32_t len, const CHARSET_INFO * const cs);
1241.16.2 by Monty Taylor
Cleaned effc++ warnings from sql_string.
74
  String(const String &str);
75
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
76
  static void *operator new(size_t size, memory::Root *mem_root);
1241.16.2 by Monty Taylor
Cleaned effc++ warnings from sql_string.
77
  static void operator delete(void *, size_t)
78
  { }
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
79
  static void operator delete(void *, memory::Root *)
1241.16.2 by Monty Taylor
Cleaned effc++ warnings from sql_string.
80
  { }
1022.2.29 by Monty Taylor
Fixed some no-inline warnings.
81
  ~String();
1 by brian
clean slate
82
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
83
  inline void set_charset(const CHARSET_INFO * const charset_arg)
1 by brian
clean slate
84
  { str_charset= charset_arg; }
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
85
  inline const CHARSET_INFO *charset() const { return str_charset; }
205 by Brian Aker
uint32 -> uin32_t
86
  inline uint32_t length() const { return str_length;}
87
  inline uint32_t alloced_length() const { return Alloced_length;}
511.2.6 by Monty Taylor
drizzled/ and storage/archive/ are clean.
88
  inline char& operator [] (uint32_t i) const { return Ptr[i]; }
205 by Brian Aker
uint32 -> uin32_t
89
  inline void length(uint32_t len) { str_length=len ; }
1 by brian
clean slate
90
  inline bool is_empty() { return (str_length == 0); }
91
  inline void mark_as_const() { Alloced_length= 0;}
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
92
  inline char *ptr() { return Ptr; }
1 by brian
clean slate
93
  inline const char *ptr() const { return Ptr; }
94
  inline char *c_ptr()
95
  {
1022.5.1 by nlw
Fix buffer overrun in string::c_ptr, now handles all cases properly
96
    if (str_length == Alloced_length)
1 by brian
clean slate
97
      (void) realloc(str_length);
1022.5.1 by nlw
Fix buffer overrun in string::c_ptr, now handles all cases properly
98
    else
99
      Ptr[str_length]= 0;
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
100
1 by brian
clean slate
101
    return Ptr;
102
  }
103
  inline char *c_ptr_quick()
104
  {
105
    if (Ptr && str_length < Alloced_length)
106
      Ptr[str_length]=0;
107
    return Ptr;
108
  }
109
  inline char *c_ptr_safe()
110
  {
111
    if (Ptr && str_length < Alloced_length)
112
      Ptr[str_length]=0;
113
    else
114
      (void) realloc(str_length);
115
    return Ptr;
116
  }
1273.13.38 by Brian Aker
Add in new show work.
117
  inline char *c_str()
118
  {
119
    if (Ptr && str_length < Alloced_length)
120
      Ptr[str_length]=0;
121
    else
122
      (void) realloc(str_length);
123
    return Ptr;
124
  }
794 by Brian Aker
Refactor append_identifier and remove dead OPTION_QUOTE_SHOW_CREATE option
125
  void append_identifier(const char *name, uint32_t length);
1 by brian
clean slate
126
205 by Brian Aker
uint32 -> uin32_t
127
  void set(String &str,uint32_t offset,uint32_t arg_length)
1 by brian
clean slate
128
  {
51.1.75 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
129
    assert(&str != this);
1 by brian
clean slate
130
    free();
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
131
    Ptr= str.ptr()+offset; str_length=arg_length; alloced=0;
1 by brian
clean slate
132
    if (str.Alloced_length)
133
      Alloced_length=str.Alloced_length-offset;
134
    else
135
      Alloced_length=0;
136
    str_charset=str.str_charset;
137
  }
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
138
  inline void set(char *str,uint32_t arg_length, const CHARSET_INFO * const cs)
1 by brian
clean slate
139
  {
140
    free();
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
141
    Ptr= str; str_length=Alloced_length=arg_length ; alloced=0;
1 by brian
clean slate
142
    str_charset=cs;
143
  }
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
144
  inline void set(const char *str,uint32_t arg_length, const CHARSET_INFO * const cs)
1 by brian
clean slate
145
  {
146
    free();
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
147
    Ptr= const_cast<char*>(str);
148
    str_length=arg_length; Alloced_length=0 ; alloced=0;
1 by brian
clean slate
149
    str_charset=cs;
150
  }
205 by Brian Aker
uint32 -> uin32_t
151
  bool set_ascii(const char *str, uint32_t arg_length);
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
152
  inline void set_quick(char *str,uint32_t arg_length, const CHARSET_INFO * const cs)
1 by brian
clean slate
153
  {
154
    if (!alloced)
155
    {
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
156
      Ptr= str; str_length= Alloced_length= arg_length;
1 by brian
clean slate
157
    }
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
158
    str_charset= cs;
1 by brian
clean slate
159
  }
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
160
  bool set_int(int64_t num, bool unsigned_flag, const CHARSET_INFO * const cs);
161
  bool set(int64_t num, const CHARSET_INFO * const cs)
1 by brian
clean slate
162
  { return set_int(num, false, cs); }
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
163
  bool set(uint64_t num, const CHARSET_INFO * const cs)
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
164
  { return set_int(static_cast<int64_t>(num), true, cs); }
482 by Brian Aker
Remove uint.
165
  bool set_real(double num,uint32_t decimals, const CHARSET_INFO * const cs);
1 by brian
clean slate
166
167
  /*
168
    PMG 2004.11.12
169
    This is a method that works the same as perl's "chop". It simply
170
    drops the last character of a string. This is useful in the case
171
    of the federated storage handler where I'm building a unknown
172
    number, list of values and fields to be used in a sql insert
173
    statement to be run on the remote server, and have a comma after each.
174
    When the list is complete, I "chop" off the trailing comma
175
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
176
    ex.
177
      String stringobj;
1 by brian
clean slate
178
      stringobj.append("VALUES ('foo', 'fi', 'fo',");
179
      stringobj.chop();
180
      stringobj.append(")");
181
182
    In this case, the value of string was:
183
184
    VALUES ('foo', 'fi', 'fo',
185
    VALUES ('foo', 'fi', 'fo'
186
    VALUES ('foo', 'fi', 'fo')
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
187
1 by brian
clean slate
188
  */
189
  inline void chop()
190
  {
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
191
    Ptr[str_length--]= '\0';
1 by brian
clean slate
192
  }
193
194
  inline void free()
195
  {
196
    if (alloced)
197
    {
198
      alloced=0;
199
      Alloced_length=0;
477 by Monty Taylor
Removed my_free(). It turns out that it had been def'd to ignore the flags passed to it in the second arg anyway. Gotta love that.
200
      ::free(Ptr);
1 by brian
clean slate
201
      Ptr=0;
202
      str_length=0;				/* Safety */
203
    }
204
  }
205 by Brian Aker
uint32 -> uin32_t
205
  inline bool alloc(uint32_t arg_length)
1 by brian
clean slate
206
  {
207
    if (arg_length < Alloced_length)
208
      return 0;
209
    return real_alloc(arg_length);
210
  }
205 by Brian Aker
uint32 -> uin32_t
211
  bool real_alloc(uint32_t arg_length);			// Empties old string
212
  bool realloc(uint32_t arg_length);
213
  inline void shrink(uint32_t arg_length)		// Shrink buffer
1 by brian
clean slate
214
  {
215
    if (arg_length < Alloced_length)
216
    {
217
      char *new_ptr;
1241.3.4 by Trond Norbye
Cleanup: use C++ style casting, init-list and virtual destructors
218
      if (!(new_ptr= reinterpret_cast<char*>(::realloc(Ptr,arg_length))))
1 by brian
clean slate
219
      {
220
	Alloced_length = 0;
221
	real_alloc(arg_length);
222
      }
223
      else
224
      {
225
	Ptr=new_ptr;
226
	Alloced_length=arg_length;
227
      }
228
    }
229
  }
230
  bool is_alloced() { return alloced; }
231
  inline String& operator = (const String &s)
232
  {
233
    if (&s != this)
234
    {
235
      /*
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
236
        It is forbidden to do assignments like
1 by brian
clean slate
237
        some_string = substring_of_that_string
238
       */
51.1.75 by Jay Pipes
Standardized TRUE/FALSE, removed/replaced DBUG symbols
239
      assert(!s.uses_buffer_owned_by(this));
1 by brian
clean slate
240
      free();
241
      Ptr=s.Ptr ; str_length=s.str_length ; Alloced_length=s.Alloced_length;
242
      alloced=0;
243
    }
244
    return *this;
245
  }
246
247
  bool copy();					// Alloc string if not alloced
248
  bool copy(const String &s);			// Allocate new string
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
249
  bool copy(const char *s,uint32_t arg_length, const CHARSET_INFO * const cs);	// Allocate new string
205 by Brian Aker
uint32 -> uin32_t
250
  static bool needs_conversion(uint32_t arg_length,
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
251
  			       const CHARSET_INFO * const cs_from, const CHARSET_INFO * const cs_to,
205 by Brian Aker
uint32 -> uin32_t
252
			       uint32_t *offset);
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
253
  bool set_or_copy_aligned(const char *s, uint32_t arg_length, const CHARSET_INFO * const cs);
254
  bool copy(const char*s,uint32_t arg_length, const CHARSET_INFO * const csfrom,
482 by Brian Aker
Remove uint.
255
	    const CHARSET_INFO * const csto, uint32_t *errors);
1 by brian
clean slate
256
  bool append(const String &s);
257
  bool append(const char *s);
205 by Brian Aker
uint32 -> uin32_t
258
  bool append(const char *s,uint32_t arg_length);
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
259
  bool append(const char *s,uint32_t arg_length, const CHARSET_INFO * const cs);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
260
  bool append_with_prefill(const char *s, uint32_t arg_length,
205 by Brian Aker
uint32 -> uin32_t
261
			   uint32_t full_length, char fill_char);
262
  int strstr(const String &search,uint32_t offset=0); // Returns offset to substring or -1
263
  int strrstr(const String &search,uint32_t offset=0); // Returns offset to substring or -1
264
  bool replace(uint32_t offset,uint32_t arg_length,const char *to,uint32_t length);
265
  bool replace(uint32_t offset,uint32_t arg_length,const String &to);
1 by brian
clean slate
266
  inline bool append(char chr)
267
  {
268
    if (str_length < Alloced_length)
269
    {
270
      Ptr[str_length++]=chr;
271
    }
272
    else
273
    {
274
      if (realloc(str_length+1))
275
	return 1;
276
      Ptr[str_length++]=chr;
277
    }
278
    return 0;
279
  }
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
280
  friend int sortcmp(const String *a,const String *b, const CHARSET_INFO * const cs);
1 by brian
clean slate
281
  friend int stringcmp(const String *a,const String *b);
205 by Brian Aker
uint32 -> uin32_t
282
  friend String *copy_if_not_alloced(String *a,String *b,uint32_t arg_length);
283
  uint32_t numchars();
284
  int charpos(int i,uint32_t offset=0);
1 by brian
clean slate
285
205 by Brian Aker
uint32 -> uin32_t
286
  int reserve(uint32_t space_needed)
1 by brian
clean slate
287
  {
288
    return realloc(str_length + space_needed);
289
  }
205 by Brian Aker
uint32 -> uin32_t
290
  int reserve(uint32_t space_needed, uint32_t grow_by);
1 by brian
clean slate
291
292
  /*
293
    The following append operations do NOT check alloced memory
294
    q_*** methods writes values of parameters itself
295
    qs_*** methods writes string representation of value
296
  */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
297
  void q_append(const char c);
298
  void q_append(const uint32_t n);
299
  void q_append(double d);
300
  void q_append(double *d);
301
  void q_append(const char *data, uint32_t data_len);
302
  void write_at_position(int position, uint32_t value);
1 by brian
clean slate
303
304
  /* Inline (general) functions used by the protocol functions */
305
205 by Brian Aker
uint32 -> uin32_t
306
  inline char *prep_append(uint32_t arg_length, uint32_t step_alloc)
1 by brian
clean slate
307
  {
205 by Brian Aker
uint32 -> uin32_t
308
    uint32_t new_length= arg_length + str_length;
1 by brian
clean slate
309
    if (new_length > Alloced_length)
310
    {
311
      if (realloc(new_length + step_alloc))
312
        return 0;
313
    }
205 by Brian Aker
uint32 -> uin32_t
314
    uint32_t old_length= str_length;
1 by brian
clean slate
315
    str_length+= arg_length;
316
    return Ptr+ old_length;			/* Area to use */
317
  }
318
205 by Brian Aker
uint32 -> uin32_t
319
  inline bool append(const char *s, uint32_t arg_length, uint32_t step_alloc)
1 by brian
clean slate
320
  {
205 by Brian Aker
uint32 -> uin32_t
321
    uint32_t new_length= arg_length + str_length;
1 by brian
clean slate
322
    if (new_length > Alloced_length && realloc(new_length + step_alloc))
163 by Brian Aker
Merge Monty's code.
323
      return true;
1 by brian
clean slate
324
    memcpy(Ptr+str_length, s, arg_length);
325
    str_length+= arg_length;
163 by Brian Aker
Merge Monty's code.
326
    return false;
1 by brian
clean slate
327
  }
328
  void print(String *print);
329
330
  /* Swap two string objects. Efficient way to exchange data without memcpy. */
331
  void swap(String &s);
332
333
  inline bool uses_buffer_owned_by(const String *s) const
334
  {
335
    return (s->alloced && Ptr >= s->Ptr && Ptr < s->Ptr + s->str_length);
336
  }
337
};
338
1241.9.51 by Monty Taylor
More mysys stuff out of headers.
339
bool check_if_only_end_space(const CHARSET_INFO * const cs, char *str,
340
                             char *end);
1 by brian
clean slate
341
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
342
} /* namespace drizzled */
343
344
bool operator==(const drizzled::String &s1, const drizzled::String &s2);
345
bool operator!=(const drizzled::String &s1, const drizzled::String &s2);
346
1 by brian
clean slate
347
1122.2.10 by Monty Taylor
Fixed all of the include guards.
348
#endif /* DRIZZLED_SQL_STRING_H */