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"
34
extern char _dig_vec_upper[];
37
Field_str::Field_str(unsigned char *ptr_arg,
39
unsigned char *null_ptr_arg,
40
unsigned char null_bit_arg,
41
const char *field_name_arg,
42
const CHARSET_INFO * const charset_arg)
43
:Field(ptr_arg, len_arg,
29
Field_str::Field_str(unsigned char *ptr_arg,uint32_t len_arg, unsigned char *null_ptr_arg,
30
unsigned char null_bit_arg, utype unireg_check_arg,
31
const char *field_name_arg, const CHARSET_INFO * const charset_arg)
32
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
33
unireg_check_arg, field_name_arg)
49
35
field_charset= charset_arg;
50
36
if (charset_arg->state & MY_CS_BINSORT)
52
38
field_derivation= DERIVATION_IMPLICIT;
56
Check if we lost any important data and send a truncation error/warning
59
Field_str::report_if_important_data()
60
ptr - Truncated rest of string
61
end - End of truncated string
64
0 - None was truncated (or we don't count cut fields)
65
2 - Some bytes was truncated
68
Check if we lost any important data (anything in a binary string,
69
or any non-space in others). If only trailing spaces was lost,
70
send a truncation note, otherwise send a truncation error.
74
Field_str::report_if_important_data(const char *field_ptr, const char *end)
76
if ((field_ptr < end) && getTable()->in_use->count_cuted_fields)
78
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
86
42
Decimal representation of Field_str.
105
int Field_str::store_decimal(const type::Decimal *d)
61
int Field_str::store_decimal(const my_decimal *d)
107
char buff[DECIMAL_MAX_STR_LENGTH+1];
108
String str(buff, sizeof(buff), &my_charset_bin);
109
class_decimal2string(d, 0, &str);
110
return store(str.ptr(), str.length(), str.charset());
64
/* TODO: use decimal2string? */
65
int err= warn_if_overflow(my_decimal2double(E_DEC_FATAL_ERROR &
66
~E_DEC_OVERFLOW, d, &val));
67
return err | store(val);
113
type::Decimal *Field_str::val_decimal(type::Decimal *decimal_value)
70
my_decimal *Field_str::val_decimal(my_decimal *decimal_value)
115
72
int64_t nr= val_int();
116
int2_class_decimal(E_DEC_FATAL_ERROR, nr, 0, decimal_value);
73
int2my_decimal(E_DEC_FATAL_ERROR, nr, 0, decimal_value);
117
74
return decimal_value;
135
ASSERT_COLUMN_MARKED_FOR_WRITE;
137
length= internal::my_gcvt(nr, internal::MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
92
length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
140
if (getTable()->getSession()->abortOnWarning())
95
if (table->in_use->abort_on_warning)
142
96
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
146
98
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
149
100
return store(buff, length, charset());
103
/* If one of the fields is binary and the other one isn't return 1 else 0 */
105
bool Field_str::compare_str_field_flags(Create_field *new_field, uint32_t flag_arg)
107
return (((new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
108
!(flag_arg & (BINCMP_FLAG | BINARY_FLAG))) ||
109
(!(new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
110
(flag_arg & (BINCMP_FLAG | BINARY_FLAG))));
114
uint32_t Field_str::is_equal(Create_field *new_field)
116
if (compare_str_field_flags(new_field, flags))
119
return ((new_field->sql_type == real_type()) &&
120
new_field->charset == field_charset &&
121
new_field->length == max_display_length());
153
125
bool check_string_copy_error(Field_str *field,
154
126
const char *well_formed_error_pos,
201
push_warning_printf(field->getTable()->in_use,
202
field->getTable()->in_use->abortOnWarning() ?
173
push_warning_printf(field->table->in_use,
174
field->table->in_use->abort_on_warning ?
203
175
DRIZZLE_ERROR::WARN_LEVEL_ERROR :
204
176
DRIZZLE_ERROR::WARN_LEVEL_WARN,
205
177
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
206
178
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
207
179
"string", tmp, field->field_name,
208
(uint32_t) field->getTable()->in_use->row_count);
180
(uint32_t) field->table->in_use->row_count);
212
uint32_t Field_str::max_data_length() const
214
return field_length + (field_length > 255 ? 2 : 1);
217
} /* namespace drizzled */