23
#include <drizzled/field/int32.h>
22
#include <drizzled/server_includes.h>
23
#include <drizzled/field/long.h>
24
24
#include <drizzled/error.h>
25
25
#include <drizzled/table.h>
26
26
#include <drizzled/session.h>
40
28
/****************************************************************************
42
****************************************************************************/
44
int Int32::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
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;
54
#ifdef WORDS_BIGENDIAN
55
if (getTable()->getShare()->db_low_byte_first)
57
int4store(ptr, store_tmp);
61
longstore(ptr, store_tmp);
66
int Int32::store(double nr)
72
ASSERT_COLUMN_MARKED_FOR_WRITE;
74
if (nr < (double) INT32_MIN)
76
res=(int32_t) INT32_MIN;
79
else if (nr > (double) INT32_MAX)
81
res=(int32_t) INT32_MAX;
85
res=(int32_t) (int64_t) nr;
88
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
90
#ifdef WORDS_BIGENDIAN
91
if (getTable()->getShare()->db_low_byte_first)
102
int Int32::store(int64_t nr, bool unsigned_val)
107
ASSERT_COLUMN_MARKED_FOR_WRITE;
109
if (nr < 0 && unsigned_val)
110
nr= ((int64_t) INT32_MAX) + 1; // Generate overflow
111
if (nr < (int64_t) INT32_MIN)
113
res=(int32_t) INT32_MIN;
116
else if (nr > (int64_t) INT32_MAX)
118
res=(int32_t) INT32_MAX;
125
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
127
#ifdef WORDS_BIGENDIAN
128
if (getTable()->getShare()->db_low_byte_first)
139
double Int32::val_real(void)
143
ASSERT_COLUMN_MARKED_FOR_READ;
145
#ifdef WORDS_BIGENDIAN
146
if (getTable()->getShare()->db_low_byte_first)
154
int64_t Int32::val_int(void)
158
ASSERT_COLUMN_MARKED_FOR_READ;
160
/* See the comment in Int32::store(int64_t) */
161
#ifdef WORDS_BIGENDIAN
162
if (getTable()->getShare()->db_low_byte_first)
170
String *Int32::val_str(String *val_buffer,
173
const CHARSET_INFO * const cs= &my_charset_bin;
175
uint32_t mlength= max(field_length+1,12*cs->mbmaxlen);
176
val_buffer->alloc(mlength);
177
char *to=(char*) val_buffer->ptr();
180
ASSERT_COLUMN_MARKED_FOR_READ;
182
#ifdef WORDS_BIGENDIAN
183
if (getTable()->getShare()->db_low_byte_first)
189
length=cs->cset->long10_to_str(cs,to,mlength,-10,(long) j);
190
val_buffer->length(length);
195
int Int32::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
198
#ifdef WORDS_BIGENDIAN
199
if (getTable()->getShare()->db_low_byte_first)
211
return (a < b) ? -1 : (a > b) ? 1 : 0;
214
void Int32::sort_string(unsigned char *to,uint32_t )
216
#ifdef WORDS_BIGENDIAN
217
if (!getTable()->getShare()->db_low_byte_first)
219
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
227
to[0] = (char) (ptr[3] ^ 128); /* Revers signbit */
235
void Int32::sql_type(String &res) const
237
const CHARSET_INFO * const cs=res.charset();
238
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "int"));
241
unsigned char *Int32::pack(unsigned char* to, const unsigned char *from,
243
#ifdef WORDS_BIGENDIAN
251
#ifdef WORDS_BIGENDIAN
252
if (getTable()->getShare()->db_low_byte_first)
253
val = sint4korr(from);
258
#ifdef WORDS_BIGENDIAN
264
return to + sizeof(val);
268
const unsigned char *Int32::unpack(unsigned char* to, const unsigned char *from, uint32_t,
269
#ifdef WORDS_BIGENDIAN
277
#ifdef WORDS_BIGENDIAN
279
val = sint4korr(from);
284
#ifdef WORDS_BIGENDIAN
285
if (getTable()->getShare()->db_low_byte_first)
290
return from + sizeof(val);
293
} /* namespace field */
294
} /* namespace drizzled */
30
****************************************************************************/
32
int Field_long::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
38
error= get_int(cs, from, len, &rnd, UINT32_MAX, INT32_MIN, INT32_MAX);
39
store_tmp= (long) rnd;
40
#ifdef WORDS_BIGENDIAN
41
if (table->s->db_low_byte_first)
43
int4store(ptr, store_tmp);
47
longstore(ptr, store_tmp);
52
int Field_long::store(double nr)
58
if (nr < (double) INT32_MIN)
60
res=(int32_t) INT32_MIN;
63
else if (nr > (double) INT32_MAX)
65
res=(int32_t) INT32_MAX;
69
res=(int32_t) (int64_t) nr;
72
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
74
#ifdef WORDS_BIGENDIAN
75
if (table->s->db_low_byte_first)
86
int Field_long::store(int64_t nr, bool unsigned_val)
91
if (nr < 0 && unsigned_val)
92
nr= ((int64_t) INT32_MAX) + 1; // Generate overflow
93
if (nr < (int64_t) INT32_MIN)
95
res=(int32_t) INT32_MIN;
98
else if (nr > (int64_t) INT32_MAX)
100
res=(int32_t) INT32_MAX;
107
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
109
#ifdef WORDS_BIGENDIAN
110
if (table->s->db_low_byte_first)
121
double Field_long::val_real(void)
124
#ifdef WORDS_BIGENDIAN
125
if (table->s->db_low_byte_first)
133
int64_t Field_long::val_int(void)
136
/* See the comment in Field_long::store(int64_t) */
137
assert(table->in_use == current_session);
138
#ifdef WORDS_BIGENDIAN
139
if (table->s->db_low_byte_first)
147
String *Field_long::val_str(String *val_buffer,
150
const CHARSET_INFO * const cs= &my_charset_bin;
152
uint32_t mlength=cmax(field_length+1,12*cs->mbmaxlen);
153
val_buffer->alloc(mlength);
154
char *to=(char*) val_buffer->ptr();
156
#ifdef WORDS_BIGENDIAN
157
if (table->s->db_low_byte_first)
163
length=cs->cset->long10_to_str(cs,to,mlength,-10,(long) j);
164
val_buffer->length(length);
169
int Field_long::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
172
#ifdef WORDS_BIGENDIAN
173
if (table->s->db_low_byte_first)
185
return (a < b) ? -1 : (a > b) ? 1 : 0;
188
void Field_long::sort_string(unsigned char *to,uint32_t )
190
#ifdef WORDS_BIGENDIAN
191
if (!table->s->db_low_byte_first)
193
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
201
to[0] = (char) (ptr[3] ^ 128); /* Revers signbit */
209
void Field_long::sql_type(String &res) const
211
const CHARSET_INFO * const cs=res.charset();
212
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "int"));
215
unsigned char *Field_long::pack(unsigned char* to, const unsigned char *from,
217
#ifdef WORDS_BIGENDIAN
225
#ifdef WORDS_BIGENDIAN
226
if (table->s->db_low_byte_first)
227
val = sint4korr(from);
232
#ifdef WORDS_BIGENDIAN
238
return to + sizeof(val);
242
const unsigned char *Field_long::unpack(unsigned char* to, const unsigned char *from, uint32_t,
243
#ifdef WORDS_BIGENDIAN
251
#ifdef WORDS_BIGENDIAN
253
val = sint4korr(from);
258
#ifdef WORDS_BIGENDIAN
259
if (table->s->db_low_byte_first)
264
return from + sizeof(val);