32
32
using namespace std;
40
35
/****************************************************************************
42
****************************************************************************/
44
int Int32::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
37
****************************************************************************/
39
int Field_long::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
45
ASSERT_COLUMN_MARKED_FOR_WRITE;
47
error= get_int(cs, from, len, &rnd, UINT32_MAX, INT32_MIN, INT32_MAX);
48
store_tmp= (long) rnd;
49
#ifdef WORDS_BIGENDIAN
50
if (table->s->db_low_byte_first)
50
ASSERT_COLUMN_MARKED_FOR_WRITE;
52
error= get_int(cs, from, len, &rnd, UINT32_MAX, INT32_MIN, INT32_MAX);
53
store_tmp= (long) rnd;
52
int4store(ptr, store_tmp);
54
56
longstore(ptr, store_tmp);
60
int Int32::store(double nr)
66
ASSERT_COLUMN_MARKED_FOR_WRITE;
68
if (nr < (double) INT32_MIN)
70
res=(int32_t) INT32_MIN;
73
else if (nr > (double) INT32_MAX)
75
res=(int32_t) INT32_MAX;
79
res=(int32_t) (int64_t) nr;
82
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
90
int Int32::store(int64_t nr, bool unsigned_val)
95
ASSERT_COLUMN_MARKED_FOR_WRITE;
97
if (nr < 0 && unsigned_val)
98
nr= ((int64_t) INT32_MAX) + 1; // Generate overflow
100
if (nr < (int64_t) INT32_MIN)
102
res=(int32_t) INT32_MIN;
105
else if (nr > (int64_t) INT32_MAX)
107
res=(int32_t) INT32_MAX;
116
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
124
double Int32::val_real(void) const
128
ASSERT_COLUMN_MARKED_FOR_READ;
135
int64_t Int32::val_int(void) const
139
ASSERT_COLUMN_MARKED_FOR_READ;
146
String *Int32::val_str(String *val_buffer, String *) const
148
const CHARSET_INFO * const cs= &my_charset_bin;
150
uint32_t mlength= max(field_length+1,12*cs->mbmaxlen);
151
val_buffer->alloc(mlength);
152
char *to=(char*) val_buffer->ptr();
155
ASSERT_COLUMN_MARKED_FOR_READ;
159
length=cs->cset->long10_to_str(cs,to,mlength,-10,(long) j);
160
val_buffer->length(length);
165
int Int32::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
61
int Field_long::store(double nr)
67
ASSERT_COLUMN_MARKED_FOR_WRITE;
69
if (nr < (double) INT32_MIN)
71
res=(int32_t) INT32_MIN;
74
else if (nr > (double) INT32_MAX)
76
res=(int32_t) INT32_MAX;
80
res=(int32_t) (int64_t) nr;
83
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
85
#ifdef WORDS_BIGENDIAN
86
if (table->s->db_low_byte_first)
97
int Field_long::store(int64_t nr, bool unsigned_val)
102
ASSERT_COLUMN_MARKED_FOR_WRITE;
104
if (nr < 0 && unsigned_val)
105
nr= ((int64_t) INT32_MAX) + 1; // Generate overflow
106
if (nr < (int64_t) INT32_MIN)
108
res=(int32_t) INT32_MIN;
111
else if (nr > (int64_t) INT32_MAX)
113
res=(int32_t) INT32_MAX;
120
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
122
#ifdef WORDS_BIGENDIAN
123
if (table->s->db_low_byte_first)
134
double Field_long::val_real(void)
138
ASSERT_COLUMN_MARKED_FOR_READ;
140
#ifdef WORDS_BIGENDIAN
141
if (table->s->db_low_byte_first)
149
int64_t Field_long::val_int(void)
153
ASSERT_COLUMN_MARKED_FOR_READ;
155
/* See the comment in Field_long::store(int64_t) */
156
assert(table->in_use == current_session);
157
#ifdef WORDS_BIGENDIAN
158
if (table->s->db_low_byte_first)
166
String *Field_long::val_str(String *val_buffer,
169
const CHARSET_INFO * const cs= &my_charset_bin;
171
uint32_t mlength= max(field_length+1,12*cs->mbmaxlen);
172
val_buffer->alloc(mlength);
173
char *to=(char*) val_buffer->ptr();
176
ASSERT_COLUMN_MARKED_FOR_READ;
178
#ifdef WORDS_BIGENDIAN
179
if (table->s->db_low_byte_first)
185
length=cs->cset->long10_to_str(cs,to,mlength,-10,(long) j);
186
val_buffer->length(length);
191
int Field_long::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
194
#ifdef WORDS_BIGENDIAN
195
if (table->s->db_low_byte_first)
169
203
longget(a,a_ptr);
170
204
longget(b,b_ptr);
172
return (a < b) ? -1 : (a > b) ? 1 : 0;
175
void Int32::sort_string(unsigned char *to,uint32_t )
177
#ifdef WORDS_BIGENDIAN
179
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
186
to[0] = (char) (ptr[3] ^ 128); /* Revers signbit */
195
void Int32::sql_type(String &res) const
197
const CHARSET_INFO * const cs=res.charset();
198
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "int"));
201
unsigned char *Int32::pack(unsigned char* to, const unsigned char *from, uint32_t, bool)
207
return to + sizeof(val);
211
const unsigned char *Int32::unpack(unsigned char* to, const unsigned char *from, uint32_t, bool)
218
return from + sizeof(val);
221
} /* namespace field */
222
} /* namespace drizzled */
207
return (a < b) ? -1 : (a > b) ? 1 : 0;
210
void Field_long::sort_string(unsigned char *to,uint32_t )
212
#ifdef WORDS_BIGENDIAN
213
if (!table->s->db_low_byte_first)
215
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
223
to[0] = (char) (ptr[3] ^ 128); /* Revers signbit */
231
void Field_long::sql_type(String &res) const
233
const CHARSET_INFO * const cs=res.charset();
234
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "int"));
237
unsigned char *Field_long::pack(unsigned char* to, const unsigned char *from,
239
#ifdef WORDS_BIGENDIAN
247
#ifdef WORDS_BIGENDIAN
248
if (table->s->db_low_byte_first)
249
val = sint4korr(from);
254
#ifdef WORDS_BIGENDIAN
260
return to + sizeof(val);
264
const unsigned char *Field_long::unpack(unsigned char* to, const unsigned char *from, uint32_t,
265
#ifdef WORDS_BIGENDIAN
273
#ifdef WORDS_BIGENDIAN
275
val = sint4korr(from);
280
#ifdef WORDS_BIGENDIAN
281
if (table->s->db_low_byte_first)
286
return from + sizeof(val);