~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field/str.cc

  • Committer: Eric Day
  • Date: 2009-11-10 21:50:22 UTC
  • mto: This revision was merged to the branch mainline in revision 1218.
  • Revision ID: eday@oddments.org-20091110215022-0b2nqmurv7b2l6wo
Duplicated oldlibdrizzle module, one for Drizzle protocol and one for MySQL, per Brian's request from merge proposal. Port options are now --drizzle-protocol-port and --mysql-protocol-port.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 */
20
20
 
21
21
 
22
 
#include "config.h"
 
22
#include <drizzled/server_includes.h>
23
23
#include <drizzled/field/str.h>
24
24
#include <drizzled/error.h>
25
25
#include <drizzled/table.h>
26
26
#include <drizzled/session.h>
27
 
#include "drizzled/internal/m_string.h"
28
 
 
29
 
namespace drizzled
30
 
{
31
 
 
32
 
namespace internal
33
 
{
34
 
extern char _dig_vec_upper[];
35
 
}
 
27
 
36
28
 
37
29
Field_str::Field_str(unsigned char *ptr_arg,
38
30
                     uint32_t len_arg,
73
65
int
74
66
Field_str::report_if_important_data(const char *field_ptr, const char *end)
75
67
{
76
 
  if ((field_ptr < end) && getTable()->in_use->count_cuted_fields)
 
68
  if ((field_ptr < end) && table->in_use->count_cuted_fields)
77
69
  {
78
 
    set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
79
 
 
 
70
    if (test_if_important_data(field_charset, field_ptr, end))
 
71
    {
 
72
      if (table->in_use->abort_on_warning)
 
73
        set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
 
74
      else
 
75
        set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
 
76
    }
 
77
    else /* If we lost only spaces then produce a NOTE, not a WARNING */
 
78
      set_warning(DRIZZLE_ERROR::WARN_LEVEL_NOTE, ER_WARN_DATA_TRUNCATED, 1);
80
79
    return 2;
81
80
  }
82
81
  return 0;
134
133
 
135
134
  ASSERT_COLUMN_MARKED_FOR_WRITE;
136
135
 
137
 
  length= internal::my_gcvt(nr, internal::MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
 
136
  length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
138
137
  if (error)
139
138
  {
140
 
    if (getTable()->in_use->abort_on_warning)
 
139
    if (table->in_use->abort_on_warning)
141
140
      set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
142
141
    else
143
142
      set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
145
144
  return store(buff, length, charset());
146
145
}
147
146
 
 
147
/* If one of the fields is binary and the other one isn't return 1 else 0 */
 
148
 
 
149
bool Field_str::compare_str_field_flags(CreateField *new_field_ptr,
 
150
                                        uint32_t flag_arg)
 
151
{
 
152
  return (((new_field_ptr->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
 
153
          !(flag_arg & (BINCMP_FLAG | BINARY_FLAG))) ||
 
154
         (!(new_field_ptr->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
 
155
          (flag_arg & (BINCMP_FLAG | BINARY_FLAG))));
 
156
}
 
157
 
 
158
 
 
159
uint32_t Field_str::is_equal(CreateField *new_field_ptr)
 
160
{
 
161
  if (compare_str_field_flags(new_field_ptr, flags))
 
162
    return 0;
 
163
 
 
164
  return ((new_field_ptr->sql_type == real_type()) &&
 
165
          new_field_ptr->charset == field_charset &&
 
166
          new_field_ptr->length == max_display_length());
 
167
}
 
168
 
148
169
 
149
170
bool check_string_copy_error(Field_str *field,
150
171
                             const char *well_formed_error_pos,
183
204
    {
184
205
      *t++= '\\';
185
206
      *t++= 'x';
186
 
      *t++= internal::_dig_vec_upper[((unsigned char) *pos) >> 4];
187
 
      *t++= internal::_dig_vec_upper[((unsigned char) *pos) & 15];
 
207
      *t++= _dig_vec_upper[((unsigned char) *pos) >> 4];
 
208
      *t++= _dig_vec_upper[((unsigned char) *pos) & 15];
188
209
    }
189
210
  }
190
211
  if (end_orig > end)
194
215
    *t++= '.';
195
216
  }
196
217
  *t= '\0';
197
 
  push_warning_printf(field->getTable()->in_use,
198
 
                      field->getTable()->in_use->abort_on_warning ?
 
218
  push_warning_printf(field->table->in_use,
 
219
                      field->table->in_use->abort_on_warning ?
199
220
                      DRIZZLE_ERROR::WARN_LEVEL_ERROR :
200
221
                      DRIZZLE_ERROR::WARN_LEVEL_WARN,
201
222
                      ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
202
223
                      ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
203
224
                      "string", tmp, field->field_name,
204
 
                      (uint32_t) field->getTable()->in_use->row_count);
 
225
                      (uint32_t) field->table->in_use->row_count);
205
226
  return true;
206
227
}
207
228
 
210
231
  return field_length + (field_length > 255 ? 2 : 1);
211
232
}
212
233
 
213
 
} /* namespace drizzled */